有限状态机
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();
}
}