GetComponents
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 9 di 64.
GetComponent<T>() restituisce la prima corrispondenza. GetComponents<T>() restituisce tutte le corrispondenze sull’oggetto come array, mentre GetComponentsInChildren<T>() restituisce tutte le corrispondenze sull’oggetto e su tutto ciò che dipende da esso. Usando un’interfaccia come T, una sola chiamata raccoglie ogni parte in grado di fare qualcosa, qualunque sia la sua classe. In questo caso, le macchine di una fabbrica sono figlie dell’oggetto Factory e ogni parte che funziona a 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");
}
}Una Lampada accende la propria Luce, un Ventilatore inizia a girare, un Nastro trasportatore inizia a muoversi: ciascuno gestisce il proprio SetPower. Una macchina con una Lampada e un Ventilatore sullo stesso oggetto viene conteggiata due volte, perché ogni componente è una corrispondenza separata. Il Generatore non li nomina mai, quindi una Sirena che implementa IPowered, aggiunta in seguito sotto Factory, viene attivata dalla chiamata successiva a Switch.
GetComponentsInChildren include l’oggetto su cui lo chiami e salta i figli inattivi, a meno che non passi true: GetComponentsInChildren<IPowered>(true). GetComponents esamina solo l’oggetto specifico, il che è utile per parti affiancate, come una luce e un cicalino sulla stessa porta.
Sfida
FacileFai in modo che ogni parte del robot mostri di essere stata colpita.
- In
IHitReaction.cs, dichiarapublic interface IHitReactionconvoid React(int damage);. - Fai implementare l’interfaccia a
Flash,RecoileSparks: rinomina ogni metodo inpublic void React(int damage). - Recoil si sposta indietro di
0.5f * damage; Sparks lanciadamagescintille. - In
TakeDamage, chiamaReact(amount)su ogniGetComponentsInChildren<IHitReaction>(), poi registraReactions: 3(il loro numero).
Premi «Gioca», premi la barra spaziatrice, poi fai clic. Quindi premi «Verifica».
Provalo tu
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity