unity - FSM 有限状态机

游戏中,需要控制人物状态的时候,可以采用Switch Case 方法。然而当出现复杂的状态或者需要添加新的状态时,Switch Case方法将会非常的繁琐。而使用FSM(有限状态机),可以轻松解决以上问题。

以下是我个人的理解,有不足或者错误的地方,还望不吝赐教。

有限状态机思想:通过传递不同的状态,控制当前人物的行为。

设计思路:

                1、创建状态基类,定义基类中的方法,包括状态进入,状态执行,状态退出。

                2、创建状态管理类,定义管理方法,包括添加状态,设置状态,更新状态,移除状态。

                3、定义状态枚举。

                4、状态类,继承状态基类,实现基类中的方法,以及当前方法中所需要完成的行为。

代码如下:

              1、状态基类

                                public abstract class myFsmBase : MonoBehaviour {

                                public abstract void OnEnter();
                                public abstract void OnUpdate();
                                public abstract void OnExit();

                                private void Awake()
                               {
                                             AddState();
                                }
                                 protected abstract void AddState();

              2、状态管理类

                              public class myFsmController {

                              public static myFsmController  instance;
                              public static myFsmController Instance {
                                             get  { if (instance == null)
                                             instance = new myFsmController();
                                             return instance;
                                                    }
                                  }
                              public myFsmBase myfsm; 
                              Dictionary <State, myFsmBase> Statedic;

                               public myFsmController()
                           {
                                Statedic = new Dictionary<State, myFsmBase>();
                                Statedic.Add(State.none, null);
                             }
                                public void SetFsmState(State stateid)
                            {
                                if (myfsm == Statedic[stateid])
                            {
                                    return;
                             }
                            if (myfsm ==null )
                              {

                               }
                             else
                              {
                                      //退出上一个状态
                                      myfsm.OnExit();
                              }
                                     //下个状态进入
                                     Statedic[stateid].OnEnter();

                                     myfsm = Statedic[stateid];

                             }
    public void RemoveFsmState(State state, myFsmBase myfsm )
    {
        if (Statedic.ContainsValue(myfsm))
        {
            Statedic.Remove(state);
        }
    }
    public void AddState( State state , myFsmBase myfsm)
    {
        if (!Statedic.ContainsKey (state))
        {
            Statedic.Add(state, myfsm);
        }
    }

          3、状态枚举

public enum State
{
    none,
    move,
    jump,
    dead
}

            4、状态类

public class jumpState : myFsmBase
{

    protected override void AddState()
    {
        myFsmController.Instance.AddState(State.jump, this);
    }

    public override void OnEnter()
    {
        Debug.LogError("jump - enter");
    }

    public override void OnExit()
    {
        Debug.LogError("jump - 退出");
   
}

    public override void OnUpdate()
    {
        
    }
}

发布了26 篇原创文章 · 获赞 8 · 访问量 5802

猜你喜欢

转载自blog.csdn.net/LM514104/article/details/86085300
今日推荐