Contents

有限状态机

状态机基类实现

using System;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 状态接口
/// </summary>
public interface IState
{
    /// <summary>
    /// 状态进入
    /// </summary>
    void OnEnter();
    /// <summary>
    /// 状态退出
    /// </summary>
    void OnExit();
    /// <summary>
    /// 状态执行
    /// </summary>
    void OnUpdate();
    /// <summary>
    /// 状态执行
    /// </summary>
    void OnFixedUpdate();
}

/// <summary>
/// 在不同状态之间共享数据 
/// </summary>
[Serializable]
public class BlackBorad
{
}

/// <summary>
/// 状态机
/// </summary>
/// <typeparam name="T">枚举状态Type</typeparam>
public abstract class FSM<T> where T: Enum
{
    /// <summary>
    /// 状态字典
    /// </summary>
    private readonly Dictionary<T, IState> stateDict;
    /// <summary>
    /// 当前状态
    /// </summary>
    private IState curState;
    /// <summary>
    /// 共享数据 黑板
    /// </summary>
    public BlackBorad BlackBorad { get; private set; }
    public FSM(BlackBorad blackBorad)
    {
        stateDict = new Dictionary<T, IState>();
        BlackBorad = blackBorad;
    }
    /// <summary>
    /// 状态添加
    /// </summary>
    /// <param name="stateType"></param>
    /// <param name="state"></param>
    public virtual void AddState(T stateType, IState state)
    {
        if (stateDict.ContainsKey(stateType))
        {
            Debug.Log("[AddState]已存在状态:" + stateType.ToString());
            return;
        }
        stateDict.Add(stateType, state);
    }
    /// <summary>
    /// 状态切换
    /// </summary>
    /// <param name="stateType"></param>
    public virtual void SwitchState(T stateType)
    {
        if (!stateDict.ContainsKey(stateType))
        {
            Debug.Log("[SwitchState]不存在状态:" + stateType.ToString());
            return;
        }
        curState?.OnExit();
        curState = stateDict[stateType];
        curState.OnEnter();
    }
    /// <summary>
    /// 状态执行
    /// </summary>
    public virtual void OnUpdate()
    {
        curState?.OnUpdate();
    }
    /// <summary>
    /// 状态执行
    /// </summary>
    public virtual void OnFixedUpdate() 
    {
        curState?.OnFixedUpdate();
    }
}

游戏状态机

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 游戏状态枚举
/// </summary>
public enum E_GameStateType
{
    Loading,
    Start,
    Stop,
    End
}
/// <summary>
/// 黑板
/// </summary>
public class GameFSMBlackBorad : BlackBorad
{

}
/// <summary>
/// 游戏状态状态机
/// </summary>
public class GameFSM : FSM<E_GameStateType>
{
    public GameFSM(BlackBorad blackBorad) : base(blackBorad)
    {
        
    }
}

使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;



/// <summary>
/// 游戏运行状态
/// </summary>
public class GameStartState : IState
{
    public void OnEnter()
    {
        
    }

    public void OnExit()
    {

    }

    public void OnFixedUpdate()
    {   
    }

    public void OnUpdate()
    { 
    }
}
/// <summary>
/// 游戏加载状态
/// </summary>
public class GameLoadingState : IState
{
    private GameFSM fsm;
    private GameFSMBlackBorad blackBorad;

    public GameLoadingState(GameFSM fsm) 
    {
        this.fsm = fsm;
        blackBorad = fsm.BlackBorad as GameFSMBlackBorad;
    }

    public void OnEnter()
    {
        //显示Loading界面
        ShowLoadingPanle();
    }

    public void OnExit()
    {
        //隐藏Loading界面
        HideLoadingPanle();
    }

    public void OnFixedUpdate()
    {
    }

    public void OnUpdate()
    {
    }
    /// <summary>
    /// 显示Loading界面
    /// </summary>
    public void ShowLoadingPanle() 
    {
    }
    /// <summary>
    /// 关闭Loading界面
    /// </summary>
    public void HideLoadingPanle()
    {
    }
}


public class GameManager : MonoBehaviour
{
    private GameFSM gameFSM;
    private void Awake()
    {
        //创建游戏状态机
        gameFSM = new GameFSM(new GameFSMBlackBorad());
        //添加默认状态
        gameFSM.AddState(E_GameStateType.Loading, new GameLoadingState(gameFSM));
    }
    void Start()
    {
        
    }
    void Update()
    {
        gameFSM.OnUpdate();
    }
}