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

游戏打包后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:12:21