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?
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).
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?
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
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
Si lo que quieres es eliminar/desactivar tal script, porque quieres desactivar el GameObject?
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>());
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?
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.
void Awake(){
go = GameObject.Find("father");
findobj= go.transform.Find("son").gameObject;
findobj.SetActive(true);
}
prueba a poner go.transform.Find("son").transform.gameObject;