Unity FSM有限状态机框架

 FSMStateManager

管理FSMState状态

初始化时确定有多少个状态,之后添加状态。

之后调用RunState运行状态的回调,运行状态。

using UnityEngine;

public class FSMStateManager
{
    private FSMState[] states;

    public FSMStateManager(int stateCount)
    {
        Initial(stateCount);
    }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="stateCount"></param>
    private void Initial(int stateCount)
    {
        states = new FSMState[stateCount];
    }

    /// <summary>
    /// 状态的边界【最后添加的一个状态的下标】
    /// </summary>
    private sbyte countBorder = -1;

    /// <summary>
    /// 当前状态的下标
    /// </summary>
    private sbyte currentIndex = -1;

    /// <summary>
    /// 添加状态
    /// </summary>
    /// <param name="state"></param>
    public void AddState(FSMState state)
    {
        countBorder++;

        if (countBorder > states.Length - 1)
        {
            Debug.Log("添加状态失败,状态已满!");
            
            return;
        }

        states[countBorder] = state;
    }

    /// <summary>
    /// 运行状态
    /// </summary>
    /// <param name="index"></param>
    public void RunState(int index)
    {
        // 如果当前状态已经运行
        if (currentIndex == index)
        {
            return;
        }
        
        // 如果已经有状态在运行
        if (currentIndex != -1)
        {
            states[currentIndex].OnExit();
        }

        currentIndex = (sbyte)index;
        
        // 运行新的状态
        states[currentIndex].OnEnter();
    }

    /// <summary>
    /// 当前状态更新
    /// </summary>
    public void CurrentStateUpdate()
    {
        // 如果当前没有状态
        if (currentIndex == -1)
        {
            return;
        }
        
        states[currentIndex].OnStay();
    }

    /// <summary>
    /// 当前状态
    /// </summary>
    /// <returns></returns>
    public int CurrentState()
    {
        return currentIndex;
    }
}

FSMState

状态的基类

提供了进入、停留、离开回调供子类重写。

public class FSMState
{
    /// <summary>
    /// 进入状态
    /// </summary>
    public virtual void OnEnter()
    {}
    
    /// <summary>
    /// 状态中
    /// </summary>
    public virtual void OnStay()
    {}
    
    /// <summary>
    /// 退出状态
    /// </summary>
    public virtual void OnExit()
    {}
}

猜你喜欢

转载自blog.csdn.net/heaventianjianke/article/details/127164194
今日推荐