代码如下:
1 using UnityEngine; 2 using UnityEngine.EventSystems; 3 using System.Collections; 4 using System; 5 6 /// <summary> 7 /// 鼠标移动UI位置 8 /// </summary> 9 public class UIMoveMouse : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 10 { 11 12 private RectTransform canvas; //得到canvas的ugui坐标 13 private RectTransform selfRect; //得到UI对象的ugui坐标 14 Vector2 offset = new Vector3(); //用来得到鼠标和UI对象的差值 15 16 // Use this for initialization 17 public virtual void Start() 18 { 19 selfRect = GetComponent<RectTransform>(); 20 canvas = InventoryManager.Instance.Canvas; 21 } 22 23 24 //当鼠标开始拖动时调用 25 public void OnBeginDrag(PointerEventData eventData) 26 { 27 Vector2 mouseDrag = eventData.position; //记录鼠标按下时的屏幕坐标 28 Vector2 mouseUguiPos = new Vector2(); //定义一个接收返回的ugui坐标 29 //RectTransformUtility.ScreenPointToLocalPointInRectangle():把屏幕坐标转化成ugui坐标 30 //canvas:坐标要转换到哪一个物体上,这里img父类是Canvas,我们就用Canvas 31 //eventData.enterEventCamera:这个事件是由哪个摄像机执行的 32 //out mouseUguiPos:返回转换后的ugui坐标 33 //isRect:方法返回一个bool值,判断鼠标按下的点是否在要转换的物体上 34 bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, null, out mouseUguiPos); 35 if (isRect) //如果在 36 { 37 //计算UI对象中心和鼠标点的差值 38 //anchoredPosition: 相对于锚点参考点,这个重新变换的枢轴位置。 39 offset = selfRect.anchoredPosition - mouseUguiPos; 40 } 41 } 42 //当鼠标拖动时调用 对应接口 IDragHandler 43 public void OnDrag(PointerEventData eventData) 44 { 45 Vector2 mouseDrag = eventData.position; //当鼠标拖动时的屏幕坐标 46 Vector2 uguiPos = new Vector2(); //用来接收转换后的拖动坐标 47 //和上面类似 48 bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, null, out uguiPos); 49 50 if (isRect) 51 { 52 //设置UI对象的ugui坐标与鼠标的ugui坐标保持不变 53 selfRect.anchoredPosition = offset + uguiPos; 54 } 55 } 56 //当鼠标结束拖动时调用 对应接口 IEndDragHandler 57 public void OnEndDrag(PointerEventData eventData) 58 { 59 offset = Vector2.zero; 60 } 61 }