Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Il 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 IHitReaction con 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 TakeDamage di Health, dopo aver ridotto hp, chiama React(amount) su ogni IHitReaction presente sul Robot e sui suoi figli, individuati con una sola chiamata a GetComponentsInChildren, e registra quante hanno reagito, come Reactions: 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();
    }
}
quiz iconMettiti alla prova

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