AlicizaX/Client/Assets/Books/Framework/Runtime/Procedure.md
2026-04-01 13:20:06 +08:00

104 lines
2.0 KiB
Markdown

# Procedure
## 模块概述
Procedure 模块用于组织游戏主流程,如启动、登录、主城、战斗、结算等状态切换。它以 `ProcedureBase` 为模板方法基类,把生命周期拆成初始化、进入、离开、更新、销毁。
## 快速开始
1. 挂载 `ProcedureComponent`
2. 定义多个继承 `ProcedureBase` 的流程
3. 调用 `InitializeProcedure`
4. 通过 `SwitchProcedure<T>()` 切换
## 架构说明
```text
ProcedureComponent
└─ ProcedureService
├─ IProcedure
└─ ProcedureBase
```
## 核心类与接口
### `IProcedureService`
公开能力:
- `CurrentProcedureType`
- `InitializeProcedure(...)`
- `ClearAllProcedures()`
- `ContainsProcedure(Type procedureType)`
- `TrySwitchProcedure(Type procedureType)`
### `ProcedureBase`
生命周期模板:
- `OnInit()`
- `OnEnter()`
- `OnLeave()`
- `OnUpdate()`
- `OnDestroy()`
## API 参考
### `InitializeProcedure(IEnumerable<IProcedure> 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<LoginProcedure>();
}
}
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`
## 常见错误
- 未初始化就切换流程
- 把长时间并行任务塞入流程本身