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下鼠标,看看测试效果吧