You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:07