GameFramework游戏框架搭建教程 - Fsm(2)

接下来,添加FsmState最主要的生命周期方法

    /// <summary>

    /// 状态机状态初始化时调用

    /// </summary>

    /// <param name="fsm">状态机引用</param>

    public virtual void OnInit(Fsm<T> fsm)

    {

    }

    /// <summary>

    /// 状态机状态进入时调用

    /// </summary>

    /// <param name="fsm">状态机引用</param>

    public virtual void OnEnter(Fsm<T> fsm)

    {

    }

    /// <summary>

    /// 状态机状态轮询时调用

    /// </summary>

    /// <param name="fsm">状态机引用</param>

    public virtual void OnUpdate(Fsm<T> fsm, float elapseSeconds, float realElapseSeconds)

    {

    }

    /// <summary>

    /// 状态机状态离开时调用。

    /// </summary>

    /// <param name="fsm">状态机引用。</param>

    /// <param name="isShutdown">是关闭状态机时触发</param>

    public virtual void OnLeave(Fsm<T> fsm, bool isShutdown)

    {

    }

    /// <summary>

    /// 状态机状态销毁时调用

    /// </summary>

    /// <param name="fsm">状态机引用。</param>

    public virtual void OnDestroy(Fsm<T> fsm)

    {

        m_EventHandlers.Clear();

    }

然后添加FsmState切换状态的方法,当然因为切换状态是由Fsm来进行的,所以在此之前我们需要回到Fsm里先完善一下Fsm的字段与属性,增加用来维护所有状态的字典,维护状态机全局数据的字典,代表当前状态的引用等

image

image

image

在构造方法里进行初始化

public Fsm(string name, T owner, params FsmState<T>[] states)

    {

        if (owner == null)

        {

            Debug.LogError("状态机持有者为空");

        }

        if (states == null || states.Length < 1)

        {

            Debug.LogError("没有要添加进状态机的状态");

        }

        Name = name;

        Owner = owner;

        m_States = new Dictionary<string, FsmState<T>>();

        m_Datas = new Dictionary<string, object>();

        foreach (FsmState<T> state in states)

        {

            if (state == null)

            {

                Debug.LogError("要添加进状态机的状态为空");

            }

            string stateName = state.GetType().FullName;

            if (m_States.ContainsKey(stateName))

            {

                Debug.LogError("要添加进状态机的状态已存在:" + stateName);

            }

            m_States.Add(stateName, state);

            state.OnInit(this);

        }

        CurrentStateTime = 0f;

        CurrentState = null;

        IsDestroyed = false;

    }

025源码论坛声明 1、本网站中的绝大部分资源来源于网络, 本网站不保证所有资源的正确性和安全性,不为其合法性负责.
2、对于一切使用本网站资源而可能遭致的意外、疏忽、侵权及其造成的损失,本网站对其概不负责,亦不承担任何法律责任。
3、其他单位或个人使用、转载或引用本站原创文章时必须同时征得本025源码网的同意.
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时删除并致以最深的歉意。
5、如需要本站的游戏源码或搭建帮助,可以联系站长 15623571666(微信同号)或者扫描右侧二维码!

您可能还会对下面的文章感兴趣:

    cache
    Processed in 0.004616 Second.