Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Añadir componente con diferentes constructores

Iniciado por ecko, Noviembre 20, 2017, 05:12:10 PM

Tema anterior - Siguiente tema
Noviembre 20, 2017, 05:12:10 PM Ultima modificación: Noviembre 20, 2017, 07:35:56 PM por pioj
Hola  a todos, quería comentar una duda simple que creo que puede ayudar a mas gente aparte de  mi, la duda es la siguiente:
    Si creo una clase, ej:    
  
 

 public class Misil(){
        var posIni:Vector3;
       var  distancia:float;
       var objetivo:GameObject;
        public function Misil(PosIni : Vector3,Distancia : float){
            this.posIni=PosIni;
            this.Distancia=Distancia;
            this.objetivo=null;
        }
        public function Misil(PosIni : Vector3,Objetivo : GameObject){
            this.posIni=PosIni;
            this.Distancia=;
            this.objetivo=Objetivo;
        }
    }

 
    Como veis tiene 2 constructores dependiendo de los parametros de entrada, entonces si ahora quiero crear un nuevo objeto y añadirle esta clase hago lo siguiente:  
 



   
       var vObjeto=Resources.Load("Objetos\misil"",Transform);
   

[/quote]
 
                Aquí viene la duda,segun unity se añade un componente de esta forma:    
 



   
          objeto.AddComponent(Misil);
   

[/quote]
 
    Pero yo necesito instanciarla según me interese creandola con un constructor u otro, así que necesitaría hacer esto:        
      
 



   
       objeto.AddComponent(New Misil(vPosIni,50));
   

[/quote]
 
    Esto es posible de hacer?.

Hasta donde sé, no se puede instanciar de esa manera un componente, primero tienes que añadirlo al objeto y luego puedes llamar las funciones que se te antoje.

Cita de: ecko date=1511194330 objeto.AddComponent(Misil);
   


Eso te anduvo? Con add component básicamente registras un componente en el sistema de Unity con todo lo que eso implica.
 
Si necesitas inicializar una clase generica de varias maneras podés usar constructores diferentes como proponés, pero no te debería funcionar al agregar un componente de Unity.. y si tenés un componente de Unity cualquiera (Ej misil un monobehaviour), podés crear uno o más métodos de inicialización, igual a como lo tenés en tu código pero siendo métodos publicos y no constructores, entonces a la hora de inicializar llamás al método que desees, te van a aparecer las diferentes signatures (creo que así se llaman a las multiples declaraciones)
 
 

    

Primero tienes que tomar en cuenta que unity no usa programación orientada a objeto. Cuando agregas un script a un GameObject este va a funcionar como un componente y no como una clase.
 
Aclaro que si puedes usar clases, herencia, polimorfismo, sobrecarga de constructores y todo lo demás, pero no te lo recomiendo, porque unity simplemente no reconoce algo tan básico como la herencia, si planeas exportar pakage de un proyecto y tienes herencia, unity va ignorar las clases padre y va a exportar de manera parcial solo los hijos eso te puede dar problemas.
 
Yo te recomiendo que crees un script(monobehaviour) con la lógica del misil, lo agregues a un misil prefabricado (GameObject) y luego lo instacies le sacas el componente(con mi_misil = GetCompenet<misil>()) y lo inicializas usando un método sobrecargado (mi_misil.modo(x,y) o mi_mision.modo(x) ).

quizas con InjectionContructor...
 
 
 
....pero lo mas sencillo es crear dos metodos "setup" en vez de dos contructores.... 
 
asi simplemente lo instancias normal...
 
y luego le pasas los valores al "setup"
 

GameObject miMisil = (GameObject)Instantiate(misil, transform.position, transform.rotation);
miMisil.Setup(valor1, valor2);

 
 

Gracias chicos! era una duda que tenía de hace tiempo, hasta ahora lo hacía como comentabais, creando el objeto y luego acceder al componente para inicializar valores y a través de una función inicializadora (esta me gustó bastante :)) lo dicho mas bien era de aclaración y para dejar el código "mas limpio"

Etiquetas: