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

Unity中切换图片选中状态时如何激活按钮周边环绕UI元素

Unity UGUI 按钮选中显示环绕装饰的实现方案

直接基于UGUI原生事件体系实现即可,和你已经配置完成的Navigation导航逻辑100%兼容,不需要额外重写输入检测逻辑。


方案一:单按钮独立监听(最推荐,零配置侵入)

利用UGUI内置的选中事件接口,每个按钮自行管理自身装饰的显隐,不需要全局管理状态:

  • 给每个带Button组件的图片对象挂载下面的脚本
  • 把该按钮对应的环绕装饰UI拖到脚本的selectionDecor字段上,默认把装饰对象设为隐藏
  • 不需要修改现有Button的任何Navigation配置,直接生效
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ButtonSelectionDecorator : MonoBehaviour, ISelectHandler, IDeselectHandler
{
    [SerializeField] private GameObject selectionDecor;

    private void Awake()
    {
        if (selectionDecor != null)
            selectionDecor.SetActive(false);
    }

    // 按钮进入选中状态时自动调用(摇杆切换、键盘切、鼠标点击、代码设置选中全触发)
    public void OnSelect(BaseEventData eventData)
    {
        if (selectionDecor != null)
            selectionDecor.SetActive(true);
    }

    // 按钮失去选中状态时自动调用
    public void OnDeselect(BaseEventData eventData)
    {
        if (selectionDecor != null)
            selectionDecor.SetActive(false);
    }

    // 给全局控制脚本留的调用接口
    public void SetDecorActive(bool isActive)
    {
        if (selectionDecor != null)
            selectionDecor.SetActive(isActive);
    }
}

这个方案是UGUI开发里的标准实现,不会出现输入适配问题,你要的两个核心功能都能直接覆盖:

  • 手柄/键盘的Submit键(默认回车、手柄A键)会自动触发当前选中按钮的OnClick事件,直接把你要的响应逻辑绑在Button的OnClick列表里就行
  • 已经配好的Navigation驱动的摇杆/方向键选中切换,会自动触发上面的OnSelect/OnDeselect逻辑,装饰显隐自动同步

方案二:全局统一追踪(适合装饰是公共动态对象的场景)

如果你的环绕装饰是一个全局复用的动效框,不是每个按钮单独带的装饰图,就用全局监听的方式:

  • 把下面的脚本挂在场景里的EventSystem对象上
  • 所有按钮还是挂上面的ButtonSelectionDecorator脚本,用来存自身装饰的引用
  • 脚本会自动追踪当前选中的按钮,同步装饰状态
using UnityEngine;
using UnityEngine.EventSystems;

public class GlobalSelectionTracker : MonoBehaviour
{
    private GameObject _lastSelected;

    private void Update()
    {
        GameObject currentSelected = EventSystem.current.currentSelectedGameObject;
        if (currentSelected == _lastSelected) return;

        // 关闭上一个选中项的装饰
        if (_lastSelected != null)
        {
            var lastDecor = _lastSelected.GetComponent<ButtonSelectionDecorator>();
            lastDecor?.SetDecorActive(false);
        }

        // 激活当前选中项的装饰
        if (currentSelected != null)
        {
            var currentDecor = currentSelected.GetComponent<ButtonSelectionDecorator>();
            currentDecor?.SetDecorActive(true);
        }

        _lastSelected = currentSelected;
    }
}

常见踩坑提示

  • 如果打开新UI面板时,默认选中的按钮不显示装饰,在面板的OnEnable生命周期里加一句EventSystem.current.SetSelectedGameObject(默认按钮对象)即可,这是UGUI本身的机制问题,新面板打开时不会自动触发初始选中对象的OnSelect事件
  • 该逻辑和Button自带的Color Tint、Sprite Swap、Animation过渡完全不冲突,两个逻辑会并行生效
  • 如果要支持鼠标点击移开后取消选中,给Button加个IPointerClickHandler接口,点击时主动把当前对象设为选中项即可,避免鼠标点完选中状态丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:57:22