Menu
CoddyTech

GetComponents

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 9 de 64.

GetComponent<T>() devuelve la primera coincidencia. GetComponents<T>() devuelve todas las coincidencias del objeto en forma de matriz, y GetComponentsInChildren<T>() devuelve todas las coincidencias del objeto y de todo lo que hay debajo de él. 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 lo hace en su propio SetPower. Una máquina con una Lamp y un Fan en el 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 más adelante bajo Factory se encenderá con la siguiente llamada a Switch.

GetComponentsInChildren incluye el objeto sobre el que lo llamas y omite los objetos secundarios que estén inactivos, a menos que le pases true: GetComponentsInChildren<IPowered>(true). GetComponents solo examina ese objeto, lo que resulta útil para las partes que están una al lado de la otra, como una luz y un timbre en una misma puerta.

challenge icon

Desafío

Fácil

Haz que cada parte del robot reaccione al recibir un golpe.

  1. En IHitReaction.cs, declara public interface IHitReaction con void React(int damage);.
  2. Haz que Flash, Recoil y Sparks implementen esta interfaz: cambia el nombre de cada método a public void React(int damage).
  3. Recoil se mueve hacia atrás 0.5f * damage; Sparks lanza damage chispas.
  4. En TakeDamage, llama a React(amount) en cada elemento de GetComponentsInChildren<IHitReaction>() y después registra Reactions: 3 (su cantidad).

Pulsa «Jugar», pulsa la barra espaciadora y después haz clic. Luego, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

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

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

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity