0

だから私はオンラインのチュートリアルに従っており、99.9%間違いを犯していないと確信しています.

数学からの一般的な考え方は、SlotScript実装する my IDragHandlerOnDrag-

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

インベントリでメソッドを実行します。このメソッドは単にbool draggingItemtrue として割り当て、スプライトを変更してアクティブにします。

ドラッグされたアイテムの位置を返すための実際の更新コードは、期待値を返していません:

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 localScale除算するCanvas 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 に答える