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