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.
Défi
FacileUne 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, etonRaceOver, qui ne transmet rien. - Chaque fois que la voiture (marquée avec le tag
Player) franchit la ligne, un tour est terminé : appelleonLapavec 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), appelleonRaceOver. 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é
}
}
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