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

如何在Unity暂停菜单中禁用输入并停止分数计数

现有代码逻辑说明

这套实现是事件驱动的全局状态管理模式,和你之前用单个布尔值控制暂停的逻辑核心区别是:状态切换时会自动广播通知所有订阅了OnGameStateChanged事件的业务模块,不需要在每个脚本的Update周期里反复判断暂停状态,模块间耦合度更低。你之前写在角色移动脚本里的逻辑就是典型的订阅实现:状态切到暂停时直接禁用移动脚本,自然就不会执行移动逻辑。

输入禁用实现

和移动脚本的实现逻辑完全一致:

  • 如果你的输入逻辑统一封装在单独的输入管理脚本中,直接订阅OnGameStateChanged事件,暂停时把输入脚本的enabled设为false即可,所有输入检测逻辑都会停止执行,示例如下:
public class PlayerInputHandler : MonoBehaviour
{
    void Start()
    {
        GameStateManager.Instance.OnGameStateChanged += OnGameStateChanged;
    }

    private void OnDestroy()
    {
        GameStateManager.Instance.OnGameStateChanged -= OnGameStateChanged;
    }

    private void OnGameStateChanged(GameState newGameState)
    {
        enabled = newGameState == GameState.Gameplay;
    }

    void Update()
    {
        // 原有输入检测逻辑,脚本禁用后不会执行
        if(Input.GetKeyDown(KeyCode.Space))
        {
            // 跳跃逻辑
        }
    }
}
  • 如果输入逻辑分散在各个业务脚本中,也可以在每个输入判断的开头加状态校验:
void Update()
{
    // 暂停状态直接跳过输入检测
    if(GameStateManager.Instance.CurrentGameState == GameState.Paused)
        return;

    // 原有输入逻辑
}
分数累加停止实现

分两种常见场景处理:

  • 自动累加类分数(比如按时间周期固定加分):在分数管理脚本中订阅状态变化事件,暂停时停止累加的协程/Invoke,恢复游戏时重新启动即可。
  • 事件触发类分数(比如击杀敌人、拾取道具加分):在加分方法的最开头加状态判断,暂停状态下直接不执行加分逻辑即可。
    示例如下:
public class ScoreManager : MonoBehaviour
{
    public int currentScore;
    private Coroutine autoAddScoreCoroutine;

    void Start()
    {
        GameStateManager.Instance.OnGameStateChanged += OnGameStateChanged;
        autoAddScoreCoroutine = StartCoroutine(AutoAddScore());
    }

    private void OnDestroy()
    {
        GameStateManager.Instance.OnGameStateChanged -= OnGameStateChanged;
    }

    private void OnGameStateChanged(GameState newGameState)
    {
        if(newGameState == GameState.Paused)
        {
            if(autoAddScoreCoroutine != null)
                StopCoroutine(autoAddScoreCoroutine);
        }
        else
        {
            autoAddScoreCoroutine = StartCoroutine(AutoAddScore());
        }
    }

    // 自动累加分数协程
    IEnumerator AutoAddScore()
    {
        while(true)
        {
            currentScore += 5;
            yield return new WaitForSeconds(1f);
        }
    }

    // 事件触发加分方法
    public void AddScoreOnEvent(int addValue)
    {
        // 暂停状态下不执行加分
        if(GameStateManager.Instance.CurrentGameState != GameState.Gameplay)
            return;
        
        currentScore += addValue;
    }
}

如果你不想每个脚本都订阅事件,也可以直接在需要判断暂停的逻辑开头加状态校验,两种实现方式都可以按需选择。

内容的提问来源于stack exchange,提问作者imbruceter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:36:02