GeWuYou a79f02c987 docs(api): 添加 Core API 参考文档与事件系统接口文档
- 新增 Core API 参考文档,涵盖架构与模块、数据模型与系统、命令与查询等核心组件
- 添加事件系统接口详细文档,包括 IEvent、IEventBus、IUnRegister 等接口说明
- 提供完整的 API 使用示例路径、最佳实践与性能建议
- 包含架构图、依赖关系图与故障排查指南
- 添加测试用例参考与扩展方法说明
- [skip ci]
2026-01-21 23:45:10 +08:00

427 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 状态管理
<cite>
**本文引用的文件**
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs)
- [GFramework.Core/state/StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs)
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs)
- [GFramework.Core.Tests/state/StateMachineSystemTests.cs](file://GFramework.Core.Tests/state/StateMachineSystemTests.cs)
- [GFramework.Core.Tests/state/StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs)
- [GFramework.Core.Tests/state/StateTests.cs](file://GFramework.Core.Tests/state/StateTests.cs)
- [docs/tutorials/godot-integration.md](file://docs/tutorials/godot-integration.md)
- [GFramework.Core/system/README.md](file://GFramework.Core/system/README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向GFramework的状态管理系统围绕GameStateMachineSystem的有限状态机实现展开系统性阐述状态定义、转换规则与状态机生命周期管理详解IStateMachineSystem与IStateMachine接口设计理念以及IState接口的状态抽象与生命周期回调并结合游戏开发常见场景游戏状态、场景状态、UI状态给出管理策略、配置选项、API参考与实践示例。最后总结最佳实践、性能优化与调试技巧。
## 项目结构
状态管理相关代码主要分布在以下位置:
- 核心实现GFramework.Core/state状态机、上下文感知状态基类、状态变更事件
- 抽象接口GFramework.Core.Abstractions/state状态机与状态接口
- 游戏层扩展GFramework.Game/state游戏专用状态机系统
- 生命周期与架构集成GFramework.Core/system、GFramework.Core/architecture
- 测试与示例GFramework.Core.Tests/state、docs/tutorials/godot-integration.md、GFramework.Core/system/README.md
```mermaid
graph TB
subgraph "核心抽象"
IState["IState 接口"]
IStateMachine["IStateMachine 接口"]
IStateMachineSystem["IStateMachineSystem 接口"]
end
subgraph "核心实现"
StateMachine["StateMachine 类"]
StateMachineSystem["StateMachineSystem 类"]
ContextAwareStateBase["ContextAwareStateBase 基类"]
StateChangedEvent["StateChangedEvent 事件"]
end
subgraph "游戏层"
GameStateMachineSystem["GameStateMachineSystem 类"]
end
subgraph "生命周期与架构"
AbstractSystem["AbstractSystem 抽象系统"]
Architecture["Architecture 架构"]
end
IState --> StateMachine
IStateMachine --> StateMachine
IStateMachineSystem --> StateMachineSystem
StateMachineSystem --> StateMachine
ContextAwareStateBase --> IState
StateMachineSystem --> StateChangedEvent
GameStateMachineSystem --> StateMachineSystem
AbstractSystem --> StateMachineSystem
Architecture --> AbstractSystem
```
**图示来源**
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GFramework.Core/state/StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L200)
**章节来源**
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GFramework.Core/state/StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L200)
## 核心组件
- IState定义状态的最小契约包含进入、退出与转换判定三类回调。
- IStateMachine定义状态机的注册、切换、查询与历史管理能力。
- IStateMachineSystem在IStateMachine基础上叠加系统生命周期与上下文感知能力。
- StateMachineIStateMachine的具体实现负责状态注册、切换、历史记录与回调分发。
- StateMachineSystemIStateMachineSystem的具体实现扩展上下文注入、系统生命周期与状态变更事件广播。
- ContextAwareStateBaseIState与IContextAware的基类实现提供默认回调与上下文访问。
- GameStateMachineSystem游戏层专用状态机系统提供类型级查询与获取当前状态的便捷方法。
- StateChangedEvent状态变更事件载体携带旧状态与新状态引用。
**章节来源**
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [GFramework.Core/state/StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
## 架构总览
状态管理在GFramework中通过“抽象接口 + 核心实现 + 游戏层扩展”的分层设计组织,配合系统生命周期与架构阶段通知,形成可插拔、可扩展的状态机基础设施。
```mermaid
classDiagram
class IState {
+OnEnter(from)
+OnExit(to)
+CanTransitionTo(target) bool
}
class IStateMachine {
+Current : IState?
+Register(state) IStateMachine
+Unregister<T>()
+CanChangeTo<T>() bool
+ChangeTo<T>() bool
+IsRegistered<T>() bool
+GetState<T>() T?
+GetRegisteredStateTypes() IEnumerable<Type>
+GetPreviousState() IState?
+GetStateHistory() IReadOnlyList<IState>
+GoBack() bool
+ClearHistory()
}
class IStateMachineSystem {
}
class StateMachine {
-States : Dictionary<Type,IState>
-Current : IState?
+Register(state) IStateMachine
+Unregister<T>()
+CanChangeTo<T>() bool
+ChangeTo<T>() bool
+IsRegistered<T>() bool
+GetState<T>() T?
+GetRegisteredStateTypes()
+GetPreviousState() IState?
+GetStateHistory() IReadOnlyList<IState>
+GoBack() bool
+ClearHistory()
#ChangeInternal(next)
#ChangeInternalWithoutHistory(next)
#OnStateChanging(from,to)
#OnStateChanged(from,to)
#OnTransitionRejected(from,to)
}
class StateMachineSystem {
-_context : IArchitectureContext
+SetContext(ctx)
+GetContext() IArchitectureContext
+OnArchitecturePhase(phase)
+Init()
+Destroy()
#ChangeInternal(next)
}
class ContextAwareStateBase {
-_context : IArchitectureContext?
+SetContext(ctx)
+GetContext() IArchitectureContext
+OnEnter(from)
+OnExit(to)
+CanTransitionTo(target) bool
+Destroy()
}
class GameStateMachineSystem {
+IsIn<T>() bool
+Get<T>() T?
}
IStateMachine <|.. StateMachine
IStateMachineSystem <|.. StateMachineSystem
StateMachineSystem --|> StateMachine
ContextAwareStateBase ..|> IState
GameStateMachineSystem --|> StateMachineSystem
```
**图示来源**
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
## 详细组件分析
### IState 接口与 ContextAwareStateBase 基类
- 设计要点
- OnEnter/OnExit状态进入与退出的生命周期回调支持来源/目标状态传递。
- CanTransitionTo状态间转换的判定入口子类可按业务规则定制。
- ContextAwareStateBase提供上下文注入与默认空实现便于快速派生。
- 使用建议
- 在OnEnter中加载资源、订阅事件在OnExit中释放资源、取消订阅。
- 通过CanTransitionTo实现互斥状态、前置条件校验等规则。
**章节来源**
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Core/state/ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
### IStateMachine 与 StateMachine 实现
- 设计要点
- 注册/注销基于Type键的字典存储支持运行时动态管理。
- 切换流程先校验CanTransitionTo再触发回调更新Current并维护历史栈。
- 历史管理支持GoBack回退与最大历史长度限制。
- 查询能力:当前状态、历史、注册状态类型、是否可切换等。
- 关键流程(切换序列图)
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant SM as "StateMachine"
participant From as "当前状态"
participant To as "目标状态"
Caller->>SM : "ChangeTo<T>()"
SM->>SM : "查找目标状态"
SM->>From : "CanTransitionTo(To)"
alt "不可转换"
SM-->>Caller : "返回 false"
SM->>SM : "OnTransitionRejected(From, To)"
else "可转换"
SM->>SM : "OnStateChanging(From, To)"
SM->>From : "OnExit(To)"
SM->>SM : "Current = To"
SM->>To : "OnEnter(From)"
SM->>SM : "OnStateChanged(From, To)"
SM-->>Caller : "返回 true"
end
```
**图示来源**
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L88-L106)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L210-L248)
**章节来源**
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
### IStateMachineSystem 与 StateMachineSystem
- 设计要点
- 继承StateMachine并实现ISystem具备系统生命周期能力。
- Init阶段为实现了IContextAware的状态注入上下文。
- Destroy阶段安全退出当前状态并清理实现IDisposable的状态。
- ChangeInternal重写后在切换完成后广播StateChangedEvent。
- 生命周期(状态机系统)
```mermaid
flowchart TD
Start(["系统初始化"]) --> Init["Init()<br/>为ContextAware状态注入上下文"]
Init --> Ready["就绪"]
Ready --> Change["ChangeTo<T>()<br/>触发状态切换回调"]
Change --> Broadcast["广播StateChangedEvent"]
Broadcast --> Ready
Ready --> Destroy["Destroy()<br/>退出当前状态并清理"]
Destroy --> End(["结束"])
```
**图示来源**
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L51-L57)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L62-L78)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L84-L95)
**章节来源**
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
### GameStateMachineSystem游戏层
- 设计要点
- 在StateMachineSystem之上提供IsIn<T>()与Get<T>(),简化游戏层状态判断与获取。
- 应用场景
- 游戏主菜单、玩法中、暂停、结算等状态的快速判断与访问。
**章节来源**
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
### 状态变更事件 StateChangedEvent
- 作用:在状态切换完成后广播事件,携带旧状态与新状态引用,便于解耦监听者。
- 触发点StateMachineSystem.ChangeInternal内部。
**章节来源**
- [GFramework.Core/state/StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L84-L95)
### 与系统生命周期和架构集成
- AbstractSystem提供Init/Destroy与架构阶段通知的通用能力。
- Architecture统一管理模块、系统、模型与工具的注册与生命周期驱动系统按阶段运行。
- 集成路径StateMachineSystem作为ISystem参与架构生命周期管理。
**章节来源**
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L135-L200)
## 依赖关系分析
- 组件耦合
- StateMachine依赖IState接口通过字典管理状态实例低耦合高内聚。
- StateMachineSystem依赖架构上下文与事件总线扩展系统能力。
- GameStateMachineSystem仅提供游戏层便捷方法不改变核心状态机语义。
- 外部依赖
- 事件总线用于广播状态变更事件。
- 架构容器用于系统注册与生命周期管理。
```mermaid
graph LR
IState --> StateMachine
IStateMachine --> StateMachine
StateMachine --> StateMachineSystem
StateMachineSystem --> StateChangedEvent
GameStateMachineSystem --> StateMachineSystem
AbstractSystem --> StateMachineSystem
Architecture --> AbstractSystem
```
**图示来源**
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L200)
**章节来源**
- [GFramework.Core/state/StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [GFramework.Core/state/StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L200)
## 性能考量
- 状态切换成本
- 字典查找O(1)回调调用O(1),整体切换为常数时间。
- 历史栈维护与最大长度限制,避免无限增长导致内存压力。
- 线程安全
- 内部使用锁保护状态字典与历史栈,确保并发安全。
- 事件广播
- 状态变更事件仅在切换完成后触发,避免频繁广播造成性能损耗。
- 建议
- 控制状态数量与历史深度必要时调用ClearHistory清理。
- 在CanTransitionTo中做轻量判定避免昂贵计算阻塞切换。
[本节为通用指导,无需列出具体文件来源]
## 故障排查指南
- 常见问题
- 切换失败:确认目标状态已注册且当前状态允许转换。
- 回退无效:确认历史栈非空且目标状态仍处于注册状态。
- 资源泄漏确保实现IDisposable的状态在Destroy中清理。
- 单元测试参考
- 状态机切换与回调验证、注销影响、历史回退、事件广播等均有覆盖。
- 调试技巧
- 使用StateChangedEvent监听器观察切换轨迹。
- 在CanTransitionTo中加入日志定位转换拒绝原因。
- 在OnEnter/OnExit中记录关键资源的分配与释放。
**章节来源**
- [GFramework.Core.Tests/state/StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L1-L444)
- [GFramework.Core.Tests/state/StateMachineSystemTests.cs](file://GFramework.Core.Tests/state/StateMachineSystemTests.cs#L1-L367)
- [GFramework.Core.Tests/state/StateTests.cs](file://GFramework.Core.Tests/state/StateTests.cs#L1-L493)
## 结论
GFramework的状态管理系统以清晰的接口分层与稳健的实现提供了可扩展、可测试、可集成的状态机基础设施。通过IState/IStateMachine/IStateMachineSystem的职责分离结合上下文感知与事件广播既能满足游戏状态、场景状态与UI状态的多样化需求又能在架构生命周期内稳定运行。
[本节为总结性内容,无需列出具体文件来源]
## 附录
### API 参考(概览)
- IState
- OnEnter(from): void
- OnExit(to): void
- CanTransitionTo(target): bool
- IStateMachine
- Current: IState?
- Register(state): IStateMachine
- Unregister<T>(): IStateMachine
- CanChangeTo<T>(): bool
- ChangeTo<T>(): bool
- IsRegistered<T>(): bool
- GetState<T>(): T?
- GetRegisteredStateTypes(): IEnumerable<Type>
- GetPreviousState(): IState?
- GetStateHistory(): IReadOnlyList<IState>
- GoBack(): bool
- ClearHistory(): void
- IStateMachineSystem
- SetContext(ctx): void
- GetContext(): IArchitectureContext
- OnArchitecturePhase(phase): void
- Init(): void
- Destroy(): void
- GameStateMachineSystem
- IsIn<T>(): bool
- Get<T>(): T?
**章节来源**
- [GFramework.Core.Abstractions/state/IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [GFramework.Core.Abstractions/state/IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [GFramework.Core.Abstractions/state/IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [GFramework.Game/state/GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
### 实际使用示例(路径指引)
- Godot集成示例状态机控制器
- 示例路径docs/tutorials/godot-integration.md
- 关键片段:状态切换、输入处理与状态回调
- 系统化状态机管理(复杂状态机)
- 示例路径GFramework.Core/system/README.md
- 关键片段:状态转换规则、事件广播与命令触发
**章节来源**
- [docs/tutorials/godot-integration.md](file://docs/tutorials/godot-integration.md#L1083-L1184)
- [GFramework.Core/system/README.md](file://GFramework.Core/system/README.md#L367-L432)