Menu
CoddyTech

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.

challenge icon

Défi

Facile

Attribue à FinishLine les événements auxquels sont reliées les lignes de la scène.

  1. Ajoute using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; et un entier privé pour compter les tours effectués.
  2. Dans OnTriggerEnter, lorsque other est marqué Player, compte le tour et appelle onLap.Invoke avec le nombre de tours effectués.
  3. Quand le nombre de tours atteint laps, appelle onRaceOver.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

Entraînez-vous par vous-même : Playground Unity