Use when implementing or troubleshooting FSM feature workflows — finite state machines, state transitions, blackboard data, and FSM groups in F8Framework.
⚠️ IMPORTANT: Before using this feature, you MUST formally initialize F8Framework in the launch sequence. Ensure
ModuleCenter.Initialize(this);has run first, then create the required module, for exampleFF8.FSM = ModuleCenter.CreateModule<FSMManager>();.
| Class | Role |
|---|---|
FSMManager | Core module. Access via FF8.FSM. Creates, finds, destroys FSMs. |
IFSM<T> | FSM interface. Owner type T is the owner object type. |
FSMState<T> | Abstract state base. Override lifecycle methods. |
FSMSwitch<T> | Abstract transition condition. Override SwitchFunction(). |
Blackboard | Key-value data store shared across states in a FSM. |
FSMBase | Non-generic base class for FSM collections. |
var enterState = new EnterRangeState();
var exitState = new ExitRangeState();
var enterSwitch = new EnterSwitch();
var exitSwitch = new ExitSwitch();
exitState.AddSwitch(exitSwitch, typeof(EnterRangeState));
enterState.AddSwitch(enterSwitch, typeof(ExitRangeState));
IFSM<Transform> fsm = FF8.FSM.CreateFSM<Transform>(
"FSMName", owner, "GroupName", new Blackboard(), exitState, enterState);
fsm.DefaultState = exitState;
fsm.ChangeToDefaultState();
fsm.ChangeState<ExitRangeState>();
fsm.Blackboard.SetValue<float>("health", 100f);
fsm.Blackboard.GetValue<float>("health");
fsm.Blackboard.HasValue("health");
fsm.Blackboard.RemoveValue("health");
fsm.Blackboard.Clear();
// Subscribe to value changes
fsm.Blackboard.RegisterValueChanged<Vector2>(OnValueChanged);
fsm.Blackboard.RegisterValueRemoved(OnValueRemoved);
fsm.Blackboard.UnregisterValueChanged<Vector2>(OnValueChanged);
fsm.Blackboard.UnregisterValueRemoved(OnValueRemoved);
FF8.FSM.GetFSM<Transform>("FSMName");
FF8.FSM.HasFSM<Transform>("FSMName");
FF8.FSM.SetFSMGroup<Transform>("FSMName", "GroupName");
FF8.FSM.GetAllFSMs();
FF8.FSM.HasFSMGroup("GroupName");
FF8.FSM.PeekFSMGroup("GroupName", out var group);
FF8.FSM.RemoveFSMGroup("GroupName");
FF8.FSM.DestoryFSM<Transform>("FSMName");
FF8.FSM.DestoryAllFSM();
public class MyState : FSMState<Transform>
{
public override void OnInitialization(IFSM<Transform> fsm) { }
public override void OnStateEnter(IFSM<Transform> fsm) { }
public override void OnStateUpdate(IFSM<Transform> fsm) { }
public override void OnStateLateUpdate(IFSM<Transform> fsm) { }
public override void OnStateFixedUpdate(IFSM<Transform> fsm) { }
public override void OnStateExit(IFSM<Transform> fsm) { }
public override void OnTermination(IFSM<Transform> fsm) { }
}
public class MySwitch : FSMSwitch<Transform>
{
public override bool SwitchFunction(IFSM<Transform> fsm)
{
// Return true to trigger transition
return someCondition;
}
}
FSMState<T> with desired owner type.FSMSwitch<T>.state.AddSwitch(switch, targetStateType).FF8.FSM.CreateFSM<T>() passing all states.ChangeToDefaultState().| Error | Cause | Solution |
|---|---|---|
| State not changing | Switch condition never returns true | Debug SwitchFunction logic |
| Null owner | Owner destroyed before FSM | Destroy FSM when owner is destroyed |
| Duplicate FSM name | Same name used for multiple FSMs | Use unique names per FSM |