在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()
    {

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值