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

接上一篇 Fsm游戏源码教程

添加状态机全局数据相关的方法(在GF里对数据类型进行了自定义的封装,本文所要搭建的简易版GF没有进行这种封装)

    /// <summary>

    /// 是否存在状态机数据

    /// </summary>

    public bool HasData(string name)

    {

        if (string.IsNullOrEmpty(name))

        {

            Debug.Log("要查询的状态机数据名字为空");

        }

        return m_Datas.ContainsKey(name);

    }

    /// <summary>

    /// 获取状态机数据

    /// </summary>

    public TDate GetData<TDate>(string name)

    {

        return (TDate)GetData(name);

    }

    /// <summary>

    /// 获取状态机数据

    /// </summary>

    public object GetData(string name)

    {

        if (string.IsNullOrEmpty(name))

        {

            Debug.Log("要获取的状态机数据名字为空");

        }

        object data = null;

        m_Datas.TryGetValue(name, out data);

        return data;

    }

    /// <summary>

    /// 设置状态机数据

    /// </summary>

    public void SetData(string name, object data)

    {

        if (string.IsNullOrEmpty(name))

        {

            Debug.Log("要设置的状态机数据名字为空");

        }

        m_Datas[name] = data;

    }

    /// <summary>

    /// 移除状态机数据

    /// </summary>

    public bool RemoveData(string name)

    {

        if (string.IsNullOrEmpty(name))

        {

            Debug.Log("要移除的状态机数据名字为空");

        }

        return m_Datas.Remove(name);

    }

至此,Fsm类的编写算是完成了,现在回到FsmState类里,添加切换状态的方法

image

这样FsmState类也编写完成了,最后我们还需要编写FsmManager类

打开FsmManager类,使其继承ManagerBase,并完善相关字段与方法

public class FsmManager : ManagerBase

{

    /// <summary>

    /// 所有状态机的字典(在这里,状态机接口的作用就显示出来了)

    /// </summary>

    private Dictionary<string, IFsm> m_Fsms;

    private List<IFsm> m_TempFsms;

    public override int Priority

    {

        get

        {

            return 60;

        }

    }

    public override void Init()

    {

        m_Fsms = new Dictionary<string, IFsm>();

        m_TempFsms = new List<IFsm>();

    }

    /// <summary>

    /// 关闭并清理状态机管理器

    /// </summary>

    public override void Shutdown()

    {

        foreach (KeyValuePair<string, IFsm> fsm in m_Fsms)

        {

            fsm.Value.Shutdown();

        }

        m_Fsms.Clear();

        m_TempFsms.Clear();

    }

    /// <summary>

    /// 轮询状态机管理器

    /// </summary>

    public override void Update(float elapseSeconds, float realElapseSeconds)

    {

        m_TempFsms.Clear();

        if (m_Fsms.Count <= 0)

        {

            return;

        }

        foreach (KeyValuePair<string, IFsm> fsm in m_Fsms)

        {

            m_TempFsms.Add(fsm.Value);

        }

        foreach (IFsm fsm in m_TempFsms)

        {

            if (fsm.IsDestroyed)

            {

                continue;

            }

            //轮询状态机

            fsm.Update(elapseSeconds, realElapseSeconds);

        }

    }

}

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

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

    cache
    Processed in 0.003776 Second.