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

Unity暂停菜单多次暂停后按钮失去焦点(高亮)问题求助

Unity暂停菜单按钮焦点丢失问题解决

问题现象

首次打开暂停菜单时,按钮可正常高亮显示;但恢复游戏后再次暂停,按钮会失去焦点(无高亮状态),只有按下方向键或游戏摇杆后才会重新高亮。尝试在Pause()方法中调用resumeBtn.Select()设置焦点,但未生效。

相关代码

void Update()
{
    var gamepad = Gamepad.current;
    var keyboard = Keyboard.current;
    if (gamepad == null && keyboard == null)
        return; // 无控制器或键盘连接
    if ((gamepad != null && gamepad.startButton.wasPressedThisFrame) || (keyboard != null && keyboard.pKey.wasPressedThisFrame))
    {
        if (GameIsPaused)
        {
            Resume();
        }
        else
        {
            Pause();
        }
    }
}

public void Resume()
{
    player.gameObject.GetComponent<MyPlayerMovement>().enabled = true;
    pauseMenuUI.SetActive(false);
    Time.timeScale = 1f;
    GameIsPaused = false;
    // GameObject.Find("ThePlayer").GetComponent<MyPlayerMovement>().enabled = false;
    // GameObject.Find("ThePlayer").GetComponent<InteractIcons>().enabled = false;
}

private void Pause()
{
    player.gameObject.GetComponent<MyPlayerMovement>().enabled = false;
    pauseMenuUI.SetActive(true);
    resumeBtn.Select();
    Time.timeScale = 0f;
    GameIsPaused = true;
    // GameObject.Find("ThePlayer").GetComponent<MyPlayerMovement>().enabled = true;
    // GameObject.Find("ThePlayer").GetComponent<InteractIcons>().enabled = true;
}

问题截图

  • 首次暂停状态:首次暂停按钮高亮
  • 再次暂停状态:再次暂停按钮无高亮
  • 相关设置截图:
    Inspector设置截图
    按钮设置截图
    UI设置截图
    按钮组件截图

解决方法

1. 延迟设置焦点(最常见修复)

UI激活后需要一帧时间完成初始化,立刻调用Select()可能不生效,改用延迟调用:

private void Pause()
{
    player.gameObject.GetComponent<MyPlayerMovement>().enabled = false;
    pauseMenuUI.SetActive(true);
    // 延迟0.01秒(一帧)执行焦点设置
    Invoke(nameof(SetResumeBtnFocus), 0.01f);
    Time.timeScale = 0f;
    GameIsPaused = true;
}

private void SetResumeBtnFocus()
{
    resumeBtn.Select();
    // 强制通知EventSystem更新选中对象
    EventSystem.current.SetSelectedGameObject(resumeBtn.gameObject);
}

2. 恢复游戏时清空焦点

恢复游戏时,EventSystem可能仍保留之前的选中对象,导致下次暂停时焦点冲突:

public void Resume()
{
    player.gameObject.GetComponent<MyPlayerMovement>().enabled = true;
    pauseMenuUI.SetActive(false);
    // 清空当前选中对象,避免干扰下次暂停
    EventSystem.current.SetSelectedGameObject(null);
    Time.timeScale = 1f;
    GameIsPaused = false;
}

3. 利用UI激活回调

给暂停菜单UI添加OnEnable回调,每次激活时自动设置焦点:
在暂停菜单的GameObject上添加如下脚本:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class PauseMenuFocusHandler : MonoBehaviour
{
    public Button resumeBtn;

    void OnEnable()
    {
        resumeBtn.Select();
        EventSystem.current.SetSelectedGameObject(resumeBtn.gameObject);
    }
}

添加后无需在Pause()方法中手动调用Select()。

4. 检查导航与组件设置

  • 确认resumeBtn的Selectable组件处于启用状态;
  • 检查按钮的导航设置(从截图看),确保上下左右的导航目标配置正确,没有冲突;
  • 确认EventSystem对象在场景中正常存在且未被禁用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:35:15