| //-------------------------------------------------------- | 
| //    [Author]:           玩个游戏 | 
| //    [  Date ]:           Monday, July 31, 2017 | 
| //-------------------------------------------------------- | 
| using UnityEngine; | 
| using System.Collections; | 
| using UnityEngine.EventSystems; | 
| using System; | 
| using UnityEngine.Events; | 
|   | 
| /// <summary> | 
| /// 拖拽组件,实现拖拽功能并限制拖拽范围 | 
| /// </summary> | 
| public class DragItem:MonoBehaviour,ICanvasRaycastFilter,IBeginDragHandler,IDragHandler,IEndDragHandler  | 
| { | 
|     [SerializeField] public Canvas parentCanvas; | 
|     [SerializeField] public Canvas canvas; | 
|     // 拖拽区域限制 | 
|     [SerializeField] | 
|     RectTransform m_Area; | 
|     public RectTransform area { get { return m_Area; } } | 
|   | 
|     // 是否允许射线检测 | 
|     [SerializeField] | 
|     bool m_RaycastTarget = true; | 
|     public bool raycastTarget { | 
|         get { return m_RaycastTarget; } | 
|         private set { m_RaycastTarget = value; } | 
|     } | 
|   | 
|     [NonSerialized] public int pos; | 
|   | 
|     private DragContainer lastTransform; | 
|   | 
|     // 当前对象的RectTransform组件 | 
|     RectTransform rectTransform { get { return this.transform as RectTransform; } } | 
|   | 
|   | 
|     /// <summary> | 
|     /// 开始拖拽时调用 | 
|     /// </summary> | 
|     public void OnBeginDrag(PointerEventData eventData) | 
|     { | 
|         raycastTarget = false; | 
|         this.transform.position = UIUtility.ClampWorldPosition(area, eventData); | 
|         rectTransform.localScale = Vector3.one * 1.2f; | 
|   | 
|         canvas.sortingLayerID =  parentCanvas.sortingLayerID; | 
|         canvas.sortingOrder = parentCanvas.sortingOrder + pos + 10; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 拖拽过程中调用 | 
|     /// </summary> | 
|     public void OnDrag(PointerEventData eventData) { | 
|         this.transform.position = UIUtility.ClampWorldPosition(area,eventData); | 
|          | 
|         // 检测是否进入目标区域 | 
|         if (eventData.pointerEnter != null) | 
|         { | 
|             if (lastTransform != null && lastTransform != eventData.pointerEnter.GetComponent<DragContainer>()) | 
|             {  | 
|                 lastTransform.mainTransform.localScale = Vector3.one; | 
|                 lastTransform = null; | 
|             } | 
|             var target = eventData.pointerEnter.GetComponent<DragContainer>(); | 
|             // 输出组件路径 | 
|             if (target != null) | 
|             { | 
|                 lastTransform = target; | 
|                 // 进入目标区域,放大 1.2 倍 | 
|                 lastTransform.mainTransform.localScale = Vector3.one * 1.2f; | 
|             } | 
|         } | 
|         rectTransform.localScale = Vector3.one * 1.2f; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 结束拖拽时调用 | 
|     /// </summary> | 
|     public Action<int, int> onEndDragEvent; | 
|   | 
|     public void OnEndDrag(PointerEventData eventData) | 
|     { | 
|         raycastTarget = true; | 
|         rectTransform.localScale = Vector3.one; | 
|          | 
|         if (lastTransform != null) | 
|         { | 
|             lastTransform.mainTransform.localScale = Vector3.one; | 
|             lastTransform = null; | 
|         } | 
|   | 
|         if (eventData.pointerEnter == null) | 
|         { | 
|             onEndDragEvent?.Invoke(pos, -1); | 
|             return; | 
|         } | 
|   | 
|         var container = eventData.pointerEnter.GetComponent<DragContainer>(); | 
|         if (container == null) | 
|         { | 
|             onEndDragEvent?.Invoke(pos, -1); | 
|             return; | 
|         } | 
|         onEndDragEvent?.Invoke(pos, container.pos); | 
|         canvas.sortingLayerID =  parentCanvas.sortingLayerID; | 
|         canvas.sortingOrder = parentCanvas.sortingOrder + pos + 1; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 判断射线检测是否有效 | 
|     /// </summary> | 
|     public bool IsRaycastLocationValid(Vector2 sp,Camera eventCamera) { | 
|         return raycastTarget; | 
|     } | 
| } |