GUI Canvas 使用 localPosition 的缩放问题

GUI Canvas scaling problems using localPosition

所以我正在关注在线教程并且 99.9% 确定我没有犯错误,这可能与我试图将他的想法实施到一个已经建立的项目有关(可能)不同的关注因素。

数学的一般思路是我的 SlotScript 实现了 IDragHandlerOnDrag-

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

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

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

其他信息:

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

希望我说得够清楚了。

嗯,看到没有人回答这个问题,我感到非常惊讶!

无论如何,在玩了大约 2 小时(在较长时间内可能会更多)后,我注意到虽然(非常清楚地说明)canvas 缩放基于屏幕分辨率,但它不会然后缩放 localPosition 的 return 值,这个你必须自己做。

我很累,希望这是有道理的。

如果您也遇到过这个问题,您需要知道的是,一旦您将 canvas 上 mousePointer 的预期位置除以任意值 (x, y, z) Canvas RectTransform 组件中 Vector3 localScale 的 return 是缩放后的位置(因为除以小于 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);
    }