Unity EventSystem无法注册BeginDrag/EndDrag事件,如何识别鼠标输入?
解决Unity卡牌拖拽事件未触发的问题
核心问题排查与修复步骤
检查EventTrigger事件绑定
你已添加EventTrigger组件,但必须手动将脚本的StartDrag和EndDrag方法绑定到对应事件:- 选中卡牌预制体,在Inspector面板找到EventTrigger组件
- 点击
Add New Event Type,分别添加BeginDrag和EndDrag事件 - 为这两个事件绑定
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
相关产品推荐
相关产品推荐

