Unity答题类游戏如何基于状态机模式实现多游戏模式的架构设计?
答题类游戏多模式架构优化方案
你当前的状态机架构整体方向是对的,核心问题是把状态自身的执行逻辑和状态的跳转规则强绑定了,按照下面的调整就能解决复用性问题:
1. 解耦状态与跳转逻辑
把状态的跳转决策权从State本身移到所属的GameMode中。你可以给State基类加一个完成回调事件,状态只需要在自身逻辑执行完毕时触发回调,不需要关心接下来要跳去哪:
public abstract class State { protected readonly GameMode _owner; // 状态完成时触发的事件,跳转逻辑由GameMode定义 public event Action OnFinished; protected State(GameMode owner) { _owner = owner; } public abstract void Start(); public abstract void Tick(float deltaTime); public abstract void End(); // 子类执行完逻辑调用这个方法触发回调 protected void InvokeFinished() { OnFinished?.Invoke(); } }
比如通用的PreparationState逻辑只负责处理准备倒计时、UI显示,倒计时结束调用InvokeFinished()即可。不同的GameMode在实例化这个状态时,自己绑定回调跳转到对应状态:
// 标准模式里的逻辑 var prepareState = new PreparationState(this); prepareState.OnFinished += () => ChangeState(new StandardAnswerState(this)); // 竞速模式里的逻辑 var prepareState = new PreparationState(this); prepareState.OnFinished += () => ChangeState(new SpeedAnswerState(this));
这样所有需要准备阶段的模式都可以直接复用同一个PreparationState,不需要重复写逻辑。
2. 抽离通用逻辑到独立服务层
把所有模式通用的逻辑从State和GameMode里剥离,做成无状态的公共服务,各个模式按需调用即可:
TimerService:统一处理所有计时需求,支持暂停、重置、倒计时结束回调,所有准备计时、答题计时都通过它实现QuestionService:封装题库拉取、答案校验、题目难度匹配逻辑,避免每个模式重复实现ScoringService:提供基础得分计算方法,不同模式可以传入自定义参数(比如竞速模式传入剩余时间作为倍率)得到最终得分
3. GameMode层的简化
GameMode不需要强行继承MonoBehaviour,如果你需要在Inspector面板配置模式参数,可以把配置做成ScriptableObject,GameMode作为普通C#类持有配置即可。每个GameMode只需要负责三件事:
- 持有当前模式的独有配置(题目数量、得分规则、是否开启超时惩罚等)
- 定义本模式的状态流转规则,初始化各个状态并绑定跳转逻辑
- 实现
Start()、Pause()、End()等生命周期接口,供上层QuizSystem统一调度
4. 多场景还是单场景?
答题类游戏的UI复用度非常高,完全不需要每个模式做单独场景,反而会增加资源冗余和加载开销。你可以做一套通用UI组件,不同模式激活/隐藏对应的组件即可:比如竞速模式显示剩余时间加分提示,标准模式隐藏该组件即可。
内容的提问来源于stack exchange,提问作者Starczi
相关产品推荐
相关产品推荐

