当前位置: 首页 > news >正文

Unity 拖动物体技术文档

📌 前提条件

  • 场景中必须有 EventSystem(除非使用 OnMouseDrag)。
  • 拖拽目标必须能被事件系统或物理系统检测到:
    • UI 元素:Canvas + GraphicRaycaster。
    • 3D 物体:Collider + Camera 上的 PhysicsRaycaster。

🖼 拖拽 UI 元素(Canvas 内的 Image/Button)

核心代码

using UnityEngine;
using UnityEngine.EventSystems;public class UIDrag : MonoBehaviour, IBeginDragHandler, IDragHandler
{private Vector2 offset;public void OnBeginDrag(PointerEventData eventData){offset = new Vector2(transform.position.x, transform.position.y) - eventData.position;}public void OnDrag(PointerEventData eventData){transform.position = eventData.position + offset;}
}

特点

  • 无需 Collider
  • 无需 PhysicsRaycaster,只要 Canvas 上有 GraphicRaycaster
  • 坐标直接使用 eventData.position,不需要考虑 z 深度。

🎲 拖拽 3D 世界物体(使用 IDragHandler)

核心代码

using UnityEngine;
using UnityEngine.EventSystems;public class Drag3DObject : MonoBehaviour, IBeginDragHandler, IDragHandler
{private Vector3 offset;public void OnBeginDrag(PointerEventData eventData){Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y,Camera.main.WorldToScreenPoint(transform.position).z));offset = transform.position - worldPos;}public void OnDrag(PointerEventData eventData){Vector3 pos = new Vector3(eventData.position.x, eventData.position.y,Camera.main.WorldToScreenPoint(transform.position).z);transform.position = Camera.main.ScreenToWorldPoint(pos) + offset;}
}

特点

  • 必须有 Collider
  • Camera 上需要挂 PhysicsRaycaster
  • 通过 ScreenToWorldPoint 将屏幕坐标转换为世界坐标。
  • 使用 offset 避免物体在拖拽时“跳到鼠标中心”。

🎯 射线检测拖拽 3D 物体

核心代码

using UnityEngine;public class RaycastDrag : MonoBehaviour
{private Transform selectedObject;private Vector3 offset;void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit, 1000, 1 << LayerMask.NameToLayer("Draggable"))){selectedObject = hit.transform;Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,Camera.main.WorldToScreenPoint(selectedObject.position).z));offset = selectedObject.position - worldPos;}}if (Input.GetMouseButton(0) && selectedObject != null){Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Camera.main.WorldToScreenPoint(selectedObject.position).z);selectedObject.position = Camera.main.ScreenToWorldPoint(pos) + offset;}if (Input.GetMouseButtonUp(0)){selectedObject = null;}}
}

特点

  • 灵活,可选择任意 3D 物体。
  • 不依赖 EventSystem,直接用物理系统。
  • 适合 FPS 射击、RTS 单位选择、场景交互。

🖱️ OnMouseDrag 拖拽 3D 物体

核心代码

using UnityEngine;public class MouseDragExample : MonoBehaviour
{private Vector3 offset;void OnMouseDown(){Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,Camera.main.WorldToScreenPoint(transform.position).z));offset = transform.position - worldPos;}void OnMouseDrag(){Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Camera.main.WorldToScreenPoint(transform.position).z);transform.position = Camera.main.ScreenToWorldPoint(pos) + offset;}
}

特点

  • 物体必须有 Collider
  • 不需要 EventSystem。
  • 简单快速,但只能响应鼠标,无法处理触摸/多点交互。

⚖️ 四种方式对比

方法 优点 缺点 常见用途
UI 拖拽 (IDragHandler) 简单,直接用事件系统;无需考虑 z 仅限 UI 元素 拖拽 UI 面板、图片
3D 拖拽 (IDragHandler) 与 UI 拖拽统一;支持触摸 依赖 EventSystem + PhysicsRaycaster 少量 3D 拖拽场景
射线检测 灵活,可选择任意物体;适合复杂交互 逻辑稍复杂,需要写 Update FPS 射击、RTS 单位选择
OnMouseDrag 简单,不需要 EventSystem 只能响应鼠标,移动端不适用 快速实现 3D 拖拽

🎯 总结

  • UI 元素拖拽 → 用 IDragHandler
  • 简单 3D 拖拽 → 用 OnMouseDrag
  • 复杂 3D 场景交互 → 用 射线检测
  • 跨平台(鼠标+触摸)3D 拖拽 → 用 IDragHandler + PhysicsRaycaster。

http://icebutterfly214.com/news/118296/

相关文章:

  • 研究生必备:7款免费AI论文生成器,效率飙升200%,告别拖延 - 麟书学长
  • 在 Windows 11 中,以管理员权限打开 CMD(命令提示符)的几种常用方法
  • RAG的系列文章,有空可以看看
  • 完整教程:CentOS快速安装DockerCE指南
  • 手写数字识别:从零搭建神经网络 - 实践
  • 权威第三方给出的品牌营销策划公司排行榜 - 资讯焦点
  • 2025最新;福州奇富网络网络小额贷款有限公司客服AI数字公司推荐,技术斌能数字化转型 - 资讯焦点
  • 净水器加盟还是个好生意吗?是红利尾声还是新机遇?给创业者的理性指南 - 资讯焦点
  • 科技联动:重庆京东盛际小额贷款有限公司以科技创新赋能金融服务升级 - 资讯焦点
  • 2025年Q4堆垛机厂家权威推荐:最新测评技术实力、实战案例全场景适配榜 - AIEO
  • 2025年终展望:智慧食堂吐盘机品牌价值排行与未来选购洞察 - 深度智识库
  • 2025绵阳丧葬一条龙服务选哪家:绵阳福寿万海殡仪服务——丧葬一条龙服务内容介绍,金山/九龙山/百芳公墓等优质资源全面解析 - 深度智识库
  • ssl_ciphers 配置详解
  • zzCLIP究竟是什么?多模态大模型的基石
  • 详细介绍:我爱学算法之—— 多源BFS
  • 2025 年 12 月贵金属实验耗材厂家权威推荐榜:铂金坩埚/铂铑坩埚/铱片/铑片/金带/铱丝/铑丝/铱靶材/铑靶材等耐高温精密器件深度解析 - 品牌企业推荐师(官方)
  • 权威精选!中国电线电缆品牌推荐,安全可靠的传伙伴输 - 黑马榜单
  • 2025最新办公室维修改造服务商TOP10评测!国内优质品牌权威榜单发布,专业赋能企业办公空间升级 - 全局中转站
  • 2025年GEO优化服务商排行榜及选择建议 - 品牌推荐排行榜
  • 2025到2026年高性能rohs2.0测试设备企业,哪个牌子性价比最高? - 品牌推荐大师
  • 嵌入式UI框架的渐变原理、渐变算法
  • 2025年GEO优化服务商综合实力排行榜及选型指南 - 品牌推荐排行榜
  • 2025年BI知识库部署厂商全景解析:从企业AI知识库到智能BI私有化的核心方案商甄选指南 - 品牌2026
  • 解决Docker磁盘空间告急:认识并清理“悬空镜像”
  • win11乱码:【Unicode】和【UTF-8】的转换
  • 《lvgl基础学习 —— lv_style》
  • Monorepo 架构深度设计
  • 2025年12月滨海新区装修公司排名top5:佰瑞佳垄断高端别墅大平层装修市场 - 品牌智鉴榜
  • 重磅!2025年中国充电桩源头厂家年度十大品牌竞争力深度解析 - 深度智识库
  • 2025年烘焙乳化剂实力厂家权威推荐榜单:保健品原料/稳定剂/营养强化剂源头厂家精选 - 品牌推荐官