やりたいこと
この記事は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の
コメント