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

Unity中如何正确获取按钮的IsHighlighted高亮状态?

Unity中获取Button高亮状态的实现方法

Unity原生Button组件确实没有对外公开IsHighlighted属性,EventSystem.current.currentSelectedGameObject只能获取到EventSystem的导航选中对象,和Button的高亮判定规则不匹配,所以无法直接拿到正确状态,可通过以下两种方案实现:

方案1:自定义Button子类暴露内部状态(推荐,和原生逻辑完全同步)

Button的父类Selectable内部本身就维护了受保护的isHighlighted属性,只是没有对外暴露,自定义子类继承Button即可直接读取该值,不会和引擎内置的状态逻辑产生偏差:

using UnityEngine.UI;

public class HighlightCheckButton : Button
{
    // 对外公开高亮状态
    public bool IsButtonHighlighted => isHighlighted;
}

使用时将场景中原有Button组件替换为HighlightCheckButton,直接访问IsButtonHighlighted属性就能拿到和Button视觉表现完全一致的实时高亮状态。

方案2:扩展组件自行维护状态(无需替换原有Button组件)

如果不想修改现有Button组件,可以给Button挂载独立的追踪组件,通过UGUI的事件接口同步维护高亮状态,判定逻辑和原生保持一致:

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

public class ButtonHighlightState : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler
{
    public bool IsHighlighted { get; private set; }
    private Button _targetButton;

    private void Awake()
    {
        _targetButton = GetComponent<Button>();
    }

    public void OnPointerEnter(PointerEventData eventData) => RefreshState();
    public void OnPointerExit(PointerEventData eventData) => RefreshState();
    public void OnSelect(BaseEventData eventData) => RefreshState();
    public void OnDeselect(BaseEventData eventData) => RefreshState();

    private void RefreshState()
    {
        if (!_targetButton.IsInteractable())
        {
            IsHighlighted = false;
            return;
        }
        // 原生Button高亮触发规则:鼠标/指针悬停在按钮上,或按钮被EventSystem导航选中
        bool isPointerOver = EventSystem.current.IsPointerOverGameObject() &&
                             EventSystem.current.currentInputModule.pointerCurrentRaycast.gameObject == gameObject;
        bool isSelected = EventSystem.current.currentSelectedGameObject == gameObject;
        IsHighlighted = isPointerOver || isSelected;
    }

    private void Update()
    {
        // 帧级同步,避免特殊操作下状态漏更
        RefreshState();
    }
}

注意:不要单独使用currentSelectedGameObject判定高亮,这个值只代表导航选中状态,比如点击按钮后按钮会保持选中,但鼠标移开后高亮会消失,单独用这个接口判定必然和实际视觉状态不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:03:25