c# - 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;
}
}
}
´´´
解决方案
拖动项目时,鼠标可以位于项目内的任何位置。因此,您应该计算鼠标位置和拖动项目的位置之间的增量。然后,您可以在设置新位置时在 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。
推荐阅读
- mysql - 使用 mysql npm 库插入行时出现错误
- python - 基于重复拆分python列表
- ruby-on-rails - 如何在 i18n 中翻译条件语句
- java - SQL 查询在 Java 中失败,但在外部有效
- c# - 将字符串绑定到模型属性时配置 DateTime 格式
- asp.net-core - 如何在.Net中相同服务的不同实例之间进行通信?
- php - Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?
- android - 当我将对象从片段发送到另一个片段时,原始数据已更新
- java - 如果两个复选框的语句被选中问题
- swift - 如何在 swift 中根据大小使用不同的 modalPresentationStyles?