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