Resumen

Configurar arrays manualmente en el inspector de Unity es un proceso propenso a errores: basta con olvidar arrastrar un solo GameObject para introducir un bug silencioso en tu proyecto. Existe una técnica mucho más robusta que aprovecha la jerarquía padre-hijo de los GameObjects, permitiéndote tratar los hijos de un objeto como si fueran elementos de un array, sin necesidad de configurar nada extra cada vez que agregues o elimines un elemento.

¿Cómo funciona la jerarquía padre-hijo en Unity?

Cuando un GameObject contiene otros GameObjects como hijos, estos quedan organizados automáticamente por orden en la jerarquía. Cada hijo tiene un índice (cero, uno, dos, tres...) exactamente igual que en un array convencional. Esto significa que puedes acceder a cualquiera de ellos por su posición sin necesidad de arrastrarlos manualmente a un campo del inspector [1:55].

En el ejemplo práctico se crea un GameObject vacío llamado levels y dentro se colocan varias banderas como hijos. Cada bandera representa un nivel que el jugador debe visitar en orden, similar al selector de niveles de Donkey Kong.

¿Qué es transform.GetChild y cómo se usa?

El método transform.GetChild permite acceder a un hijo específico mediante su índice [3:48]. Toda la jerarquía se basa en el Transform del objeto, así que la sintaxis es:

csharp transform.GetChild(2); // accede al tercer hijo (índice 2)

Para recorrer todos los hijos, necesitas saber cuántos hay. Aquí entra transform.childCount, que cumple la misma función que array.Length [4:28]:

csharp for (int i = 0; i < transform.childCount; i++) { Debug.Log(transform.GetChild(i)); }

También existe una forma más abreviada usando foreach [5:55]:

csharp foreach (Transform child in transform) { Debug.Log(child); }

¿Se puede acceder a los hijos por nombre?

Sí, mediante transform.Find puedes buscar un hijo por su nombre [5:10]:

csharp transform.Find("boss final");

Sin embargo, este método requiere precaución. Si cambias el nombre del GameObject en la jerarquía y no actualizas el código, se romperá la referencia. Úsalo solo cuando estés seguro de que el nombre no cambiará.

¿Cómo mover un jugador entre niveles usando la jerarquía?

El script explorador de niveles se asigna al GameObject padre que contiene todas las banderas. Se declara una variable currentLevel que empieza en cero y un GameObject player que representa al personaje [6:30].

Al presionar la tecla derecha, se incrementa currentLevel y se actualiza la posición del jugador:

csharp if (Input.GetKeyDown(KeyCode.RightArrow)) { currentLevel++; if (currentLevel < transform.childCount - 1) { player.transform.position = transform.GetChild(currentLevel).position; } }

Un detalle importante: GetChild devuelve un Transform, no un Vector3. Por eso es necesario agregar .position al final para obtener las coordenadas [7:40].

¿Cómo lograr un movimiento suave con Lerp?

Teletransportar al personaje resulta brusco visualmente. Para suavizar el desplazamiento se utiliza Lerp, que interpola entre dos posiciones a lo largo del tiempo [8:50]. Se crea un script separado llamado Teddy con un método MoverseA que recibe la posición destino:

  • Se guarda la posición inicial del personaje al invocar el método.
  • Se define el target como la nueva posición.
  • Un contador de tiempo en el Update controla la progresión de la interpolación.

El Lerp necesita tres valores: un punto de inicio, un punto final y un valor de tiempo entre 0 y 1. Con esto, el personaje se desplaza de forma fluida entre las banderas.

¿Por qué esta técnica es mejor que configurar arrays manualmente?

La gran ventaja es que agregar un nuevo nivel es tan simple como duplicar un hijo y posicionarlo en la jerarquía [9:50]. No hace falta tocar ningún script ni arrastrar nada al inspector. Si el orden no es correcto, basta con reordenar los hijos en la jerarquía de Unity y el recorrido se actualiza automáticamente.

Esto elimina el riesgo de olvidar configurar un elemento y empaquetar el juego con un bug. Cada vez que necesites una colección dinámica de GameObjects que comparten un propósito, considera usar la jerarquía padre-hijo en lugar de un array manual.

Como ejercicio, intenta implementar el movimiento hacia la izquierda para que el personaje pueda retroceder a niveles ya visitados. Comparte tu solución en los comentarios.