首先列举出所有状态的枚举
public enum StateType
{
Idle = 0,
Run = 1,
//...
}
状态基类
public class BaseState
{
public StateType stateId;
protected Animation anim;
public virtual void init(Animation anim)
{
this.anim = anim;
}
/// <summary>
/// 被添加到状态机之后调用
/// </summary>
public virtual void OnRegister() { }
/// <summary>
/// 进入
/// </summary>
/// <param name="info"></param>
public virtual void Enter(System.Object info = null) { }
/// <summary>
/// 退出
/// </summary>
/// <param name="nextStateID"></param>
public virtual void Exit(StateType nextStateID) { }
}
//...z子类
public class IdleState : BaseState
{
//......
}
// Runstate : BaseState
//最后 状态机控制器
public class FSM
{
public Dictionary<StateType, BaseState> stateDic = new Dictionary<StateType, BaseState>();//注册的状态列表
public BaseState curState;//当前状态
public Animation anim;
public FSM(Animation anim)
{
this.anim = anim;
}
/// <summary>
/// 添加状态
/// </summary>
/// <param name="s">具体状态</param>
public void AddState(BaseState s)
{
if (FindState(s.stateId) == null)
{
stateDic[s.stateId] = s;
s.init(this.anim);
s.OnRegister();
}
}
/// <summary>
/// 查找状态
/// </summary>
/// <param name="s">状态id</param>
public BaseState FindState(StateType stateID)
{
if (stateDic.ContainsKey(stateID))
{
return stateDic[stateID];
}
return null;
}
/// <summary>
/// 删除状态
/// </summary>
/// <param name="s">状态id</param>
public void RemoveState(StateType stateID)
{
if (stateDic.ContainsKey(stateID))
{
stateDic.Remove(stateID);
}
}
/// <summary>
/// 状态机切换状态
/// </summary>
/// <param name="stateID">状态id</param>
/// <param name="info">状态机携带参数.传入状态的Enter()方法</param>
public void SwitchState(StateType stateID, System.Object info = null)
{
if (curState!= null)
{
curState.Exit(stateID);
}
BaseState nextState = FindState(stateID);
if (nextState != null)
{
curState= nextState;
curState.Enter(info);
}
}
/// <summary>
/// 是否当前状态
/// </summary>
/// <param name="stateID">=状态id</param>
/// <returns>是则返回true</returns>
public bool IsCurrStateID(StateType stateID)
{
if (curState == null)
{
return false;
}
else
{
return curState.stateId == stateID;
}
}
}
//完成