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.
Desafio
FácilO 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
IHitReactioncom 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
TakeDamagede Health, depois que hp diminuir, chameReact(amount)em cada IHitReaction no Robot e em seus filhos, encontrados com uma chamada a GetComponentsInChildren, e registre quantos reagiram, comoReactions: 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();
}
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens