Menu
CoddyTech

Champs UnityEvent

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

Le On Click () d’un bouton est un champ UnityEvent, et tes propres scripts peuvent aussi en avoir un. Un champ UnityEvent public apparaît dans l’Inspector sous la forme du même type de liste, et le script le déclenche avec Invoke() sans savoir ce qui y est raccordé. Ce compte à rebours avance d’une seconde à la fois :

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 () accepte des lignes comme celles d’un bouton : une ligne 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’écrit de nouveau script. UnityEvent<int> transmet une valeur. Dans son menu déroulant, une méthode qui prend un int apparaît sous Dynamic int, et cette ligne reçoit la valeur transmise à Invoke, ici le nombre de secondes restantes. La même méthode sous Static Parameters reçoit plutôt un nombre saisi dans la ligne, et des méthodes sans paramètre peuvent également être raccordé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 renommage fait échouer la compilation au lieu de laisser une ligne <Missing> discrète, et un événement C# n’apparaît jamais dans l’Inspector.

challenge icon

Défi

Facile

Une course de trois tours autour de l’île. Les flèches dirigent la voiture (Car.cs), et la scène est configurée comme un concepteur le ferait dans l’Inspector : la liste On Lap (Int32) de FinishLine appelle LapBoard.ShowLaps (Dynamic int) sur LapText et Crowd.Cheer sur Crowd, et sa liste On Race Over () appelle LapBoard.ShowFinished et Car.Stop. Ces scripts sont prêts, mais les lignes n’ont rien à appeler tant que FinishLine n’a pas les événements.

Écris FinishLine.cs :

  • Deux champs UnityEvent : onLap, qui transmet un int, et onRaceOver, qui ne transmet rien.
  • Chaque fois que la voiture (marquée avec le tag Player) franchit la ligne, un tour est terminé : appelle onLap avec le nombre de tours effectués (1, puis 2, puis 3). Le passage de tout autre élément ne compte pas.
  • Lorsque le nombre de tours effectués atteint laps (3), appelle onRaceOver. Après cela, franchir la ligne ne fait rien.

Appuie sur Play, fais trois tours autour de l’île, puis clique sur Check.

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 effectué
    }
}
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