# Procedure ## 模块概述 Procedure 模块用于组织游戏主流程,如启动、登录、主城、战斗、结算等状态切换。它以 `ProcedureBase` 为模板方法基类,把生命周期拆成初始化、进入、离开、更新、销毁。 ## 快速开始 1. 挂载 `ProcedureComponent` 2. 定义多个继承 `ProcedureBase` 的流程 3. 调用 `InitializeProcedure` 4. 通过 `SwitchProcedure()` 切换 ## 架构说明 ```text ProcedureComponent └─ ProcedureService ├─ IProcedure └─ ProcedureBase ``` ## 核心类与接口 ### `IProcedureService` 公开能力: - `CurrentProcedureType` - `InitializeProcedure(...)` - `ClearAllProcedures()` - `ContainsProcedure(Type procedureType)` - `TrySwitchProcedure(Type procedureType)` ### `ProcedureBase` 生命周期模板: - `OnInit()` - `OnEnter()` - `OnLeave()` - `OnUpdate()` - `OnDestroy()` ## API 参考 ### `InitializeProcedure(IEnumerable availableProcedures, Type defaultProcedureType)` - 必填参数:`availableProcedures` - 必填参数:`defaultProcedureType` - 返回值:无 ### `TrySwitchProcedure(Type procedureType)` - 必填参数:`procedureType` - 返回值:`bool` ### `CurrentProcedureType` - 返回值:`Type` ## 完整使用示例 ```csharp using System; using AlicizaX; public sealed class BootProcedure : ProcedureBase { protected override void OnEnter() { SwitchProcedure(); } } public sealed class LoginProcedure : ProcedureBase { protected override void OnEnter() { Log.Info("Enter LoginProcedure"); } } public sealed class ProcedureExample { public void Initialize() { GameApp.Procedure.InitializeProcedure( new IProcedure[] { new BootProcedure(), new LoginProcedure() }, typeof(BootProcedure)); } } ``` ## 最佳实践 - 一个流程只负责一个清晰状态 - 初始化逻辑放 `OnInit`,进入/退出逻辑放 `OnEnter` / `OnLeave` ## 常见错误 - 未初始化就切换流程 - 把长时间并行任务塞入流程本身