Noticias

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

Como acceder a propiedades

Iniciado por mutoit, Mayo 22, 2017, 02:19:53 PM

Tema anterior - Siguiente tema
Hola, llevo unos  dias trasteando con esto y no me aclaro, agradeceria una explicacion.
 
Imaginemos un gamemanager, donde tiene que saber cuando el player muere,cuanto corre y varias cosas.
 
creo que hay 2 pasos :
 
1- public gameobject para enlazar directamente al objeto del cual requerimos determinado componente. 
 
2-en void start un getcomponent y al que deseamos entrar.
 
Las dudas me vienen porque aveces no tengo que iniciar nada en start, y aveces no consigo entrar en determinada cosa, como el mesh para cambiar el material.
 
En fin, alguien me puede decir como entrar en otro objeto y tomar una propiedad para almacenarla o alterarla ? y porque aveces se tiene que iniciar y otras no ? 
 
 
 
Tomar el metodo o variable de otro script ya se :) 
 
Gracias hasta otra ! 

Cita de: mutoit date=1495455600En fin, alguien me puede decir como entrar en otro objeto y tomar una propiedad para almacenarla o alterarla ? y porque aveces se tiene que iniciar y otras no ? 
   


En la mayoria de los casos vas a entrar a otro objeto mediante un "cast" (raycast, linecast,spherecast, etc) mediante RayCastHit podes sacar el punto de collision, osea el objeto y de ahi le haces getcomponent a lo que quieras.
 
El otro caso se da ya que todo objeto esta registrado por asi decirlo, entonces lo buscar con Find("..."). Si fuera un objeto demasiado importante como el player por ejemplo podes usar un singleton en este (ejemplo componente "Player") y al tener un componente de este podes acceder al objeto desde cualquier lado.
 
Si fuera el caso de un prefab, que hace referencia a otro objeto generalmente se usa un objeto de referencia que puede ser vacio y de ahi se crea una minijerarquia en el que vas buscando padres e hijos, o los haces public y los referencias en el script y luego guardas el prefab con esas referencias. Para cada prefab podes cambiar las referencias.
 
Y si tenes que referenciar muchos prefabs a modo de base de datos usa scriptable objects.

Gracias por la info pero me deja...jodido.
 
No me veo a un gameMAnager (objeto vacio ) haciendo raycast al canvas para modificar un texto cuando el player bla bla bla....
 
Y me sigue la duda...si hago un findobject, en que tipo de variable lo tengo que meter ? gameobject ? y si lo encuentra, tendria que usar esa variable para mediante puntos,acceder a sus componentes ? 
 
:o

Mayo 23, 2017, 01:04:44 AM #3 Ultima modificación: Mayo 23, 2017, 01:06:44 AM por lightbug
Cita de: mutoit date=1495466869No me veo a un gameMAnager (objeto vacio ) haciendo raycast al canvas para modificar un texto cuando el player bla bla bla....
   


Podes tener un manager de UI que tiene info del canvas (una referencia) o quizas sea el padre de dicho canvas (hay muchas posibilidades) y tener tu gameManager en otro lad. Ambos managers son singleton's por ej, entonces podes desde codigo de tu GameManager llamar a metodos de tu UIManager y asi y asi...
 
La idea es que el UIManager tenga toda la info de la capa mas alta en lo relacionado solo a UI y nada mas. Y lo mismo para el GameManager en lo relacionado al juego o gamePlay o aplicacion, como gustes. Pero importante es que el GameManager no toca ningun canvas sino que se comunica con el encargado de hacerlo.
 
Cita de: mutoit date=1495466869Y me sigue la duda...si hago un findobject, en que tipo de variable lo tengo que meter ? gameobject ? y si lo encuentra, tendria que usar esa variable para mediante puntos,acceder a sus componentes ? 
   


Claro, el GameObject.Find te devuelve una referencia a un gameObject entonces haces algo asi:
 

GameObject Player;
Vector3 posicionInicial;   //<-- Dato de interes
ComponenteCustom custom;    //<-- Dato de interes                          
void Awake()
{
if(GameObject.Find("Player")){
   Player = GameObject.Find("Player");
   posicionInicial = Player.transform.position;   //<-- Dato de interes, con transforms no usas getcomponent siempre está!!
   
   if(Player.GetComponent<ComponenteCustom>())
      custom = Player.GetComponent<ComponenteCustom>();   //<-- Dato de interes   con otros componentes siempre tenes que usar getcompoennt
}else {
   print("No hay player!");
}
}

 
saludos

vale muchas gracias ahora si le diste :) 

Etiquetas: