Unity MyFramework 用法说明(五):使用 GameScene 和 SceneProcedure 管理业务流程

📅 2026/7/13 18:28:26
Unity MyFramework 用法说明(五):使用 GameScene 和 SceneProcedure 管理业务流程
前面已经完成了界面的创建、生成和打开。这一篇介绍如何使用GameScene和树形SceneProcedure管理主界面、背包等业务流程。项目地址https://github.com/ZHOURUIH/MyFramework一、本篇目标在MainScene中创建下面的流程结构MainScene ├── MainSceneHome │ └── MainSceneBag └── MainSceneExit进入MainSceneHome时显示主界面进入它的子流程MainSceneBag时打开背包返回后恢复主界面状态。这里的返回关系由SceneProcedure管理而不是在LayoutManager中维护一个全局 UI 返回栈。二、注册场景流程修改MainScene.csusing System; public class MainScene : GameScene { public override void assignStartExitProcedure() { mStartProcedure typeof(MainSceneHome); mExitProcedure typeof(MainSceneExit); } public override void createSceneProcedure() { addProcedureMainSceneHome(); addProcedureMainSceneBag(typeof(MainSceneHome)); addProcedureMainSceneExit(); } }其中addProcedureMainSceneHome();注册一个根流程。addProcedureMainSceneBag(typeof(MainSceneHome));表示MainSceneBag是MainSceneHome的子流程。三、创建主流程创建MainSceneHome.cspublic class MainSceneHome : SceneProcedure { protected override void onInit(SceneProcedure lastProcedure) { LT.LOADUIMain(); } protected override void onInitFromChild(SceneProcedure lastProcedure) { LT.SHOWUIMain(); } protected override void onExitToChild(SceneProcedure nextProcedure) { LT.HIDEUIMain(); } protected override void onExit(SceneProcedure nextProcedure) { LT.HIDEUIMain(); } }几个生命周期的用途如下onInit 从其他流程第一次进入当前流程 onInitFromChild 从自己的子流程返回 onExitToChild 进入自己的子流程 onExit 离开当前流程且目标不是自己的子流程当进入背包时MainSceneHome不会被完全退出只会执行onExitToChild。从背包返回以后则执行onInitFromChild。四、创建背包子流程创建MainSceneBag.cspublic class MainSceneBag : SceneProcedure { protected override void onInit(SceneProcedure lastProcedure) { LT.LOADUIBag(); } protected override void onExit(SceneProcedure nextProcedure) { LT.HIDEUIBag(); } }MainSceneBag只关心背包界面。它不需要处理主界面也不需要知道主界面应该如何恢复这些逻辑由父流程MainSceneHome自己负责。这就是树形流程的主要作用父流程管理父流程的界面 子流程管理子流程的界面 每个流程只处理自己的状态五、从主界面进入背包在UIMain中增加背包按钮protected myUGUIImageSimple mBagButton;节点绑定和点击注册可以由UGUIGenerator自动生成newObject(out mBagButton, BagButton); mBagButton.registeColliderImage(onBagButtonClick);点击后切换到背包流程protected void onBagButtonClick() { mGameSceneManager.getCurScene().changeProcedureMainSceneBag(); }执行流程如下MainSceneHome ↓ onExitToChild MainSceneBag ↓ onInit 打开 UIBag六、从背包返回主界面在UIBag的返回按钮中切换回父流程protected void onBackButtonClick() { FrameUtility.changeProcedureMainSceneHome(); }切换时MainSceneBag ↓ onExit MainSceneHome ↓ onInitFromChild 恢复 UIMain也可以使用场景记录的上一个流程protected void onBackButtonClick() { FrameUtility.backToLastProcedure(); }明确知道目标流程时直接调用changeProcedureT()会更清楚通用返回按钮则可以使用backToLastProcedure()。七、为什么使用树形流程如果背包、商城、任务都属于主界面的子功能可以这样注册public override void createSceneProcedure() { addProcedureMainSceneHome(); addProcedureMainSceneBag(typeof(MainSceneHome)); addProcedureMainSceneShop(typeof(MainSceneHome)); addProcedureMainSceneTask(typeof(MainSceneHome)); addProcedureMainSceneExit(); }结构如下MainSceneHome ├── MainSceneBag ├── MainSceneShop └── MainSceneTask进入任意子流程时父流程统一执行protected override void onExitToChild(SceneProcedure nextProcedure) { LT.HIDEUIMain(); }从任意子流程返回时父流程统一执行protected override void onInitFromChild(SceneProcedure lastProcedure) { LT.SHOWUIMain(); }不需要在背包、商城和任务流程里分别处理主界面。八、父流程和子流程都会更新当前处于子流程时框架会先更新父流程再更新子流程MainSceneHome.onUpdate ↓ MainSceneBag.onUpdate因此可以把多个子流程都需要的公共逻辑放在父流程中public class MainSceneHome : SceneProcedure { protected override void onUpdate(float elapsedTime) { // 主城公共更新逻辑 } }背包流程只处理背包自己的更新public class MainSceneBag : SceneProcedure { protected override void onUpdate(float elapsedTime) { // 背包流程更新逻辑 } }没有持续更新需求时不需要重写onUpdate。九、场景退出流程MainSceneExit一般用于统一清理当前场景资源public class MainSceneExit : SceneProcedure { protected override void onInit(SceneProcedure lastProcedure) { } protected override void onExit(SceneProcedure nextProcedure) { genericExit(0); } }genericExit会卸载当前场景中的局部界面。需要按资源标签清理特效和 Prefab 时可以传入有效标签genericExit(MAIN_SCENE_RESOURCE_TAG);十、职责划分建议保持下面的分工GameScene 注册流程并指定入口、出口流程 SceneProcedure 管理当前业务状态和所属界面 LayoutScript 处理界面显示与交互 LayoutManager 管理界面的加载、显示、隐藏和卸载不要让LayoutManager决定背包应该返回哪里。返回目标属于业务流程应该由SceneProcedure决定。十一、总结使用场景流程的基本步骤是1. 在 GameScene 中注册流程 2. 通过 parent 参数建立父子关系 3. 在 onInit 中打开当前流程界面 4. 在 onExitToChild 中处理进入子流程 5. 在 onInitFromChild 中恢复父流程 6. 使用 changeProcedureT() 切换流程树形SceneProcedure可以让每个流程只关心自己的界面和状态避免所有页面切换逻辑都集中到一个全局 UI 管理器中。