代码如下:

 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 }