F8 FSM

August 30, 2025 · View on GitHub

license Unity Version Platform

简介(希望自己点击F8,就能开始制作游戏,不想多余的事)

Unity F8 FSM有限状态机组件。

  1. 通过继承有限状态机状态 FSMState 和状态切换 FSMSwitch,控制状态机,添加/切换/轮询/销毁。

导入插件(需要首先导入核心)

注意!内置在->F8Framework核心:https://github.com/TippingGame/F8Framework.git
方式一:直接下载文件,放入Unity
方式二:Unity->点击菜单栏->Window->Package Manager->点击+号->Add Package from git URL->输入:https://github.com/TippingGame/F8Framework.git

视频教程:【Unity框架】(12)有限状态机

代码使用方法

public Transform Target;
public Transform objectA;

private void Start()
{
    /*-------------------------------------基础功能-------------------------------------*/
    // 创建两个状态
    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));

    // 创建有限状态机
    // name:有限状态机名称
    // owner:有限状态机拥有者
    // fsmGroupName:有限状态机所属群组
    // blackboard:有限状态机的黑板
    // params states:有限状态机的状态
    IFSM<Transform> fsmA = FF8.FSM.CreateFSM<Transform>("FSMTesterA", objectA, "FSMGroupName", new Blackboard(), exitState, enterState);
    fsmA.DefaultState = exitState;
    fsmA.ChangeToDefaultState();

    // 切换状态
    fsmA.ChangeState<ExitRangeState>();

    // 黑板,设置数据
    fsmA.Blackboard.SetValue<float>("health", 100f);
    fsmA.Blackboard.SetValue<Vector2>("position", new Vector2(10, 5));
    // 黑板,获取、删除数据
    fsmA.Blackboard.GetValue<float>("health");
    fsmA.Blackboard.HasValue("health");
    fsmA.Blackboard.RemoveValue("health");
    fsmA.Blackboard.Clear();
    
    // 黑板订阅事件
    fsmA.Blackboard.RegisterValueChanged<Vector2>(OnValueChanged);
    fsmA.Blackboard.RegisterValueRemoved(OnValueRemoved);
    
    // 黑板取消订阅事件
    fsmA.Blackboard.UnregisterValueChanged<Vector2>(OnValueChanged);
    fsmA.Blackboard.UnregisterValueRemoved(OnValueRemoved);
    
    void OnValueChanged(string key, Vector2 value)
    {
    }
    
    void OnValueRemoved(string key)
    {
    }
    
    /*-------------------------------------其他功能-------------------------------------*/
    // 获取 FSM
    FF8.FSM.GetFSM<Transform>("FSMTesterA");
    
    // 是否存在指定名称的 FSM
    FF8.FSM.HasFSM<Transform>("FSMTesterA");
    
    // 设置 FSM 群组
    FF8.FSM.SetFSMGroup<Transform>("FSMTesterA", "FSMGroupName");
    
    // 获取所有 FSM
    IList<FSMBase> fsms = FF8.FSM.GetAllFSMs();
    
    // 是否存在 FSM 群组
    bool hasFSMGroup1 = FF8.FSM.HasFSMGroup("FSMGroupName");
    
    // 获取 FSM 群组
    bool hasFSMGroup2 = FF8.FSM.PeekFSMGroup("FSMGroupName", out var fsmGroup);
    
    // 移除 FSM 群组
    FF8.FSM.RemoveFSMGroup("FSMGroupName");
    
    // 销毁 FSM
    FF8.FSM.DestoryFSM<Transform>("FSMTesterA");
    
    // 销毁所有 FSM
    FF8.FSM.DestoryAllFSM();
}

/*------------------------------继承FSMState/FSMSwitch使用------------------------------*/

// 继承有限状态机状态
public class EnterRangeState : 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 EnterSwitch : FSMSwitch<Transform>
{
    public override bool SwitchFunction(IFSM<Transform> fsm)
    {
        float distance = Vector3.Distance(fsm.Owner.transform.position, DemoFSM.Instance.Target.position);
        if (distance <= 10)
            return true;
        else
            return false;
    }
}

// 继承有限状态机状态
public class ExitRangeState : 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 ExitSwitch : FSMSwitch<Transform>
{
    public override bool SwitchFunction(IFSM<Transform> fsm)
    {
        float distance = Vector3.Distance(fsm.Owner.transform.position, DemoFSM.Instance.Target.position);
        if (distance > 10)
            return true;
        else
            return false;
    }
}