在屏幕拖拽3D物体移动
2015-07-07 19:44 糯米粥 阅读(1346) 评论(0) 编辑 收藏 举报3D物体的拖拽不同于2D的。因为3D物体有x,y,z当然。实际拖拽还是在XZ平面。只是多了几个转换
1 using UnityEngine; 2 using System.Collections; 3 4 public class tuotuo : MonoBehaviour 5 { 6 7 Vector3 currPosition; //拖拽前的位置 8 Vector3 newPosition; //拖拽后的位置 9 10 // Use this for initialization 11 void Start() 12 { 13 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 } 21 22 /// <summary> 23 /// 开始拖拽 3D物体 拖拽是在平面拖拽 即 xy平面 24 /// </summary> 25 void OnMouseDrag() 26 { 27 //1:把物体的世界坐标转为屏幕坐标 (依然会保留z坐标) 28 currPosition = Camera.main.WorldToScreenPoint(transform.position); 29 30 //2:更新物体屏幕坐标系的x,y 31 currPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, currPosition.z); 32 33 //3:把屏幕坐标转为世界坐标 34 newPosition = Camera.main.ScreenToWorldPoint(currPosition); 35 36 //4:更新物体的世界坐标 37 transform.position = newPosition; 38 } 39 }
OnMouseDrag只是MonoBehaviour的一个方法。如果想拖拽UGUI界面是不行的。必须继承接口
using UnityEngine; using System.Collections; using DG.Tweening; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.EventSystems; public class newButton : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { //自己的RectTransform RectTransform rf; //Vector3 oldPosition;//原来的位置,拖拽前的位置 Vector3 newPosition;//拖拽中的位置 bool isDrag; //是否开始拖拽 public void OnEndDrag(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) { if (isDrag) //必须要执行了OnBeginDrag才执行OnDrag 有时候会遇到不执行OnBeginDrag { // 通过屏幕中的鼠标点,获取在父节点中的鼠标点 RectTransformUtility.ScreenPointToWorldPointInRectangle(rf, eventData.position, eventData.enterEventCamera, out newPosition); rf.position = newPosition; //设置拖动的图片的位置 //print(newPosition); } } public void OnBeginDrag(PointerEventData eventData) { isDrag = true; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?