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