Ok, como dice el titulo; ¿Cómo puedo buscar un hijo por su nombre en lugar de su index?..... pero en Unity... para que me entiendan; Tengo un GameObject llamado "Body", y dentro de el tengo cuatro GameObject llamados "Head", "Plate", "Pants" y "Boots", y dentro de "Head" tengo otro "GameObject" llamado "Hair". Como puedo llamarlo, no por su index, sino por su nombre. Esto es debido a que por la estructura de mi proyecto, no puedo depender de los indices ya que están constantemente cambiando.
//--- Tengo este codigo pero obviamente no me funciona ---//
rend = (gameObject).transform.GetChild ("Head").Find ("Hair").GetComponent<Renderer> ();
//--- ---//
[/quote]
Puedes simplemente buscar un objeto por su nombre;
rend = GameObject.Find("Nombre");
Si tienes varios objetos con el mismo nombre te dará el primero que encuentre. También puedes buscar en todos los hijos haciendo bucles;
GameObject rend;
void Start () {
for(int i = 0; i< transform.childCount; i++){
if(transform.getChild(i).name == "Nombre"){
rend = transform.getChild(i);
}
}
}
Claro que se complica si tienes muchos hijos de hijos, teniendo que comprobar en cada Transform si tiene hijo.
Si necesitas buscas en hijos de hijos deberas utilizar recursividad, es decir, que una funcion se invoque a si misma.
Si es un nombre unico puedes hacer como te ha dicho el compañero: GameObject.Find
Un saludo!
Mira, yo eh creado varias herramientas donde debía utilizar esto, jamas hice uso de recursividad, creo que era de la siguiente manera.
Transform ReferenceObject;
List<Transform> AllObjects = new List<Transform>();
foreach(Transform ReferenceA in ReferenceObject)
{
AllObjects.add(ReferenceA);
foreach(Transform ReferenceB in ReferenceObject)
{
AllObjects.add(ReferenceB);
}
}
Creo que de esta manera ya tomas todos los Hijos de Hijos! y si no creas una función local y asignas el objeto actual y buscas hijos en el, y así consecutivamente sin usar recursividad, que de echo no lo recomiendo.
Suerte!
Bueno, no usas recursividad como tal porque solo tomas Hijos de hijos, es decir , haces 2 bucles iguales, uno para hijos y otro para hijos de hijos, quiero decir estrictamente no estas usando recursividad pero estas haciendo lo mismo ya que tu codigo puede facilmente reescribirse como una funcion recursiva.
lo que tu escribiste se puede hacer en 1 funcion que cada Reference la llame, lo unico que tu has echo es limitarlo a hijos de hijos cuando haciendolo como yo te digo lo buscarias en hijos de hijos de hijos de...... Infinito.
¿Es por esto que estrictamente no usas recursividad pero ahora yo te digo, y si quieres buscar hasta en 5 niveles de hijos?
Tendrias que escribir 5 bucles como los que has escrito (En vez de 2) => Resumiendo en vez de escribir 5 bucles podrias escribir una unica funcion recursiva para X niveles de hijos.
Al final si que estas usando recursividad solo que muy simplificada, por eso no lo parece.
Un saludo, espero haberme explicado.
Y x k no biscais en la lista mediante predicados?
"predicados"? Explícate ...
Yo lo haria asi...no se si esta bien pero en mi cabeza funciona, wow xD
public Transform obj;
public string name;
public Transform objWithName;
void Start()
{
findChild (obj, name, ref objWithName);
}
void findChild(Transform obj, string name, ref Transform objWithName)
{
for(int index = 0; index < obj.childCount; index++)
{
if(obj.GetChild(index).name == name)
{
objWithName = obj.GetChild(index).transform;
break;
}
if(obj.childCount > 0)
{
findChild (obj.GetChild(index).transform, name, ref objWithName);
}
}
}
GetComponentsInChildren<Transform> ().ToList().Find (x => x.gameObject.name.Equals("Head"));
el predicado es la expresion lambda embebida en el find. @pioj (http://unityspain.com/profile/18485-pioj/), bueno, pensandolo mejor, el predicado es la expresion embebida en el metodo Find... ya sea lo que sea...
P.D.: se me olvidaba que tienes que añadir "Using System.Linq"....
[quote author=Centauro5legs" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15706" data-ipsquote-contentcommentid="100291"> //--- Tengo este codigo pero obviamente no me funciona ---//rend = (gameObject).transform.GetChild ("Head").Find ("Hair").GetComponent<Renderer> ();//--- ---//[/quote]
No me habia leido ni la linea que querias hacer... espero que te funcione asi...
Es un buena idea
H@pesend no me había dado cuenta de hacerlo de esta manera. Estas funciones lambda me han salvado tanto con la antigua GUI de unity :).
[quote author=ProgramacionWH" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15706" data-ipsquote-contentcommentid="100365 date=1437055729]Bueno, no usas recursividad como tal porque solo tomas Hijos de hijos, es decir , haces 2 bucles iguales, uno para hijos y otro para hijos de hijos, quiero decir estrictamente no estas usando recursividad pero estas haciendo lo mismo ya que tu codigo puede facilmente reescribirse como una funcion recursiva. lo que tu escribiste se puede hacer en 1 funcion que cada Reference la llame, lo unico que tu has echo es limitarlo a
hijos de hijos cuando haciendolo como yo te digo lo buscarias en
hijos de hijos de hijos de...... Infinito. ¿Es por esto que estrictamente no usas recursividad pero ahora yo te digo, y si quieres buscar hasta en 5 niveles de hijos? Tendrias que escribir 5 bucles como los que has escrito (En vez de 2) => Resumiendo en vez de escribir 5 bucles podrias escribir una unica funcion recursiva para X niveles de hijos.Al final si que estas usando recursividad solo que muy simplificada, por eso no lo parece. Un saludo, espero haberme explicado.[/quote]Si quieres buscar mas hijos vas agregando el Root en un temporal y accedes con los dos bucles, tendrías 2 variables mas, LastRoot y Root y con eso trabajaría perfecto.
La recursividad es muy mala para la programacion en "Juegos", en principio por que es muy fácil crear un
overflow y segundo, por que es sumamente anti estético un código con funciones recursivas. De todos modos esto va en cada uno, haz la prueba, crea un bucle de iteracion con un Transforms y el primer nivel de hijos con otro bucle y luego hazlo con una recursividad y míralo en el inspector, y veras de que hablo.