Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Fai in modo che ogni parte del robot mostri di essere stata colpita.

  1. In IHitReaction.cs, dichiara public interface IHitReaction con void React(int damage);.
  2. Fai implementare l’interfaccia a Flash, Recoil e Sparks: rinomina ogni metodo in public void React(int damage).
  3. Recoil si sposta indietro di 0.5f * damage; Sparks lancia damage scintille.
  4. In TakeDamage, chiama React(amount) su ogni GetComponentsInChildren<IHitReaction>(), poi registra Reactions: 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

Esercitati da solo: Playground Unity