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.
Défi
FacileLe 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
IHitReactionavec 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
TakeDamagede Health, après la diminution de hp, appelleReact(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 formeReactions: 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();
}
}
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
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets