Menu
CoddyTech

GetComponents

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 8 de 50.

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 podem fazer algo, qualquer que seja sua 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, uma 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, pois cada componente é uma correspondência separada. O Generator nunca os nomeia, então uma Siren que implementa IPowered, adicionada abaixo de 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 examina apenas um objeto, o que é útil para partes que ficam lado a lado, como uma luz e uma campainha na mesma porta.

challenge icon

Desafio

Fácil

O robô de treinamento deve mostrar cada golpe. Health.cs no Robot contabiliza hp, e três partes podem reagir: Flash na Head fica vermelha, Recoil no Robot o empurra para trás, e Sparks na Antenna solta faíscas. A tecla de espaço atinge o robô com força 1 e um clique o atinge com força 2 (Trainer.cs, pronto). No momento, Health avisa apenas a cabeça.

  • Em IHitReaction.cs, declare uma interface IHitReaction com um método, void React(int damage).
  • Faça Flash, Recoil e Sparks implementarem essa interface: o método de cada um passa a ser React(int damage). Flash faz o que já fazia. Recoil empurra o robô para trás 0.5 unidades (+z) por ponto de dano, e Sparks solta uma faísca por ponto de dano.
  • Em TakeDamage de Health, depois que hp diminuir, chame React(amount) em cada IHitReaction no Robot e em seus filhos, encontrados com uma chamada a GetComponentsInChildren, e registre quantos reagiram, como Reactions: 3.

Pressione Jogar, atinja o robô com a tecla de espaço e com um clique, depois Verificar.

Experimente você mesmo

using UnityEngine;

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

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

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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