[Unity]Screen座標からWorld座標に変換がうまっくいかない

この記事は約2分で読めます。
スポンサーリンク

やりたいこと

この記事はScreen座標(Input.mousePosition)からWorld座標に変換がうまっくいかないときの対策です。

前提

CanvasのRender modeは Screen Space – Overlay

取得したWorld座標はUIの場所指定に使用

ダメだった例

ネットなどを見て以下のコードを試したのですがうまくいきませんでした。

(処理に失敗するのではなく欲しい値が取得できませんでした。)

Camera.main.ScreenToWorldPoint(Input.mousePosition);
スポンサーリンク

対策?

どうも動作からScreen Space – OverlayでWorld座標を使用するとWorld座標=Screen座標のようです。

ただオフィシャルドキュメントなどを読んだのですが、明記されている箇所は見つかりませんでした。

スポンサーリンク

対策

World座標=Screen座標だと変換の必要もないのですが、証拠もないので安全のためコードの対策も行いました。

以下のコードで動作しました。

Vector2 localPoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(trans.GetComponent<RectTransform>(), Input.mousePosition, null, out localPoint);
Vector3 v = tf.TransformPoint(new Vector3(localPoint.x, localPoint.y, 0));

ここで2行目、第一引数で使用するtfと3行目で使用するtfはTransformクラスの同じものである必要があります。

また以下の条件に合ったものが必要です

  • RectTransformコンポーネントを持っていること
  • UIであること

逆に非Activeでも問題ありません。

またクリックポイントは対象のGameObjectの外側であっても問題ありません。

つまり1ドットの非アクティブのUIでもCanvasでもいいです。

スポンサーリンク

結果

CanvasのRender modeが Screen Space – Overlayの

コメント

タイトルとURLをコピーしました