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

Unity EventSystem无法注册BeginDrag/EndDrag事件,如何识别鼠标输入?

解决Unity卡牌拖拽事件未触发的问题

核心问题排查与修复步骤

  • 检查EventTrigger事件绑定
    你已添加EventTrigger组件,但必须手动将脚本的StartDrag和EndDrag方法绑定到对应事件:

    1. 选中卡牌预制体,在Inspector面板找到EventTrigger组件
    2. 点击Add New Event Type,分别添加BeginDrag和EndDrag事件
    3. 为这两个事件绑定DragAndDrop脚本中的StartDrag和EndDrag方法
  • 验证BoxCollider2D有效性

    • 确保BoxCollider2D组件处于启用状态(勾选组件前的复选框)
    • 调整Collider的大小与位置,使其完全覆盖SpriteRenderer显示的卡牌区域——射线检测依赖Collider的范围才能触发事件
  • 改用事件接口实现(更可靠)
    直接实现Unity的事件接口,无需手动绑定EventTrigger,避免绑定错误:

using UnityEngine;
using UnityEngine.EventSystems;

public class DragAndDrop : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
    private Vector3 offset;

    public void OnPointerDown(PointerEventData eventData)
    {
        // 计算鼠标与卡牌中心的偏移,避免拖拽时瞬移到鼠标位置
        offset = transform.position - Camera.main.ScreenToWorldPoint(eventData.position);
        Debug.Log("拖拽开始");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("拖拽结束");
    }

    public void OnDrag(PointerEventData eventData)
    {
        // 转换鼠标屏幕坐标为世界坐标,加上偏移量保持拖拽手感
        Vector3 newPos = Camera.main.ScreenToWorldPoint(eventData.position) + offset;
        newPos.z = 0; // 固定2D对象的Z轴层级
        transform.position = newPos;
    }
}

额外注意事项

  • 若卡牌位于UI Canvas下,需给Canvas添加GraphicRaycaster组件,而非给主相机添加PhysicsRaycaster2D(后者用于非UI的2D物理对象)
  • 确保卡牌所在层级没有被其他UI/对象遮挡,遮挡会导致射线无法检测到卡牌

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:33