UIマウスドラッグフォローとイベント応答

1. IBeginDragHandler、IDragHandler、IEndDragHandler継承して、3つのドラッグイベントをカプセル化します。それらは、ドラッグの開始時、ドラッグ中、およびドラッグの終了時です。

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

おすすめ

転載: blog.csdn.net/qq_22975451/article/details/113265789