GameFramework 开发脚手架之 Procedure 流程管理

1,379 阅读3分钟

项目 github地址

打开项目选GameLauncher场景,直接启动游戏。我用的是 Unity 2021.3.6f1 版本。但应该是2017之后的都支持,没有实测过。

参考

GameFramework框架详解之 Procedure 流程管理

老规矩,先看上面这篇文章。重构后的项目保留了框架的启动逻辑和流程。

简单总结一下实现原理

  1. 每一个 Procedure 都继承自 ProcedureBase。
  2. 每一个 Procedure 其实就是状态机的一个状态 FSMState。
  3. procedureOwner 其实就是 procedureManager,管理所有的FSMState和状态的生命周期。同时,procedureOwner 还用来作为流程的上下文,存储流程之间的共享数据。
  4. ProcedureComponent会在启动的时候创建这个状态机。

流程重构

游戏用流程的不同阶段来解耦和隔离业务功能是一种很好的模式。但原来的StartForce项目,只是简单的把流程作为串联业务的场所,混合了太多逻辑。所以这里把 StartForce 进行了重构,重构之后:

  1. 流程 ProcedureXXX 职责更单一,只负责流程的切换和流程自己的生命周期控制。
  2. 和当前业务相关的业务逻辑,UI逻辑,等都放在当前业务的目录下,让业务代码更具内聚性。
  3. 如果某些非业务功能或UI是各个流程共用的,比如某些UI界面可能在多个流程都用到,就放到 Comm/UI 目录下面。
  4. 如果某些业务是多个流程共用的,就放到Scripts/Game/Bs/XXX 目录下面,根据业务模块来做扩展。

总的来说,就是把整个游戏业务按不同的流程进行拆分(一般会对应不同的场景),也就是说尽量按照场景来组织ui和业务(这个场景有哪些ui,有哪些业务),如果遇到共用的ui和业务,就往上提。

使用

先上个截图

image.png

添加流程分三步

  1. ProcedureXXX 继承 ProcedureBase,实现对应的五个方法。 OnInit,OnEnter,OnUpdate,OnLeave,OnDestroy

  2. OnUpdate 里面做流程切换逻辑,状态切换通过ChangeState方法完成。

  3. 业务逻辑弄好之后,在图中的 Procedure 组件节点配置流程。
    框架会自动发现继承了ProcedureBase的流程,只要在新增的流程前面打钩就好了,就会加入到框架的流程管理系统。

几点说明

  1. 如果需要在流程之间传递数据,或者说有数据上的依赖,统一使用 ProcedureDataMgr 进行设置和获取,不要直接使用 procedureOwner。

  2. 在 Procedure 组件节点配置中的入口配置,"Entrance Procedure",选 ProcedureLaunch 是游戏启动流程,选 ProcedureTest 则是启动的测试流程,项目中的测试用例是用这个流程启动的。

  3. 流程的业务逻辑,不要写在 在 ProcedureXXX 里。
    ProcedureXXX 应该只处理流程相关的业务,流程的进入退出等,或者通过 ProcedureDataMgr 来获取和设置数据。
    具体流程内的业务,统一在 ProcedureXXXMgr 中去实现。

最后,借用一下PassionY的 StarForce 流程图,可以按照这个流程图来尝试调试下游戏,看看每个流程是怎么串联起来的。重构之后的代码很容易看懂,设个断点跟着跑跑,很快就能看懂(默认的是编辑器模式,只涉及到6个流程)。

image.png