1、继承IBeginDragHandler, IDragHandler, IEndDragHandler 对三个拖拽事件进行封装。 分别是:开始拖拽时、拖拽过程中、拖拽结束时。
using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine;
using DG.Tweening;
public class DragableCardOperate : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public Vector3 startPos;
public float toBackTime = 0.1f;
void Start()
{
startPos = transform.localPosition;
}
public void MoveBack(float t)
{
transform.DOLocalMove(startPos, t);
}
// 开始拖拽
public virtual void OnBeginDrag(PointerEventData eventData)
{
SetDraggedPosition(eventData);
//Debug.Log("begin dragging");
}
// 拖拽过程中
public void OnDrag(PointerEventData eventData)
{
SetDraggedPosition(eventData);
}
// 拖拽结束
public virtual void OnEndDrag(PointerEventData eventData)
{
SetDraggedPosition(eventData);
//Debug.Log("OnEndDrag");
}
//跟随移动
private void SetDraggedPosition(PointerEventData eventData)
{
var rt = gameObject.GetComponent<RectTransform>();
// transform the screen point to world point int rectangle
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
}
}
}
2、功能:判断是否拖拽到正确位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class DataDrag : DragableCardOperate
{
//是否需要判断拖拽到位
public bool isRightOperate;
//目标的标志位
public Transform dragToTargetPos;
//判断移动到位的最小距离值
public float disMin = 10;
public GameObject dataText;
public override void OnEndDrag(PointerEventData eventData)
{
base.OnEndDrag(eventData);
EndDrag();
}
void EndDrag()
{
if (!isRightOperate)
{
MoveBack(toBackTime);
}
else
{
//距离判断
float dis = Vector3.Distance(transform.position, dragToTargetPos.position);
Debug.Log(dis);
if (dis < disMin)
{
Debug.Log("正确的 到达最小距离范围内");
MoveBack(0);
dataText.SetActive(true);
CancelDrag();
}
else
{
MoveBack(toBackTime);
}
}
}
void CancelDrag()
{
transform.GetComponent<DataDrag>().enabled = false;
}
}