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.
Desafio
FácilFaça com que todas as partes do robô mostrem quando ele é atingido.
- Em
IHitReaction.cs, declarepublic interface IHitReactioncomvoid React(int damage);. - Faça
Flash,RecoileSparksimplementarem essa interface: renomeie cada método parapublic void React(int damage). - Recoil move-se para trás em
0.5f * damage; Sparks lançadamagefaíscas. - Em
TakeDamage, chameReact(amount)em cadaGetComponentsInChildren<IHitReaction>()e, em seguida, registreReactions: 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity