Unity中如何正确获取按钮的IsHighlighted高亮状态?
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
相关产品推荐
相关产品推荐

