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

Unity2D Canvas实现仅指针进入可高亮、不可选中的按钮

解决方案

方法一:自定义脚本完全控制状态

默认Button的Transition逻辑很难彻底屏蔽Pressed/Selected状态,直接写个轻量脚本就能精准实现需求:

  1. 先给按钮的Image组件设置初始透明度(alpha设为100/255,也就是≈0.39)
  2. 创建C#脚本HoverOnlyButton.cs,代码如下:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class HoverOnlyButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    private Image _buttonImage;
    [SerializeField] private float _normalAlpha = 100f/255f;
    [SerializeField] private float _hoverAlpha = 1f;

    void Awake()
    {
        _buttonImage = GetComponent<Image>();
        SetAlpha(_normalAlpha);
        // 禁用按钮交互,彻底屏蔽Pressed/Selected状态
        GetComponent<Button>().interactable = false;
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        SetAlpha(_hoverAlpha);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        SetAlpha(_normalAlpha);
    }

    private void SetAlpha(float alpha)
    {
        Color temp = _buttonImage.color;
        temp.a = alpha;
        _buttonImage.color = temp;
    }
}
  1. 将脚本挂在目标Button上,确保Button组件存在(用来接收指针事件,但交互已禁用)
  2. 把Button的Transition设置为None,避免默认状态逻辑干扰

方法二:用EventTrigger零代码实现

不想写代码的话,用Unity自带的EventTrigger也能搞定:

  • 给按钮添加EventTrigger组件
  • 把Button组件的interactable设为false(或者直接移除Button组件)
  • 点击EventTrigger的「Add New Event Type」,分别添加Pointer Enter和Pointer Exit
  • Pointer Enter事件设置:拖拽按钮的Image组件到事件槽,选择Image -> Color,设置颜色alpha为1(全不透明)
  • Pointer Exit事件设置:同样拖拽Image组件,选择Image -> Color,设置alpha为100/255
  • 确保按钮的Raycast Target勾选(否则接收不到指针事件)

核心注意事项

  • 必须禁用Button的交互(或移除Button组件),才能彻底避免触发Pressed/Selected状态
  • 无论用哪种方法,都要把Button的Transition设为None,防止默认状态切换搞砸效果
  • 检查Canvas上的Graphic Raycaster组件是否存在,没有的话指针事件无法传递

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:24