GetComponents
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 9 sur 64.
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 qui se trouve en dessous. 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 Lamp allume ou éteint sa Light, un Fan se met à tourner, un Conveyor se met en mouvement, chacun dans son propre SetPower. Une machine équipée d’une Lamp et d’un Fan sur un même objet compte deux fois, car chaque composant est une correspondance distincte. Le Generator ne les nomme jamais : ainsi, une Siren qui implémente IPowered et qu’on ajoute plus tard sous Factory sera activée au prochain appel à 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 ne regarde que l’objet lui-même, ce qui convient aux éléments placés côte à côte, comme une lumière et un buzzer sur une même porte.
Défi
FacileFais en sorte que chaque partie du robot réagisse lorsqu’il est touché.
- Dans
IHitReaction.cs, déclarepublic interface IHitReactionavecvoid React(int damage);. - Fais implémenter cette interface à
Flash,RecoiletSparks: renomme chaque méthode enpublic void React(int damage). - Recoil recule de
0.5f * damage; Sparks lancedamageétincelles. - Dans
TakeDamage, appelleReact(amount)sur chaque élément renvoyé parGetComponentsInChildren<IHitReaction>(), puis consigneReactions: 3(leur nombre).
Appuie sur « Jouer », appuie sur la barre d’espace, puis clique. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity