# 状态管理 API
**本文引用的文件**
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs)
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs)
- [StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs)
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs)
- [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs)
- [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs)
- [StateMachineSystemTests.cs](file://GFramework.Core.Tests/state/StateMachineSystemTests.cs)
- [StateTests.cs](file://GFramework.Core.Tests/state/StateTests.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 GFramework.State 状态管理系统提供详细的 API 参考与实现说明,覆盖以下主题:
- IStateMachineSystem、IStateMachine、IState 的接口定义与职责边界
- 状态机的创建、启动、停止与状态转换流程
- 状态生命周期回调 OnEnter/OnExit/CanTransitionTo 的语义与最佳实践
- GameStateMachineSystem 的具体实现与扩展能力
- 状态持久化 API 与最佳实践(结合存储与序列化)
- 常见游戏状态示例:主菜单、游戏中、暂停等的实现思路与调用方式
## 项目结构
状态管理相关代码分布在以下模块:
- 核心抽象层:定义状态机与状态接口
- 核心实现层:提供通用状态机与上下文感知状态基类
- 游戏层:提供游戏专用的状态机系统扩展
- 测试层:验证状态机与系统的行为一致性
- 存储与序列化:提供状态持久化基础设施
```mermaid
graph TB
subgraph "核心抽象"
A["IState 接口"]
B["IStateMachine 接口"]
C["IStateMachineSystem 接口"]
end
subgraph "核心实现"
D["StateMachine 实现"]
E["StateMachineSystem 实现"]
F["ContextAwareStateBase 基类"]
G["StateChangedEvent 事件"]
end
subgraph "游戏层"
H["GameStateMachineSystem 扩展"]
end
subgraph "存储与序列化"
I["FileStorage 文件存储"]
J["ScopedStorage 作用域存储"]
K["SettingsPersistence 设置持久化"]
end
A --> D
B --> D
C --> E
D --> E
F --> D
E --> G
H --> E
I --> K
J --> I
```
**图表来源**
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258)
- [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L39)
**章节来源**
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258)
- [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L39)
## 核心组件
- IState:定义状态生命周期回调与转换判定
- OnEnter(from):进入状态时调用,from 为来源状态或 null
- OnExit(to):退出状态时调用,to 为目标状态或 null
- CanTransitionTo(target):判断是否允许转换到目标状态
- IStateMachine:状态机管理接口
- Current:当前激活状态
- Register/Unregister:注册与注销状态
- CanChangeTo/ChangeTo:条件检查与状态切换
- IsRegistered/GetState/GetRegisteredStateTypes:状态查询
- GetPreviousState/GetStateHistory/GoBack/ClearHistory:历史管理
- IStateMachineSystem:继承 ISystem 与 IStateMachine,提供系统生命周期与上下文感知能力
- StateMachine:IStateMachine 的通用实现
- StateMachineSystem:IStateMachineSystem 的通用实现,支持上下文注入、事件通知与资源清理
- ContextAwareStateBase:IState/IContextAware/IDisposable 的基类,提供默认回调与上下文访问
- GameStateMachineSystem:游戏层扩展,提供 IsIn() 与 Get()
**章节来源**
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
## 架构总览
状态机系统通过接口与实现分离,确保核心逻辑可复用、可测试;游戏层通过扩展提供领域增强。
```mermaid
classDiagram
class IState {
+OnEnter(from)
+OnExit(to)
+CanTransitionTo(target) bool
}
class IStateMachine {
+Current
+Register(state) IStateMachine
+Unregister()
+CanChangeTo() bool
+ChangeTo() bool
+IsRegistered() bool
+GetState() T?
+GetRegisteredStateTypes() IEnumerable
+GetPreviousState() IState?
+GetStateHistory() IReadOnlyList
+GoBack() bool
+ClearHistory()
}
class IStateMachineSystem {
}
class StateMachine {
-States : Dictionary
-Current : IState?
+Register(...)
+Unregister()
+CanChangeTo() bool
+ChangeTo() bool
+IsRegistered() bool
+GetState() T?
+GetRegisteredStateTypes() IEnumerable
+GetPreviousState() IState?
+GetStateHistory() IReadOnlyList
+GoBack() bool
+ClearHistory()
#ChangeInternal(next)
#ChangeInternalWithoutHistory(next)
#OnTransitionRejected(...)
#OnStateChanging(...)
#OnStateChanged(...)
}
class StateMachineSystem {
-context : IArchitectureContext
+SetContext(ctx)
+GetContext() IArchitectureContext
+Init()
+Destroy()
#ChangeInternal(next)
}
class ContextAwareStateBase {
-context : IArchitectureContext?
+SetContext(ctx)
+GetContext() IArchitectureContext
+OnEnter(from)
+OnExit(to)
+CanTransitionTo(target) bool
+Destroy()
}
class GameStateMachineSystem {
+IsIn() bool
+Get() T?
}
IStateMachine <|.. StateMachine
IStateMachineSystem <|.. StateMachineSystem
IState <|.. ContextAwareStateBase
StateMachineSystem --|> StateMachine
GameStateMachineSystem --|> StateMachineSystem
```
**图表来源**
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
## 详细组件分析
### IStateMachineSystem 接口
- 继承 ISystem 与 IStateMachine,提供系统生命周期钩子与状态机能力
- 适合在架构上下文中统一管理状态机的初始化、销毁与阶段事件
**章节来源**
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L1-L62)
### IStateMachine 接口
- 状态查询与管理:Register/Unregister、IsRegistered、GetState、GetRegisteredStateTypes
- 状态切换:CanChangeTo/ChangeTo
- 历史管理:GetPreviousState/GetStateHistory/GoBack/ClearHistory
- 返回值约定:ChangeTo 成功返回 true,失败返回 false;CanChangeTo 仅做条件判断,不触发切换
**章节来源**
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
### IState 接口
- OnEnter/OnExit:携带来源/目标状态,便于跨状态传递上下文
- CanTransitionTo:可按业务规则限制转换,如“只有在特定条件下才允许进入某状态”
**章节来源**
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
### StateMachine 实现
- 状态注册与注销:线程安全的字典存储,注销时若当前状态被注销则先触发 OnExit 并清空 Current
- 切换流程:先校验目标状态是否注册,再调用当前状态 CanTransitionTo,最终调用 ChangeInternal
- 历史记录:采用栈结构维护,支持 GoBack 回退;最大历史长度受构造参数控制
- 回调扩展点:OnTransitionRejected/OnStateChanging/OnStateChanged,便于日志、事件与调试
```mermaid
flowchart TD
Start(["进入 ChangeTo()"]) --> CheckReg["检查目标状态是否已注册"]
CheckReg --> |否| Throw["抛出异常并返回"]
CheckReg --> |是| CheckCan["调用 Current.CanTransitionTo(target)"]
CheckCan --> |否| Reject["触发 OnTransitionRejected 并返回 false"]
CheckCan --> |是| Internal["调用 ChangeInternal(target)"]
Internal --> ExitOld["Current?.OnExit(next)"]
ExitOld --> SetCur["Current = next"]
SetCur --> EnterNew["Current.OnEnter(old)"]
EnterNew --> Notify["触发 OnStateChanged(old, new)"]
Notify --> Done(["返回 true"])
```
**图表来源**
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L87-L106)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L210-L248)
**章节来源**
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
### StateMachineSystem 实现
- 上下文注入:Init 遍历已注册状态,为实现 IContextAware 的状态设置上下文
- 生命周期:OnArchitecturePhase 提供阶段事件入口;Destroy 退出当前状态并清理实现 IDisposable 的状态
- 事件通知:重写 ChangeInternal,在切换完成后发送 StateChangedEvent
```mermaid
sequenceDiagram
participant Sys as "StateMachineSystem"
participant SM as "StateMachine"
participant Bus as "事件总线"
participant Ctx as "架构上下文"
Sys->>Ctx : SetContext(context)
Sys->>SM : Register(state)
Sys->>Sys : Init()
Sys->>SM : ChangeTo()
SM->>SM : ChangeInternal(target)
SM->>Bus : Send(StateChangedEvent{OldState, NewState})
Sys->>Sys : Destroy()
Sys->>SM : Current.OnExit(null)
```
**图表来源**
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L25-L95)
- [StateChangedEvent.cs](file://GFramework.Core/state/StateChangedEvent.cs#L1-L19)
**章节来源**
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
### ContextAwareStateBase 基类
- 提供 SetContext/GetContext,便于状态访问架构服务
- 默认 OnEnter/OnExit/CanTransitionTo 均为空实现或返回 true,子类可按需覆写
- 支持 Destroy 资源清理
**章节来源**
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
### GameStateMachineSystem 扩展
- IsIn():快速判断当前状态类型
- Get():类型安全地获取当前状态实例
**章节来源**
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
## 依赖关系分析
- StateMachineSystem 继承 StateMachine 并实现 IStateMachineSystem,组合了系统生命周期与状态机能力
- ContextAwareStateBase 同时实现 IState 与 IContextAware/IDisposable,便于在系统中自动注入上下文
- GameStateMachineSystem 继承 StateMachineSystem,提供游戏层便捷查询
```mermaid
graph LR
IState --> ContextAwareStateBase
IStateMachine --> StateMachine
IStateMachineSystem --> StateMachineSystem
StateMachineSystem --> StateMachine
GameStateMachineSystem --> StateMachineSystem
```
**图表来源**
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
**章节来源**
- [StateMachineSystem.cs](file://GFramework.Core/state/StateMachineSystem.cs#L1-L96)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L1-L276)
- [ContextAwareStateBase.cs](file://GFramework.Core/state/ContextAwareStateBase.cs#L1-L74)
- [GameStateMachineSystem.cs](file://GFramework.Game/state/GameStateMachineSystem.cs#L1-L26)
## 性能考量
- 状态切换为 O(1) 操作(字典查找 + 栈操作),历史记录上限受 maxHistorySize 控制
- 线程安全:内部使用锁保护状态字典与历史栈,避免并发冲突
- 事件通知:切换后发送事件,注意事件订阅方的处理成本
- 上下文注入:Init 对实现 IContextAware 的状态逐一设置上下文,建议仅在必要时注册上下文感知状态
[本节为通用指导,无需列出具体文件来源]
## 故障排查指南
- 未注册状态切换:ChangeTo() 会在目标状态未注册时抛出异常;请先调用 Register 注册
- 转换被拒绝:当前状态 CanTransitionTo 返回 false 时,ChangeTo 返回 false;可通过 OnTransitionRejected 扩展日志
- 注销活跃状态:注销当前激活状态会触发 OnExit 并清空 Current;确认业务逻辑不会依赖已注销状态
- 历史回退:GoBack 会弹出历史栈并切换到上一状态;若上一状态已被注销,将递归查找更早的历史状态
**章节来源**
- [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L129-L135)
- [StateMachineTests.cs](file://GFramework.Core.Tests/state/StateMachineTests.cs#L164-L195)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L41-L67)
- [StateMachine.cs](file://GFramework.Core/state/StateMachine.cs#L156-L175)
## 结论
GFramework.State 通过清晰的接口分层与可扩展的实现,提供了稳定、可测试且易于集成的状态管理方案。结合 GameStateMachineSystem 的游戏层增强与存储/序列化基础设施,可满足从简单状态切换到复杂持久化场景的需求。
[本节为总结性内容,无需列出具体文件来源]
## 附录
### API 参考速查
- 状态机接口 IStateMachine
- 注册/注销:Register/Unregister()
- 查询:IsRegistered(), GetState(), GetRegisteredStateTypes()
- 切换:CanChangeTo(), ChangeTo()
- 历史:GetPreviousState(), GetStateHistory(), GoBack(), ClearHistory()
- 状态接口 IState
- OnEnter(from), OnExit(to), CanTransitionTo(target)
- 系统接口 IStateMachineSystem
- 继承 ISystem 与 IStateMachine,具备 Init/Destroy/OnArchitecturePhase 能力
**章节来源**
- [IStateMachine.cs](file://GFramework.Core.Abstractions/state/IStateMachine.cs#L1-L84)
- [IState.cs](file://GFramework.Core.Abstractions/state/IState.cs#L1-L26)
- [IStateMachineSystem.cs](file://GFramework.Core.Abstractions/state/IStateMachineSystem.cs#L1-L9)
### 状态持久化 API 与最佳实践
- 存储抽象
- IStorage/IFileStorage/IScopedStorage:提供键值存储、作用域封装与文件系统适配
- FileStorage:基于文件的线程安全存储,支持同步/异步读写与键名校验
- ScopedStorage:为键添加前缀,便于模块化隔离
- 序列化
- 与 ISerializer 配合使用,实现对象与文本的双向转换
- 设置持久化
- SettingsPersistence:异步加载/保存设置数据,支持事件通知
- 最佳实践
- 使用 ScopedStorage 为不同模块划分命名空间
- 对大对象采用压缩序列化,减少 IO 开销
- 在状态切换前后进行快照/恢复,确保一致性
- 对关键存档增加校验与回滚策略
**章节来源**
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258)
- [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L39)
### 常见游戏状态实现示例(思路与调用)
- 主菜单状态
- 定义 IState 或继承 ContextAwareStateBase
- OnEnter:初始化 UI、加载资源、播放背景音乐
- OnExit:清理 UI、停止音效
- CanTransitionTo:仅允许切换到“开始游戏”或“设置”等状态
- 使用 GameStateMachineSystem.IsIn() 判断当前状态
- 游戏中状态
- OnEnter:创建玩家、加载关卡、启动游戏循环
- OnExit:暂停游戏循环、清理实体
- CanTransitionTo:允许切换到“暂停”、“结算”、“主菜单”
- 暂停状态
- OnEnter:暂停计时、显示暂停界面
- OnExit:恢复计时、隐藏界面
- CanTransitionTo:允许回到“游戏中”或“主菜单”
调用流程示意(概念图):
```mermaid
flowchart TD
A["选择菜单项"] --> B["调用 GameStateMachineSystem.ChangeTo()"]
B --> C{"CanTransitionTo()"}
C --> |否| D["记录拒绝原因/日志"]
C --> |是| E["触发 OnExit(上一个状态)"]
E --> F["设置 Current = 新状态"]
F --> G["触发 OnEnter(来源状态)"]
G --> H["发送 StateChangedEvent"]
```
[本图为概念流程,不直接映射具体源码,故无图表来源]