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; }
问题截图
- 首次暂停状态:

- 再次暂停状态:

- 相关设置截图:




解决方法
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
相关产品推荐
相关产品推荐

