
这个模块是GF框架的流程模块用于跑通整个项目的每一个步骤。ProcedureBase这个类是每一个进行的流程模块的基类是一个抽象类具体的流程模块由子类来实现。它继承状态机的状态类状态机的Owner是IProcedureManager说明每一个流程在流程管理器里都是一个状态并且当前只能同时运行一个流程(状态)。OnInit是当前流程执行初始化的内容OnEnter是当前流程状态机执行进入的内容OnUpdate是当前流程状态机执行每一帧更新的内容OnLeave是当前流程执行离开时的内容OnDestory是当前流程执行销毁时候的内容。ProcedureOwner就是以IProcedureManager为Owner的Fsm。也就是说Fsm的Owner是IProcedureManager意思是使用这个Fsm的Owner是IProcedureManager。IProcedureManager流程管理器的接口。流程管理器接口要求CurrentProcedure获取正在运行的那个流程。CurrentProcedureTime获取当前正在执行的流程的运行时间。Initialize是初始化流程管理器传入fsm管理器对象(因为流程管理器会使用Fsm管理器)传入流程管理器内所有被管理的流程。StartProcedure是开始流程传入第一个要执行的流程。HasProcedure是否有对应流程传入的参数要继承ProcedureBase。GetProcedure获取对应的流程传入的参数要继承ProcedureBase。ProcedureManager首先它继承GameFrameworkModule是一个模块其次继承自己的接口可以被接口所要求也可以要求外部能够通过接口调用的内容。内部m_FsmManager是流程管理器所使用的状态机管理器它们是强依赖。m_ProcedureFsm是流程Fsm状态机实际上流程管理器的每一个流程都是用Fsm状态机跑的内部包括了个Owner为IProcedureManager的Fsm状态机这个状态机管理器的引用可以从m_ProcedureFsm里Get到。然后流程模块的优先级是-2因为Fsm管理器的优先级是1在GF框架里是从大到小运行的所以先启动的是Fsm管理器然后再启动流程模块管理器。CurrentProcedure获得当前流程状态从流程fsm中获取当前的状态。CurrentProcedureTime获取当前流程的执行时间从流程fsm中获取当前状态的运行时间。流程管理器的更新里面什么都没有因为真正需要更新的是每一个流程状态的Update而每一个流程状态的Update最终还是交给Fsm来处理如果这里写那又重复了Fsm的内容——既运行每一个流程状态所以这里啥都没。关闭流程管理器。通过Fsm管理器将流程管理器所用的Fsm销毁然后去掉流程管理器中的引用。初始化流程管理器传入状态机管理器还有对应的所有流程状态。内部从状态机管理器创建对应的Fsm状态机然后传入流程状态。开始流程状态传入最初执行的流程状态然后内部通过对应的流程Fsm来执行流程状态。查看是否有对应流程状态 和 获取流程状态都是通过内部引用的流程fsm状态机来查看和获取流程状态。流程模块结束稍微使用一下。usingGameFramework;usingGameFramework.Fsm;usingGameFramework.Procedure;usingUnityEngine;publicclassTestProcedure:MonoBehaviour{IProcedureManagerprocedureManager;IFsmManagerfsmManager;voidStart(){procedureManagerGameFrameworkEntry.GetModuleIProcedureManager();fsmManagerGameFrameworkEntry.GetModuleIFsmManager();procedureManager.Initialize(fsmManager,newProcedureLobby(),newProcedureCharacterSelect(),newProcedureGame());procedureManager.StartProcedureProcedureLobby();}// Update is called once per framevoidUpdate(){GameFrameworkEntry.Update(Time.deltaTime,Time.time);}voidOnDestroy(){GameFrameworkEntry.Shutdown();}}//----------------------------------------------------------------------------------------------------------------------//下面这几个是流程状态publicclassProcedureLobby:ProcedureBase{protectedoverridevoidOnInit(IFsmIProcedureManagerprocedureOwner){Debug.Log(初始化大厅流程);}protectedoverridevoidOnEnter(IFsmIProcedureManagerprocedureOwner){Debug.Log(进入大厅流程);}protectedoverridevoidOnUpdate(IFsmIProcedureManagerprocedureOwner,floatelapseSeconds,floatrealElapseSeconds){Debug.Log(执行大厅流程);if(Input.GetKeyDown(KeyCode.KeypadEnter)){ChangeStateProcedureCharacterSelect(procedureOwner);}}protectedoverridevoidOnLeave(IFsmIProcedureManagerprocedureOwner,boolisShutdown){Debug.Log(离开大厅流程);}protectedoverridevoidOnDestroy(IFsmIProcedureManagerprocedureOwner){Debug.Log(大厅流程销毁);}}//----------------------------------------------------------------------------------------------------------------------publicclassProcedureCharacterSelect:ProcedureBase{protectedoverridevoidOnInit(IFsmIProcedureManagerprocedureOwner){Debug.Log(初始化选角流程);}protectedoverridevoidOnEnter(IFsmIProcedureManagerprocedureOwner){Debug.Log(进入选角流程);}protectedoverridevoidOnUpdate(IFsmIProcedureManagerprocedureOwner,floatelapseSeconds,floatrealElapseSeconds){Debug.Log(选角流程运行中);if(Input.GetKeyDown(KeyCode.Keypad0)){Choose(procedureOwner,1,角色A);}elseif(Input.GetKeyDown(KeyCode.Keypad1)){Choose(procedureOwner,1,角色B);}}privatevoidChoose(IFsmIProcedureManagerprocedureOwner,intid,stringname){// 写入流程上下文必须用 Variable 家族VarInt32idVarReferencePool.AcquireVarInt32();idVar.Valueid;// VarInt32 的 Value 属性是 intprocedureOwner.SetDataVarInt32(SelectedCharacterId,idVar);VarStringnameVarReferencePool.AcquireVarString();nameVar.Valuename;procedureOwner.SetDataVarString(SelectedCharacterName,nameVar);Debug.Log($已选择角色{id}-{name}进入游戏流程);ChangeStateProcedureGame(procedureOwner);}protectedoverridevoidOnLeave(IFsmIProcedureManagerprocedureOwner,boolisShutdown){Debug.Log($选角流程运行结束:{procedureOwner.GetDataVarString(SelectedCharacterName).GetValue()});}protectedoverridevoidOnDestroy(IFsmIProcedureManagerprocedureOwner){Debug.Log(选角流程销毁);}}//----------------------------------------------------------------------------------------------------------------------publicclassProcedureGame:ProcedureBase{protectedoverridevoidOnInit(IFsmIProcedureManagerprocedureOwner){Debug.Log(游戏流程初始化);}protectedoverridevoidOnEnter(IFsmIProcedureManagerprocedureOwner){Debug.Log($游戏流程进入,当前使用角色为:{procedureOwner});}protectedoverridevoidOnUpdate(IFsmIProcedureManagerprocedureOwner,floatelapseSeconds,floatrealElapseSeconds){Debug.Log(游戏流程更新);if(Input.GetKeyDown(KeyCode.Escape)){ChangeStateProcedureLobby(procedureOwner);}}protectedoverridevoidOnLeave(IFsmIProcedureManagerprocedureOwner,boolisShutdown){Debug.Log(游戏流程结束);}protectedoverridevoidOnDestroy(IFsmIProcedureManagerprocedureOwner){Debug.Log(游戏流程卸载);}}//----------------------------------------------------------------------------------------------------------------------//下面这两个只是两个延伸出来的变量类//因为当Fsm状态机需要SetData时Data只能是引用池管理的变量类型//下面这两个只是一个变量载体而且具体的Data什么的都在基类里做好了没有啥拓展的成员或者方法publicclassVarInt32:Variableint{}publicclassVarString:Variablestring{}运行结果数据能够被存储到流程Fsm里能够跨流程状态调用流程状态能够根据Update的条件切换流程。