スクリーン座標・ビュー座標・ワールド座標について
マス目の左下を基準とした場合、右上のピクセルのスクリーン座標は(画面の幅 – 1, 画面の高さ – 1)となります。
(1を引く理由は、画面左下ピクセルのスクリーン座標が0始まりであるためです。)
ピクセルのマス目の中心座標は端数が.5となることに注意する必要があります。
マウスカーソル位置などを扱う際には下記のように使用されます。
// マウスカーソルのスクリーン座標
var mousePosition = Input.mousePosition;
左下を(0, 0)、右上を(1, 1)とした座標系です。画面解像度に依存しない座標を扱いたい場合に便利です。
例えば、カメラの描画領域(Viewport Rect)の指定などで使われます。
UnityのUIでは、これらの座標変換を行うメソッドが提供されており、次の例では、ワールド座標からスクリーン座標への変換や、その逆を行う方法を示します。
UI要素を3Dオブジェクトの位置に追従させたい場合、3Dオブジェクトのワールド座標をスクリーン座標に変換し、UIの位置を更新します。
using UnityEngine;
using UnityEngine.UI;
public class WorldToScreenExample : MonoBehaviour
{
public Camera mainCamera; // メインカメラを指定
public GameObject worldObject; // 追従対象の3Dオブジェクト
public RectTransform uiElement; // UIのRectTransform
void Update()
{
// ワールド座標からスクリーン座標に変換
Vector3 screenPos = mainCamera.WorldToScreenPoint(worldObject.transform.position);
// UI要素の位置を更新
uiElement.position = screenPos;
}
}
このスクリプトでは、worldObject
のワールド座標を mainCamera
を基準にスクリーン座標に変換し、uiElement
に設定しています。
画面上の2D UIからワールド座標を逆算し、ワールド空間上のある位置に対応させたい場合に使います。例えば、ユーザーがUI上でクリックした位置にワールド空間のオブジェクトを移動させる場合などに利用されます。
using UnityEngine;
public class ScreenToWorldExample : MonoBehaviour
{
public Camera mainCamera; // メインカメラを指定
public GameObject worldObject; // ワールド空間で動かしたいオブジェクト
void Update()
{
if (Input.GetMouseButtonDown(0)) // マウスの左クリックで実行
{
// マウスのスクリーン座標を取得
Vector3 screenPos = Input.mousePosition;
screenPos.z = 10.0f; // カメラからの距離(z軸)を設定
// スクリーン座標をワールド座標に変換
Vector3 worldPos = mainCamera.ScreenToWorldPoint(screenPos);
// オブジェクトの位置を更新
worldObject.transform.position = worldPos;
}
}
}
このスクリプトでは、マウスのクリック位置を取得し、そのスクリーン座標をワールド座標に変換してオブジェクトを移動させます。
ビュー座標を使用して、画面解像度に依存しない配置を行う。
using UnityEngine;
public class ViewportExample : MonoBehaviour
{
public Camera mainCamera;
public RectTransform uiElement;
void Update()
{
// ビュー座標で指定(例:画面中央)
Vector3 viewPos = new Vector3(0.5f, 0.5f, 10.0f);
// ビュー座標からスクリーン座標に変換
Vector3 screenPos = mainCamera.ViewportToScreenPoint(viewPos);
// UI要素の位置を設定
uiElement.position = screenPos;
}
}
このコードではビュー座標 (0.5, 0.5)
を利用して画面中央にUIを配置します。ビュー座標は解像度に依存せず位置を決定できるため、どの解像度でも安定した表示位置を確保できます。
実践的には、UIが動的な3Dオブジェクトを追従する場合にワールドからスクリーンへの変換が頻繁に使われ、クリック位置のワールド変換などもゲーム内での操作性向上に活用されます。