Champs UnityEvent
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 14 sur 64.
Le champ On Click () d’un bouton est un champ UnityEvent, et tes propres scripts peuvent en avoir un aussi. Un champ UnityEvent public apparaît dans l’Inspector sous la forme d’une liste du même type, et le script le déclenche avec Invoke() sans savoir ce qui y est associé. Ce compte à rebours se déclenche une fois par seconde :
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}Dans l’Inspector, On Finished () comporte des lignes comme celles d’un bouton : l’une lance la fusée, une autre ouvre la porte. Un autre niveau réutilise le même Countdown avec d’autres lignes, et personne n’a besoin d’écrire un nouveau script. UnityEvent<int> transmet une valeur. Dans son menu déroulant, une méthode qui prend un int figure sous int dynamique, et cette ligne reçoit la valeur transmise à Invoke, ici le nombre de secondes restantes. La même méthode, sous Paramètres statiques, reçoit plutôt un nombre saisi dans la ligne ; des méthodes sans paramètre peuvent aussi être associées.
Unity crée un champ UnityEvent lorsqu’il charge le script : onTick n’est donc jamais null et n’a pas besoin de ?., et le code peut ajouter des écouteurs avec onTick.AddListener(ShowSeconds). Choisis un UnityEvent lorsque la réaction varie d’un objet à l’autre et se configure dans l’Inspector, par toi ou par un concepteur qui n’ouvre jamais le script. Choisis un événement C# lorsque le code écoute : le compilateur vérifie les noms de méthodes, donc un changement de nom entraîne un échec de la compilation au lieu de laisser une ligne <Missing> sans avertissement, et un événement C# n’apparaît jamais dans l’Inspector.
Défi
FacileAttribue à FinishLine les événements auxquels sont reliées les lignes de la scène.
- Ajoute
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;et un entier privé pour compter les tours effectués. - Dans
OnTriggerEnter, lorsqueotherest marquéPlayer, compte le tour et appelleonLap.Invokeavec le nombre de tours effectués. - Quand le nombre de tours atteint
laps, appelleonRaceOver.Invoke(); ensuite, le franchissement ne fait rien.
Appuie sur « Jouer » et effectue trois tours. Puis appuie sur « Vérifier ».
Essayez vous-même
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// la voiture a franchi la ligne : un tour de plus terminé
}
}
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