一句话理解:状态模式把对象在不同状态下的行为封装到独立状态对象中,使对象切换状态时也随之切换行为。
它解决什么问题
角色的 Idle、Move、Attack、Stun 逻辑若集中在一个类里,通常会形成大型
switch,并散落大量“当前状态是否允许”的判断。状态模式把每个状态的行为和转换规则放回对应状态。C# 示例
实际 Unity 项目可让
MonoBehaviour.Update 调用状态机的 Tick,并把 Rigidbody、Animator 等依赖通过上下文提供给状态。转换由谁决定
- 状态决定:规则聚合在状态内部,扩展局部状态方便。
- 状态机决定:转换图更集中,便于可视化和审查。
- 独立 Transition 对象:适合复杂、数据驱动的状态机。
选择一种主要策略,避免转换逻辑四处分散。
状态模式与 FSM
有限状态机强调有限状态集合和转换规则;状态模式是实现这些行为的一种面向对象手段。简单 FSM 用枚举和
switch 完全合理,复杂后再拆状态对象。注意事项
明确进入、更新、退出的调用顺序;处理重入转换;避免每帧创建状态对象;为动画事件和异步任务提供取消机制。
小结
状态模式不是为了消灭所有条件判断,而是让与某个状态相关的行为和转换规则待在一起。复杂度不足时,枚举状态机更直接。