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