GUI Canvas使用localPosition缩放问题

时间:2015-02-19 22:36:21

标签: c# user-interface unity3d mouse unity3d-gui

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

数学的一般想法是我的SlotScript实现了IDragHandlerOnDrag -

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

在我的广告资源中执行一个方法,只需将bool draggingItem指定为true,然后更改它的精灵并激活它。

现在我用于返回拖动项目位置的实际更新代码并未返回其预期值:

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

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

enter image description here

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

enter image description here

enter image description here

其他信息:

屏幕空间设置为叠加。 原始分辨率为1920x1080。 在较小分辨率尺寸上测试时,问题会恶化(偏移量会成比例地增大)。 onDrag事件发生后,mousePosition更新正确且Canvas localPosition保持完全相同(预期行为?)

我希望我说得够清楚。

1 个答案:

答案 0 :(得分:1)

我很惊讶地看到没有人对此有答案!

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

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

如果您遇到此问题,您需要知道的是,一旦您将画布上mousePointer的预期位置除以{{1}的任何值(x,y,z) } Vector3 localScale组件中它返回缩放位置(因为除以小于1的原因会增加你的值)。

要解决的代码如下:

Canvas RectTransform