Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: gregory gregory en Mayo 30, 2017, 12:10:10 AM

Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: gregory gregory en Mayo 30, 2017, 12:10:10 AM
hola amigos  estoy tratando buscar el gameobject  cuando esta desactivado con Gameobject.Find() pero me dice null como podría encontrar  al gameobject sin necesidad de activarlo, he estado buscando pero no me sale mucho ¿que me recomienda?
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: lightbug en Mayo 30, 2017, 02:46:44 AM
Cuando desactivas el gameObject desactivas junto con el todo comportamiento en runtime, el monobehaviour, es decir que salvo que otro objeto tenga una referencia previe de él no lo vas a poder encontrar con el find. Lo que podes hacer es previamente referenciarlo, en el mismo inspector (activado o no) de el otro objeto, quien sera encargado de activarlo......  o en Enable/Awake/Start usas el GameObject.Find para tener la referencia (tiene que estar activado), y luego haces lo que quieras, por ejemplo desactivas con SetActive(false).
 
 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: gregory gregory en Mayo 31, 2017, 04:34:29 AM
hola amigo gracias por atender otra vez en mi necesidad de la ayuda, por lo que pude leer a tu respuesta creo que entendí así de esta manera, hay que colocarlo dentro de otro objecto y después buscarlo 
 
      
 

   GameObject  go;
GameObject findobj;
void Awake(){
   go = GameObject.Find("father");
   findobj= go.transform.Find("son").gameObject;
   findobj.SetActive(true);
}

 


 
 
 
 
pero, sí  esta  nada más la escena y ademas  no quiero colocarlo en un GameObject Empty  como hago para encontrarlo con el scrpit en la escena ¿se podría hacer o no?
 
 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: lightbug en Mayo 31, 2017, 01:07:07 PM
Cita de: gregory gregory date=1496198069por lo que pude leer a tu respuesta creo que entendí así de esta manera, hay que colocarlo dentro de otro objecto y después buscarlo 
   


No, no colocarlo dentro de nada, podes crear varias variables de tipo GameObject y todas referenciarlas a un solo GameObject instanciado, osea creado en tu escena. La idea es crear una de esas variables, decirle que se fije en el objeto en cuestion y listo, ya tenes que dicha variable tiene toda la info requerida, puede activarlo, desactivarlo, cambiar el nombre, etc... Lo podes hacer de las siguientes dos formas, la primera es la mas comun que todos hacen, y la mas enfocada al diseñador, arrastras el objeto al casillero y listo. La segunda te la mencioné antes porque mencionaste el Find y pense que te interesaba eso.
 
1° :
 

public GameObject tuObjdeInteres;

 
2° :
 

GameObject tuObjDeInteres;   //una variable vacia
void OnEnable()
{
tuObjDeInteres = GameObject.Find("Tu Objeto");   //el objeto DEBE estar activado, sino no lo encuentra
}

 
Ojo yo supongo que Find no encuentra objetos inactivos, aunque hoy en dia es increible que esto siga asi, habia post viejos en los foros oficiales de Unity de gente pidiendolo, la verdad ya ni uso Find.
 
saludos
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: gregory gregory en Mayo 31, 2017, 03:17:55 PM
pues la forma 1)  no me sirve ni la 2)  por que yo  quiero destruir el script y colocarlo otra vez al mismo objeto entonces cuando el script es añadido al public GameObject  tuObjdeinteres  que fue arrastrado el objecto queda none y  sale otra vez Null Reference y con el que no esta publico tienes que activarlo antes para encontrarlo, allí  es donde cea el problema, quiero que el objeto este inactivo y sale Null Reference , por eso pensé en el scrpit que coloque al principio por esto que dijiste 
 



   
       es decir que salvo que otro objeto tenga una referencia previe de él no lo vas a poder encontrar con el find
   

[/quote]
 
>>GameObject Empty  (father)  activado 
 
>>>>>> GameObject objfind (son)  desactivado 
 
de esta forma si me sirve para encontrarlo con el find(), pero quiero saber si es posible también encontrarlo solo con la escena 
 
 
 
>>scena  (father) 
 
>>>>>> GameObject objfind (son) desactivado 
 
pero hay si  no se como  encontrar la scena con un script  
 
 
 
 
 
 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: GSG3D en Mayo 31, 2017, 04:06:08 PM
Si lo que quieres es eliminar/desactivar tal script, porque quieres desactivar el GameObject?
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: lightbug en Junio 01, 2017, 12:04:01 AM
Cita de: gregory gregory date=1496236675por que yo  quiero destruir el script y colocarlo otra vez al mismo objeto entonces cuando el script es añadido al public GameObject  tuObjdeinteres  que fue arrastrado el objecto queda none y  sale otra vez Null Reference y con el que no esta publico tienes que activarlo antes para encontrarlo
   


Ah pero entonces lo que queres no es lo que mencionaste a lo primero, Destruir e inhabilitar un script vs un gameObject son dos cosas muy distintas.
 
Si te manejas de padre e hijo (como supongo que tenes una jerarquia de cosas) lo mejor es "buscar hijos" para tener las referencias a los hijos o buscar los componentes en los hijos.
 
Si buscas componentes podes buscarlos incluso en los hijos inhabilitados, lee las referencias:
 
https://docs.unity3d.com/ScriptReference/GameObject.GetComponentsInChildren.html (https://docs.unity3d.com/ScriptReference/GameObject.GetComponentsInChildren.html)
 
Si queres buscar directamente hijos, lo mejor es tener tu child count e iterar con un for, o simplemente con un foreach (ya Unity trae una definicion para los transform's hijos para el foreach)
 

foreach(Transform child in transform)
{
//iteracion hijo a hijo
child.position = ....;   //por ej
}

 
Si queres desactivar un script tenes que obtener el componente:
 

objDeInteres.GetComponent<NombreDelScrip>().enabled = false;

 
  Si lo queres destruir:
 

Destroy(objDeInteres.GetComponent<NombreDelScript>());

 
 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: gregory gregory en Junio 02, 2017, 01:00:01 AM
Ok gracias por decirme eso, pero eso de Destroy ya lo sabia y lo add para un scrpit, por eso no lo había mencionado anteriormente por que realmente ese no era  problema que tenia, si no que era el ¿porque? no se podría encontrar el objeto inhabilitado solo con en find, pero con ese foreach si podría  encontrar a la escena como father y a cualquier gameObject como Chlid? 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: lightbug en Junio 02, 2017, 01:29:11 AM
Cita de: gregory gregory date=1496358001... si no que era el ¿porque? no se podría encontrar el objeto inhabilitado solo con en find
   


La verdad es hasta el dia de hoy que me pregunto lo mismo, se deberia encontrar aunque esté inhabilitado, pero que se yo, la cuestion es que no se puede, igual el Find es super ineficiente de hacer sobretodo a nivel de codigo, queda feo en mi opinion, esta bien si tenes pocas cosas, tenes que poner el nombre exacto, y encima recorrer todos los gameObjects, te repito lo mejor es elegir tus gameObjects por otros medios, como referencias public, o mediante jerarquia (padres/hijos), esta ultima es la principal razon por la que sea crean padres e hijos, no solo para "mover uno y mover otro a la vez", sobre todo si estas en un contexto de UI es muy util, no tenes que andar usando el Find, simplemente le decis que recorra los hijos y si tiene tal componente que lo guarde como referencia, y luego lo usas. Esto funciona con objetos habilitados e inhabilitados (si, parece chisten pero en el buscardor de componentes tenes la opcion de buscar inhabilitados)
 
Cita de: gregory gregory date=1496358001... pero con ese foreach si podría  encontrar a la escena como father y a cualquier gameObject como Chlid? 
   


ehh...no entendi muy bien con eso de "encontrar a la escena como padre" ?¿? , que sea padre e hijo no cambia nada, es decir, el motor tiene una lista de gameObjects "registrados", vos ahi buscas los activos (con el Find). cada gameObject tiene un transform, es decir que tiene un parent (null = no tiene padre) y de ahi buscas tus referencias.
 
 
Título: como encontrar un Gameobject desactivado o inhabilitado con un script
Publicado por: ecko en Junio 02, 2017, 03:12:20 PM

void Awake(){
   go = GameObject.Find("father");
   findobj= go.transform.Find("son").gameObject;
   findobj.SetActive(true);
}

 
prueba a poner go.transform.Find("son").transform.gameObject;