Menu
CoddyTech

GetComponents

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 9 de 64.

GetComponent<T>() retorna a primeira correspondência. GetComponents<T>() retorna todas as correspondências no objeto como um array, e GetComponentsInChildren<T>() retorna todas as correspondências no objeto e em tudo que está abaixo dele. Com uma interface como T, uma chamada reúne todas as partes que conseguem fazer algo, independentemente da classe. Aqui, as máquinas de uma fábrica são filhas do objeto Factory, e cada parte que funciona com energia 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");
    }
}

Uma Lamp aciona sua Light, um Fan começa a girar, um Conveyor começa a se mover, cada um em seu próprio SetPower. Uma máquina com uma Lamp e um Fan no mesmo objeto conta duas vezes, já que cada componente é uma correspondência separada. O Generator nunca os menciona pelo nome; portanto, uma Siren que implemente IPowered e seja adicionada sob Factory mais tarde será ligada na próxima chamada de Switch.

GetComponentsInChildren inclui o objeto em que você o chama e ignora os filhos inativos, a menos que você passe true: GetComponentsInChildren<IPowered>(true). GetComponents verifica apenas um objeto, o que é adequado para partes que ficam lado a lado, como uma luz e uma campainha na mesma porta.

challenge icon

Desafio

Fácil

Faça com que todas as partes do robô mostrem quando ele é atingido.

  1. Em IHitReaction.cs, declare public interface IHitReaction com void React(int damage);.
  2. Faça Flash, Recoil e Sparks implementarem essa interface: renomeie cada método para public void React(int damage).
  3. Recoil move-se para trás em 0.5f * damage; Sparks lança damage faíscas.
  4. Em TakeDamage, chame React(amount) em cada GetComponentsInChildren<IHitReaction>() e, em seguida, registre Reactions: 3 (a quantidade).

Pressione “Jogar”, pressione Espaço e, em seguida, clique. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

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

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

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity