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

Unity C# 首次按Esc弹出暂停面板光标不显示后续操作正常问题求助

问题根因

这不是Unity的Bug,核心问题有两个:

  • 你只修改了Cursor.visible属性,没有同步处理Cursor.lockState。打包后Unity默认光标是CursorLockMode.Locked状态,会被锁定在窗口中心且强制隐藏,仅修改visible不会生效,必须同步将lockState改为CursorLockMode.None才能显示光标。
  • 你设置了cursorHide和gamePause两个独立的状态变量,逻辑上两者应该完全绑定,分开维护容易出现状态不一致的隐患。
修复后的代码
public class MenuManager : MonoBehaviour
{
    public GameObject pauseMenu;
    public bool gamePause = false;

    // Start is called before the first frame update
    void Start()
    {
        // 初始状态隐藏锁定光标
        UpdateCursorAndPauseState();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            gamePause = !gamePause;
            UpdateCursorAndPauseState();
        }
    }

    private void UpdateCursorAndPauseState()
    {
        pauseMenu.SetActive(gamePause);
        // 暂停时显示解锁光标,运行时隐藏锁定光标
        Cursor.visible = gamePause;
        Cursor.lockState = gamePause ? CursorLockMode.None : CursorLockMode.Locked;
    }

    public void QuitGame()
    {
        Application.Quit();
    }

    // 后续添加按钮触发暂停/继续可直接调用该方法
    public void TogglePause()
    {
        gamePause = !gamePause;
        UpdateCursorAndPauseState();
    }
}
新手开发建议
  • 调用Unity系统级API前先确认相关依赖属性,光标控制、输入系统、场景加载这类API都有配套的关联配置,不要仅修改单个属性就判定逻辑生效。
  • 相同逻辑的状态变量尽量合并维护,不要出现两个表示同一状态的变量,避免后续迭代时出现状态不同步的问题。
  • 通用逻辑尽量封装成独立方法,比如把暂停状态同步的逻辑单独封装,后续不管是按键触发还是按钮点击都可以复用,减少重复代码。
  • 测试光标这类打包才生效的逻辑时,可以先在编辑器播放模式下,打开Game视图右上角菜单里的「Lock Cursor」选项测试,不用每次都打包,能节省大量时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:45:02