Unity 2D UI元素OnMouseOver/OnMouseEnter悬停检测位置偏移问题求助
问题原因
OnMouseEnter类API是为世界空间的3D/2D物体设计的,依赖物体上挂载的Collider/Collider2D进行边界检测。UGUI元素的显示位置会受Canvas缩放、屏幕适配规则动态调整,但Collider的世界坐标边界不会同步适配,因此会出现检测位置和UI实际显示位置不匹配的偏移,属于接口使用场景不匹配导致的问题。
正确实现方案
UGUI原生提供了专用于UI交互的事件接口,无需额外添加Collider,适配所有Canvas缩放模式,不会出现偏移问题,实现步骤如下:
- 确认目标Image组件已勾选
Raycast Target选项(默认开启) - 确认场景中存在EventSystem对象(新建UI元素时Unity会自动生成,缺失可手动右键创建:
UI → Event System) - 修改Node脚本,实现
IPointerEnterHandler和IPointerExitHandler接口即可,参考代码如下:
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class Node : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler { [HideInInspector] private Color32 canPlaceColor = new Color32(159, 255, 159, 255); private Color32 originalColor; private void Awake() { originalColor = GetComponent<Image>().color; } public void OnPointerEnter(PointerEventData eventData) { GetComponent<Image>().color = canPlaceColor; } public void OnPointerExit(PointerEventData eventData) { GetComponent<Image>().color = originalColor; } public void OnDrop(PointerEventData eventData) { // 保留原有拖放逻辑即可 } }
内容的提问来源于stack exchange,提问作者eligolf
相关产品推荐
相关产品推荐

