Menu
CoddyTech

GetComponents

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 8 de 50.

GetComponent<T>() devuelve la primera coincidencia. GetComponents<T>() devuelve todas las coincidencias del objeto como una matriz, y GetComponentsInChildren<T>() devuelve todas las coincidencias del objeto y de todo lo que hay debajo. Si T es una interfaz, una sola llamada recopila todas las partes que pueden hacer algo, sea cual sea su clase. Aquí, las máquinas de una fábrica son hijas del objeto Factory, y cada parte que funciona con energía implementa IPowered:

public interface IPowered
{
    void SetPower(bool on);
}
public class Generator : MonoBehaviour
{
    public GameObject factory;

    public void Switch(bool on)
    {
        IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
        foreach (IPowered part in parts)
        {
            part.SetPower(on);
        }
        Debug.Log(parts.Length + " parts powered");
    }
}

Una Lamp enciende su Light, un Fan empieza a girar y un Conveyor empieza a moverse, cada uno en su propio SetPower. Una máquina con una Lamp y un Fan en un mismo objeto cuenta dos veces, ya que cada componente es una coincidencia independiente. Generator nunca los nombra, así que una Siren que implemente IPowered y se añada bajo Factory más adelante se encenderá con la siguiente llamada a Switch.

GetComponentsInChildren incluye el objeto sobre el que lo llamas y omite los hijos inactivos, a menos que pases true: GetComponentsInChildren<IPowered>(true). GetComponents solo busca en un objeto, lo que resulta adecuado para partes que están una al lado de la otra, como una luz y un zumbador en una misma puerta.

challenge icon

Desafío

Fácil

El robot de entrenamiento debería mostrar cada golpe. Health.cs en el Robot cuenta hp, y tres partes pueden reaccionar: Flash en la Head la pone roja, Recoil en el Robot lo sacude hacia atrás y Sparks en la Antenna lanza chispas. La barra espaciadora golpea al robot con 1 y un clic lo golpea con 2 (Trainer.cs, listo). Ahora mismo, Health solo avisa a la cabeza.

  • En IHitReaction.cs, declara una interfaz IHitReaction con un método, void React(int damage).
  • Haz que Flash, Recoil y Sparks la implementen: el método de cada uno pasa a ser React(int damage). Flash hace lo mismo que antes. Recoil sacude el robot hacia atrás 0.5 unidades (+z) por cada punto de daño, y Sparks lanza una chispa por cada punto de daño.
  • En TakeDamage de Health, después de que hp disminuya, llama a React(amount) en cada IHitReaction del Robot y sus elementos secundarios, encontrados con una sola llamada a GetComponentsInChildren, y registra cuántos reaccionaron, como Reactions: 3.

Pulsa Play, golpea al robot con la barra espaciadora y con un clic, y luego pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity