在unity中实现一个有限状态机(1)

转换条件和状态id

  • 对于每一次状态切换,都有一个从当前状态切换到另外一个状态的条件,类似于Unity动画状态机里面的箭头.对于这些条件,可以用一个枚据类型表示.添加变化条件可以在这里添加.
public enum Transition
{
      NullTransiton
}
  • 对于每一个状态,都会有一个状态id,用来唯一标识该状态.添加状态需要在此添加状态id
public enum StateID
{
    NullStateID
}

状态基类

  • 状态模式的核心使用一个类来表示一个状态,对于所有的状态,可以有一个基类来描述所有状态共性的东西
public class FsmState 
{
    private StateID mstateID;//状态的id,是上述枚举类型
    public StateID MStateID { get { return mstateID; } }
    //当前状态下,对于不同的条件(Transiton),它会变成哪种状态,用一个字典记录
    private Dictionary<Transition, StateID> stateTransitionDic = new Dictionary<Transition, StateID>();
    //向外接口,添加在当前状态下,给出一个条件会变成哪种状态
    public void AddTransition(Transition transition, StateID stateID)
    {
        if(transition==Transition.NullTransiton)
        {
            Debug.LogError("条件不合理");
            return;
        }
        if(stateID== StateID.NullStateID)
        {
            Debug.LogError("变化后的状态为空");
            return;
        }
        if(stateTransitionDic.ContainsKey(transition))
        {
            Debug.LogError("当前状态已经有对该条件的处理了");
            return;
        }
        stateTransitionDic.Add(transition,stateID);
    }
    public void DeleteTransition(Transition transition)
    {
        if(!stateTransitionDic.ContainsKey(transition))
        {
            Debug.LogError("当前状态下没有该变化条件");
            return;
        }
        stateTransitionDic.Remove(transition);
    }

    //在当前状态下,给出一个条件,会切换到哪种状态,返回状态的id
    public StateID MakeTransition(Transition transition)
    {
        if(transition==Transition.NullTransiton)
        {
            Debug.LogError("条件为空");
            return StateID.NullStateID;
        }
        if(!stateTransitionDic.ContainsKey(transition))
        {
            Debug.LogError("该状态对该条件不响应");
            return StateID.NullStateID;
        }
        return stateTransitionDic[transition];
        
    }
    //进入当前状态时做的事情
    public virtual void OnEnter()
    {

    }
    //离开当前状态时做的事情
    public virtual void OnExit()
    {

    }
    //在当前状态每帧都执行的事情,Reson主要是每一帧判断是否进行状态的切换
    public virtual void Reson(GameObject npc, GameObject player)
    {

    }
    //当前状态每帧都做的事
    public virtual void Update()
    {

    }
}
上一篇:++ -- 自增 ,自减 一元运算符


下一篇:CSS动画