Stater est un utilitaire léger permettant de définir des machines d’états basées sur des énumérations (value-types). Il expose une API fluide pour déclarer des états et leurs callbacks associés : ENTER, STEP, AT_STEP, ON_TRIGGER, EXIT.
Le code source se trouve ici : Assets/Scripts/States.
-
Générique :
Stater<TStateIdentifier>oùTStateIdentifierdoit être unstruct(souvent uneenum). -
Timings disponibles :
- ENTER — exécuté à l’entrée d’un état
- STEP — exécuté à chaque
Step(dt) - AT_STEP(time) — exécuté une seule fois après
timesecondes dans l’état - ON_TRIGGER(id) — exécuté lors d’un appel à
Trigger(id) - EXIT — exécuté quand on quitte l’état
-
Durée d’état automatique :
SetDuration(duration, nextState)→ transition automatique aprèsduration. -
Avancement temporel : Appeler chaque frame :
stater.Step(Time.deltaTime);
Stater.cs— gestion des états,Go,Step,TriggerStaterState.cs— définition d’un état : actions, durée, transitionStaterAction.cs— helpers pour ENTER / STEP / AT_STEP / ON_TRIGGER / EXIT
new Stater<T>("DebugName")new Stater<T>("DebugName", enableDebugLog)
AddState(T id)→ retourneStaterState<T>GetState(T id)Go(T id)— transition immédiateTrigger(string id)— exécute les ON_TRIGGER de l’état courantStep(float dt)— avance l’état
CurState— état courantStateTime— temps passé dans l’état
// Copier dans un MonoBehaviour pour tester
using States;
using UnityEngine;
public enum ExampleState { A, B }
public class Example : MonoBehaviour
{
private Stater<ExampleState> stater;
void Start()
{
stater = new Stater<ExampleState>("Example", true);
stater.AddState(ExampleState.A)
.AddAction(StaterAction.ENTER(() => Debug.Log("Enter A")))
.AddAction(StaterAction.STEP(() => Debug.Log("Stepping A")))
.SetDuration(2.0f, ExampleState.B);
stater.AddState(ExampleState.B)
.AddAction(StaterAction.ENTER(() => Debug.Log("Enter B")))
.AddAction(StaterAction.AT_STEP(1.0f, () => Debug.Log("1s in B")))
.SetDuration(3.0f, ExampleState.A);
stater.Go(ExampleState.A);
}
void Update()
{
stater.Step(Time.deltaTime);
}
}stater.AddState(MyState.Idle)
.AddAction(StaterAction.AT_STEP(0.5f, () => Debug.Log("0.5s passed")))
.AddAction(StaterAction.ON_TRIGGER("DoIt", () => Debug.Log("Triggered")));
stater.Trigger("DoIt");- Deux machines : locationStater (LOCATION) et actionStater (ACTION)
- Entrée dans
LOCATION.BED→ déclencheACTION.WALK+ définition de destination duNavMeshAgent - À l’arrivée :
actionStater→ACTION.SLEEP - Après une durée : retour à
ACTION.WALK, puis changement de lieu vialocationStater - Important : appeler
locationStater.Step(Time.deltaTime)(+ l’autre si nécessaire)
- Toujours appeler
Step(dt)si état utilise STEP/AT_STEP/durée AT_STEP(0f)s’exécute au premier Step après EnterSetDuration(0f)→ transition immédiate → attention aux boucles infiniesTriggersans handler → warningenableDebugLogest static par type générique → peut affecter d’autres instances- Non thread-safe (usage Unity main thread)
-
Erreur “CurrentState not found” → vérifier que l’état a été ajouté via
AddState -
Besoin de logs ? → utiliser
new Stater<T>("name", true)pour activer toutes les transitions et triggers