GetComponents
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 8 di 50.
GetComponent<T>() restituisce la prima corrispondenza. GetComponents<T>() restituisce ogni corrispondenza sull'oggetto come array, mentre GetComponentsInChildren<T>() restituisce ogni corrispondenza sull'oggetto e su tutto ciò che si trova al di sotto. Con un'interfaccia come T, una chiamata raccoglie ogni parte in grado di fare qualcosa, qualunque sia la sua classe. Qui le macchine di una fabbrica sono figlie dell'oggetto Factory e ogni parte alimentata 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 Lampada accende la propria luce, un Ventilatore inizia a girare, un Nastro trasportatore inizia a muoversi, ciascuno nel proprio SetPower. Una macchina con una Lampada e un Ventilatore sullo stesso oggetto conta due volte, poiché ogni componente è una corrispondenza distinta. Il Generator non li nomina mai, quindi una Sirena che implementa IPowered, aggiunta in seguito sotto Factory, viene attivata alla chiamata successiva di Switch.
GetComponentsInChildren include l'oggetto su cui lo chiami e salta i figli inattivi, a meno che tu non passi true: GetComponentsInChildren<IPowered>(true). GetComponents esamina solo l'oggetto stesso, cosa utile per componenti affiancati, come una luce e un cicalino sulla stessa porta.
Sfida
FacileIl robot di addestramento dovrebbe mostrare ogni colpo. Health.cs sul Robot conta hp e tre parti possono reagire: Flash sulla Head la rende rossa, Recoil sul Robot lo spinge all’indietro e Sparks sull’Antenna lancia scintille. La barra spaziatrice colpisce il robot con forza 1 e un clic lo colpisce con forza 2 (Trainer.cs è pronto). Al momento Health avvisa solo la testa.
- In IHitReaction.cs, dichiara un’interfaccia
IHitReactioncon un metodo,void React(int damage). - Fai implementare l’interfaccia a Flash, Recoil e Sparks: il metodo di ciascuno diventa
React(int damage). Flash fa ciò che faceva prima. Recoil spinge il robot all’indietro di 0.5 unità (+z) per ogni punto di danno e Sparks lancia una scintilla per ogni punto di danno. - In
TakeDamagedi Health, dopo aver ridotto hp, chiamaReact(amount)su ogni IHitReaction presente sul Robot e sui suoi figli, individuati con una sola chiamata a GetComponentsInChildren, e registra quante hanno reagito, comeReactions: 3.
Premi Play, colpisci il robot con la barra spaziatrice e con un clic, poi premi Check.
Provalo tu
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti