首页 > 解决方案 > Unity C# Dragged item 将自身定位在鼠标运动上方几厘米处

问题描述

所以我有一个脚本(用于拖放库存系统)昨天运行良好,但是今天早上被拖动的项目不再跟随鼠标指针在光标位置,而是在远处跟随它。因此,单击该项目后,什么也没有发生,一旦我开始拖动项目 x,y 值就发生了变化,并将其放置在光标上方几厘米处,同时仍跟随光标。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public static GameObject itemBeingDragged;
    Vector2 startPosition;
    Transform startParent;
    

    public void OnBeginDrag ( PointerEventData eventData)
    {
        itemBeingDragged = gameObject;
        startPosition = transform.position;
        startParent = transform.parent;
        GetComponent<CanvasGroup>().blocksRaycasts = false;
    }
    public void OnDrag (PointerEventData eventData)
    {
        transform.position = Input.mousePosition;
    }
    public void OnEndDrag (PointerEventData eventData)
    {
        itemBeingDragged = null;
        GetComponent<CanvasGroup>().blocksRaycasts = true;
        if (transform.parent == startParent)
            {
                transform.position = startPosition;  
            }  
    }
}  
´´´

标签: c#unity3d

解决方案


拖动项目时,鼠标可以位于项目内的任何位置。因此,您应该计算鼠标位置和拖动项目的位置之间的增量。然后,您可以在设置新位置时在 OnDrag() 函数中添加此增量。

Vector3 delta;

public void OnBeginDrag(PointerEventData eventData)
{
    itemBeingDragged = gameObject;
    delta = itemBeingDragged.transform.position - 
        new Vector3(eventData.pressPosition.x, eventData.pressPosition.y, 0);
    // ....
}

... 

public void OnDrag(PointerEventData eventData)
{
    transform.position = Input.mousePosition + delta;
}

请注意,我们不应在 OnBeginDrag() 中使用 Input.mousePosition,因为拖动操作在鼠标移动一点后首先开始。我们当然可以在按下鼠标按钮后立即计算增量,然后我们可以使用 Input.mousePosition。但是,由于您使用 OnBeginDrag() 我们使用事件的 pressPosition,即按下时的 mousePosition。


推荐阅读