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; }