104 lines
2.0 KiB
Markdown
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`
|
||
|
|
|
||
|
|
## 常见错误
|
||
|
|
|
||
|
|
- 未初始化就切换流程
|
||
|
|
- 把长时间并行任务塞入流程本身
|