//-------------------------------------------------------- // [Author]: 玩个游戏 // [ Date ]: Monday, July 31, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using System; using UnityEngine.Events; /// /// 拖拽组件,实现拖拽功能并限制拖拽范围 /// 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; } } /// /// 开始拖拽时调用 /// 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; } /// /// 拖拽过程中调用 /// public void OnDrag(PointerEventData eventData) { this.transform.position = UIUtility.ClampWorldPosition(area,eventData); // 检测是否进入目标区域 if (eventData.pointerEnter != null) { if (lastTransform != null && lastTransform != eventData.pointerEnter.GetComponent()) { lastTransform.mainTransform.localScale = Vector3.one; lastTransform = null; } var target = eventData.pointerEnter.GetComponent(); // 输出组件路径 if (target != null) { lastTransform = target; // 进入目标区域,放大 1.2 倍 lastTransform.mainTransform.localScale = Vector3.one * 1.2f; } } rectTransform.localScale = Vector3.one * 1.2f; } /// /// 结束拖拽时调用 /// public Action 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(); if (container == null) { onEndDragEvent?.Invoke(pos, -1); return; } onEndDragEvent?.Invoke(pos, container.pos); canvas.sortingLayerID = parentCanvas.sortingLayerID; canvas.sortingOrder = parentCanvas.sortingOrder + pos + 1; } /// /// 判断射线检测是否有效 /// public bool IsRaycastLocationValid(Vector2 sp,Camera eventCamera) { return raycastTarget; } }