Cuando trabajas con varios GameObjects relacionados en Unity, configurar arrays manualmente en el inspector se vuelve frágil: basta con olvidar arrastrar un objeto para que tu juego se empaquete con un bug. La jerarquía de hijos y padres te ofrece una alternativa elegante para recorrer GameObjects como si fueran un array, sin riesgo de olvidar elementos.
Esto es clave si estás construyendo selectores de niveles, rutas de patrullaje, waypoints o cualquier sistema donde un conjunto de objetos deba mantenerse ordenado y completo.
Por qué usar la jerarquía en lugar de un array manual
La jerarquía aprovecha la relación padre-hijo que ya existe entre tus GameObjects en la escena. Si un objeto es hijo de otro, automáticamente forma parte de su "colección".
Imagina un selector de niveles tipo Donkey Kong: una isla con banderitas que marcan cada nivel. Si tienes un GameObject vacío llamado Levels y todas las banderas son sus hijas, no necesitas arrastrar nada al inspector. Cuando duplicas una bandera y la pones en su lugar, ya queda incluida en el recorrido [02:08].
¿Qué ventaja tiene usar la jerarquía sobre un array público? Que nunca olvidas asignar objetos. Si un GameObject es hijo del padre, ya forma parte del recorrido sin configuración extra.
Cómo acceder a los hijos de un GameObject desde un script
Toda la estructura jerárquica vive en el componente transform. Por eso, los métodos para navegarla parten de ahí.
Acceder a un hijo por índice con GetChild
El método transform.GetChild(i) te devuelve el hijo en la posición que indiques. Funciona igual que un array: el primer hijo es el índice 0, el segundo el 1, y así sucesivamente.
csharp
Debug.Log(transform.GetChild(2).name);
Este código imprimiría el nombre del tercer hijo, por ejemplo Flag 2 [04:42].
Recorrer todos los hijos con childCount
Para saber cuántos hijos tiene un transform usas transform.childCount, equivalente a array.length. Con eso puedes armar un for clásico:
csharp
for (int i = 0; i < transform.childCount; i++) {
Debug.Log(transform.GetChild(i).name);
}
Una versión más limpia es usar foreach directamente sobre el transform:
csharp
foreach (Transform child in transform) {
Debug.Log(child.name);
}
Acceder a un hijo por su nombre con Find
Si conoces el nombre del GameObject, puedes usar transform.Find("BossFinal"). Es poderoso, pero ojo: si renombras el objeto, el código se rompe. Úsalo con cuidado [06:15].
¿Cuándo conviene usar Find en lugar de GetChild? Cuando el orden de los hijos puede cambiar pero el nombre se mantiene estable. Para recorridos secuenciales, GetChild es más seguro.
Cómo mover un personaje entre niveles usando la jerarquía
Con la jerarquía lista, puedes hacer que un personaje viaje punto por punto. La idea es guardar el nivel actual en una variable y avanzar al presionar una tecla.
El flujo básico necesita tres piezas:
- Una variable pública
currentLevel que arranca en 0.
- Una variable pública
player que referencia al GameObject del personaje.
- Un Update que detecta
Input.GetKeyDown(KeyCode.RightArrow) y avanza el índice.
La línea clave es asignar la posición:
csharp
player.transform.position = transform.GetChild(currentLevel).position;
Fíjate que GetChild devuelve un transform, no un Vector3. Por eso tienes que pedirle su .position al final, o Unity te lanzará un error de tipado [09:47].
Evitar el error de índice fuera de rango
Si currentLevel supera la cantidad de hijos, el juego revienta. La protección es simple: solo incrementa si currentLevel < transform.childCount - 1 antes de avanzar.
Cómo hacer que el movimiento sea suave con Lerp
Teletransportar al personaje funciona, pero se siente rígido. La solución es interpolar la posición usando Lerp, que ya viste en clases anteriores.
Lerp necesita tres ingredientes para funcionar:
- Una posición de inicio (donde está el personaje al iniciar el movimiento).
- Una posición destino (la bandera del siguiente nivel).
- Un tiempo transcurrido que avanza con un contador en Update.
En el ejemplo, el script Teddy expone un método MoverseA(Vector3 destino) que guarda el target, captura la posición inicial y resetea el contador de tiempo. El Update del Teddy se encarga de interpolar frame a frame [12:30].
Entonces, en el Explorador de niveles, en lugar de asignar directamente transform.position, llamas a teddy.MoverseA(transform.GetChild(currentLevel).position) y el personaje flota suavemente hacia cada bandera.
Qué pasa cuando agregas un nuevo nivel sin tocar el código
Aquí está la magia de usar la jerarquía. Si duplicas una bandera y la arrastras al lugar correcto dentro del padre Levels, el personaje ya puede visitarla sin que toques una sola línea de código.
Solo importa el orden dentro de la jerarquía: el índice 0 es el primero, el último hijo es el final del recorrido. Si te equivocas de orden, basta con reordenar los hijos en el panel de jerarquía y listo [14:50].
Como ejercicio, intenta extender el código para que la tecla izquierda permita retroceder a niveles ya visitados. La lógica es la misma, pero decrementando currentLevel y validando que no sea menor que cero. Cuéntame en los comentarios cómo te fue con tu solución.