Noticias

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

Buscar un hijo por su nombre

Iniciado por Centauro5legs, Julio 14, 2015, 04:39:50 AM

Tema anterior - Siguiente tema
Julio 14, 2015, 04:39:50 AM Ultima modificación: Junio 01, 2016, 12:40:58 AM por pioj
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!

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



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.

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Y x k no biscais en la lista mediante predicados?


Julio 16, 2015, 07:55:35 PM #7 Ultima modificación: Julio 16, 2015, 07:56:42 PM por GSG3D
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);
      }
   }
}

Julio 16, 2015, 07:57:25 PM #8 Ultima modificación: Julio 16, 2015, 08:29:21 PM por H@pesend

GetComponentsInChildren<Transform> ().ToList().Find (x => x.gameObject.name.Equals("Head"));

el predicado es la expresion lambda embebida en el find. @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"....

Julio 19, 2015, 08:51:08 AM #9 Ultima modificación: Julio 19, 2015, 08:52:33 AM por H@pesend
[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 http://unityspain.com/profile/26542-hpesend/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F15706-buscar-un-hijo-por-su-nombre%252F" title="Go to H@pesend's profile" id="ips_uid_4" style="box-sizing: border-box; color: inherit; text-decoration: none; background-color: transparent;" href="<___base_url___>/profile/26542-hpesend/">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. 

Etiquetas: