0

因此,我正在在线学习一个教程,并且 99.9% 的人确信我没有犯错误,这可能与我试图将他的想法实施到一个已经建立的项目中有关(可能)具有不同的相关因素。

数学的总体思路是 my SlotScriptwhich implements IDragHandler, OnDrag-

public void OnDrag(PointerEventData data)
{
    if (inventory.Items[slotNumber].itemName != null)
    {
        inventory.ShowDraggedItem(inventory.Items[slotNumber]);
    }
}

在我的清单中执行一个方法,该方法简单地分配bool draggingItem为 true 并更改它的 sprite 并使其处于活动状态。

现在我返回拖动项目位置的实际更新代码没有返回它的预期值:

void Update()
{
    if (draggingItem)
    {
        Vector3 position = (Input.mousePosition - (GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localPosition));
        draggedItem.GetComponent<RectTransform>().localPosition = new Vector3(position.x + 15, position.y - 15, position.z);
    }
}

以下是我得到的一些例子。当鼠标位于画布中心时,我得到了预期的结果:

在此处输入图像描述

如果我将项目向外拖动到任何边缘,则值会失真,总是返回小于应有的值,例如:

在此处输入图像描述

在此处输入图像描述

其他信息:

屏幕空间设置为覆盖。本机分辨率为1920x1080. 当在较小的分辨率尺寸上进行测试时,问题会变得更糟(偏移量成比例地更大)。一旦onDrag事件发生,mousePosition更新正确并且Canvas localPosition保持完全相同(预期的行为?)

我希望我说得足够清楚。

4

1 回答 1

1

好吧,我很惊讶没有人回答这个问题!

无论如何,在玩了大约 2 个小时(可能在较长时间内)后,我注意到虽然(非常清楚地说明)画布根据屏幕分辨率进行缩放,但它并没有缩放 的返回值localPosition,这就是你必须自己做。

我累了,所以希望这是有道理的。

如果您也遇到过这个问题,您需要知道的是,一旦您将mousePointer画布上的预期位置除以组件中的任何值(x,y,z),Vector3 localScaleCanvas RectTransform就会返回缩放位置(因为除以小于 1 会增加您的价值)。

要解决的代码如下:

if (draggingItem)
    {
        Vector3 localScale = GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localScale;
        Vector3 position = (Input.mousePosition - (GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localPosition));
        Vector3 positionDivided = new Vector3(position.x, position.y, position.z) / localScale.x;

        draggedItem.GetComponent<RectTransform>().localPosition = new Vector3(positionDivided.x + 15, positionDivided.y - 15, positionDivided.z);
    }
于 2015-02-20T10:03:48.810 回答