Menu
CoddyTech

GetComponents

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 8 sur 50.

GetComponent<T>() renvoie la première correspondance. GetComponents<T>() renvoie toutes les correspondances sur l’objet sous forme de tableau, et GetComponentsInChildren<T>() toutes les correspondances sur l’objet et dans tout ce qu’il contient. Avec une interface comme T, un seul appel récupère chaque élément capable d’effectuer une action, quelle que soit sa classe. Ici, les machines d’une usine sont des enfants de l’objet Factory, et chaque élément qui fonctionne à l’électricité implémente 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");
    }
}

Une Lampe commande sa Light, un Ventilateur se met à tourner, un Convoyeur se met en mouvement, chacun dans son propre SetPower. Une machine avec une Lampe et un Ventilateur sur un même objet compte deux fois, puisque chaque composant est une correspondance distincte. Le Generator ne les nomme jamais, donc une Sirène qui implémente IPowered, ajoutée sous Factory par la suite, sera activée lors du prochain Switch.

GetComponentsInChildren inclut l’objet sur lequel vous l’appelez et ignore les enfants inactifs, sauf si vous lui passez true : GetComponentsInChildren<IPowered>(true). GetComponents examine uniquement l’objet lui-même, ce qui convient aux éléments côte à côte, comme une lumière et un avertisseur sonore sur une même porte.

challenge icon

Défi

Facile

Le robot d’entraînement doit réagir à chaque coup. Health.cs sur le Robot comptabilise les hp, et trois parties peuvent réagir : Flash sur la tête la rend rouge, Recoil sur le Robot le fait reculer brusquement, et Sparks sur l’antenne projette des étincelles. La touche Espace inflige 1 dégât au robot et un clic lui en inflige 2 (Trainer.cs est prêt). Pour le moment, Health ne prévient que la tête.

  • Dans IHitReaction.cs, déclare une interface IHitReaction avec une méthode, void React(int damage).
  • Fais implémenter cette interface à Flash, Recoil et Sparks : la méthode de chacun devient React(int damage). Flash fait ce qu’il faisait. Recoil fait reculer brusquement le robot de 0.5 unité (+z) par point de dégâts, et Sparks projette une étincelle par point de dégâts.
  • Dans TakeDamage de Health, après la diminution de hp, appelle React(amount) sur chaque IHitReaction présent sur le Robot et ses enfants, trouvés avec un seul appel à GetComponentsInChildren, puis consigne le nombre de réactions, sous la forme Reactions: 3.

Appuie sur Play, frappe le robot avec la touche Espace et avec un clic, puis clique sur Check.

Essayez vous-même

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity