游戏打包后OnPointerEnter与OnPointerExit事件无法正常工作
解决Unity打包后IPointerEnter/Exit事件失效问题
问题描述
编辑器运行模式下,鼠标悬停在会位移的按钮上时,OnPointerEnter和OnPointerExit事件可正常触发;但游戏打包后,悬停按钮时这两个事件完全失效,已开启Raycast Target,无法定位原因。
相关代码
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class CardUp : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { private Vector2 normalPos; void Start() { normalPos = gameObject.GetComponent<RectTransform>().position; } public void OnPointerEnter(PointerEventData eventData) { LeanTween.move(gameObject, new Vector2(normalPos.x, normalPos.y + 150), 0.3f); } public void OnPointerExit(PointerEventData eventData) { LeanTween.move(gameObject, new Vector2(normalPos.x, normalPos.y), 0.3f); } }
解决方案
- 改用
anchoredPosition替代position:UI元素的position是世界坐标,受父物体布局影响,打包后可能因布局计算差异导致射线检测偏移。建议存储并操作RectTransform的anchoredPosition,同时使用LeanTween针对RectTransform的移动方法:private Vector2 normalAnchoredPos; void Start() { normalAnchoredPos = GetComponent<RectTransform>().anchoredPosition; } public void OnPointerEnter(PointerEventData eventData) { LeanTween.moveRectTransform(GetComponent<RectTransform>(), new Vector2(normalAnchoredPos.x, normalAnchoredPos.y + 150), 0.3f); } public void OnPointerExit(PointerEventData eventData) { LeanTween.moveRectTransform(GetComponent<RectTransform>(), normalAnchoredPos, 0.3f); } - 检查EventSystem状态:确保打包后的场景中存在且仅有一个
EventSystem对象(可通过GameObject → UI → Event System添加),多个EventSystem会导致事件分发异常。 - 排查UI遮挡:检查是否有其他UI元素(如透明面板)在目标按钮上方,误开启了
Raycast Target导致遮挡射线。可在Scene视图中调整UI层级,确保目标按钮处于最上层。 - 核对Player Settings:在
Player Settings中,将Input Handling设置为Both或Mouse, Keyboard, & Touch,若设置为仅触摸模式,鼠标悬停事件会失效。 - 强制确认Raycast Target状态:在LeanTween移动完成后,重新设置
Raycast Target为true,避免动画过程中意外修改该属性:LeanTween.moveRectTransform(...) .setOnComplete(() => GetComponent<Graphic>().raycastTarget = true);
内容的提问来源于stack exchange,提问作者Abyzls
相关产品推荐
相关产品推荐

