简易版GameFramework游戏框架搭建教程(四)Procedure

Fsm模块在上一篇文章中已经完成,我们便可以开始着手Procedure模块的开发了

下面是官网对Procedure的介绍



首先新建一个Procedure文件夹,在其中新建ProcedureBase类和ProcedureManager类


ProcedureBase是流程基类,属于一种状态。ProcedureManager是流程管理器,负责管理所有流程。


打开ProcedureBase,使其继承FsmState<ProcedureManager>,并重写两个生命周期方法

/// <summary>
/// 流程基类
/// </summary>
public class ProcedureBase : FsmState<ProcedureManager>
{

    public override void OnEnter(Fsm<ProcedureManager> fsm)
    {
        base.OnEnter(fsm);
        Debug.Log("进入流程:" + GetType().FullName);
    }

    public override void OnLeave(Fsm<ProcedureManager> fsm, bool isShutdown)
    {
        base.OnLeave(fsm, isShutdown);
        Debug.Log("离开流程:" + GetType().FullName);
    }

}

之后打开ProcedureManager,使其继承ManagerBase,并添加对应的字段与属性,在构造方法里初始化一部分

/// <summary>
/// 流程管理器
/// </summary>
public class ProcedureManager : ManagerBase{
    /// <summary>
    /// 状态机管理器
    /// </summary>
    private FsmManager m_FsmManager;

    /// <summary>
    /// 流程的状态机
    /// </summary>
    private Fsm<ProcedureManager> m_ProcedureFsm;

    /// <summary>
    /// 所有流程的列表
    /// </summary>
    private List<ProcedureBase> m_procedures;

    /// <summary>
    /// 入口流程
    /// </summary>
    private ProcedureBase m_EntranceProcedure;

    /// <summary>
    /// 当前流程
    /// </summary>
    public ProcedureBase CurrentProcedure
    {
        get
        {
            if (m_ProcedureFsm == null)
            {
                Debug.LogError("流程状态机为空,无法获取当前流程");
            }
            return (ProcedureBase)m_ProcedureFsm.CurrentState;
        }
    }

    public override int Priority
    {
        get
        {
            return -10;
        }
    }

    public ProcedureManager()
    {
        m_FsmManager = FrameworkEntry.Instance.GetManager<FsmManager>();
        m_ProcedureFsm = null;
        m_procedures = new List<ProcedureBase>();
    }

    public override void Init()
    {
        
    }

    public override void Shutdown()
    {
        
    }

    public override void Update(float elapseSeconds, float realElapseSeconds)
    {
        
    }
}
添加流程的相关方法
    /// <summary>
    /// 添加流程
    /// </summary>
    public void AddProcedure(ProcedureBase procedure)
    {
        if (procedure == null)
        {
            Debug.LogError("要添加的流程为空");
            return;
        }
        m_procedures.Add(procedure);
    }

    /// <summary>
    /// 设置入口流程
    /// </summary>
    /// <param name="procedure"></param>
    public void SetEntranceProcedure(ProcedureBase procedure)
    {
        m_EntranceProcedure = procedure;
    }

添加创建流程状态机的方法

    /// <summary>
    /// 创建流程状态机
    /// </summary>
    public void CreateProceduresFsm()
    {
        m_ProcedureFsm = m_FsmManager.CreateFsm(this, "", m_procedures.ToArray());

        if (m_EntranceProcedure == null)
        {
            Debug.LogError("入口流程为空,无法开始流程");
            return;
        }

        //开始流程
        m_ProcedureFsm.Start(m_EntranceProcedure.GetType());
    }

怎么样,是不是很简单呢?因为我们在编写Fsm时已经把Procedure需要大部分东西都写好了

接下来,就需要测试一下我们编写的Procedure模块能不能跑通

在工程根目录新建一个Test文件夹,在其中再新建一个Procedure文件夹,用来存放测试模块需要的文件。

新建一个ProcedureTestMain测试脚本,然后新建一个场景,在场景中新建一个名为Main的空物体,把脚本挂上去,保存场景为test


然后新建3个测试用的流程类

分别打开3个流程类,使其继承ProcedureBase,并重写OnUpdate,添加切换状态的代码

public class Procedure_Start : ProcedureBase
{
    public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
    {
        base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
        if (Input.GetMouseButtonDown(0))
        {
            ChangeState<Procedure_Play>(fsm);
        }
    }
}
public class Procedure_Play : ProcedureBase
{
    public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
    {
        base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
        if (Input.GetMouseButtonDown(0))
        {
            ChangeState<Procedure_Over>(fsm);
        }
    }

}
public override void OnUpdate(Fsm<ProcedureManager> fsm, float elapseSeconds, float realElapseSeconds)
    {
        base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
        if (Input.GetMouseButtonDown(0))
        {
            ChangeState<Procedure_Start>(fsm);
        }
    }
打开我们的测试脚本,在Start方法里编写添加流程,启动流程状态机的代码

public class ProcedureTestMain : MonoBehaviour {

    private void Start()
    {
        ProcedureManager procedureManager = FrameworkEntry.Instance.GetManager<ProcedureManager>();

        //添加入口流程
        Procedure_Start entranceProcedure = new Procedure_Start();
        procedureManager.AddProcedure(entranceProcedure);
        procedureManager.SetEntranceProcedure(entranceProcedure);

        //添加其他流程
        procedureManager.AddProcedure(new Procedure_Play());
        procedureManager.AddProcedure(new Procedure_Over());
        
        //创建流程状态机
        procedureManager.CreateProceduresFsm();
    }

}

这样测试脚本就编写完成了,启动游戏,点击3下鼠标,看看测试效果吧





猜你喜欢

转载自blog.csdn.net/qq_32821435/article/details/80499045