Unity2D Canvas实现仅指针进入可高亮、不可选中的按钮
解决方案
方法一:自定义脚本完全控制状态
默认Button的Transition逻辑很难彻底屏蔽Pressed/Selected状态,直接写个轻量脚本就能精准实现需求:
- 先给按钮的Image组件设置初始透明度(alpha设为
100/255,也就是≈0.39) - 创建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; } }
- 将脚本挂在目标Button上,确保Button组件存在(用来接收指针事件,但交互已禁用)
- 把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
相关产品推荐
相关产品推荐

