スクリーン座標・ビュー座標・ワールド座標について
1. 各座標の意味と役割
スクリーン座標 (Screen Coordinates)
- スクリーン座標は、画面に表示されるピクセル単位の座標です。左下を原点 (0, 0) とし、右上が画面解像度に応じた最大のピクセル座標 (例えば、1920x1080なら右上が (1920, 1080)) になります。
- これは「カメラが最終的に画面上でどこにオブジェクトを描画するか」を指定する座標系です。UI要素が「スクリーン空間 - カメラ」モードに設定されている場合、スクリーン座標を使ってUIが配置されます。
マス目の左下を基準とした場合、右上のピクセルのスクリーン座標は(画面の幅 – 1, 画面の高さ – 1)となります。
(1を引く理由は、画面左下ピクセルのスクリーン座標が0始まりであるためです。)
ピクセルのマス目の中心座標は端数が.5となることに注意する必要があります。
マウスカーソル位置などを扱う際には下記のように使用されます。
// マウスカーソルのスクリーン座標
var mousePosition = Input.mousePosition;
ビュー座標 (Viewport Coordinates)
- ビュー座標は、カメラを基準にした相対的な座標で、(0,0) がビューポートの左下、(1,1) がビューポートの右上です。解像度に依存せず、画面サイズに対して正規化された値 (0から1) を取ります。
- ビュー座標は、スクリーン座標やワールド座標に変換する中間的な役割を果たし、アスペクト比に依存せずにUI要素を配置するのに便利です。
左下を(0, 0)、右上を(1, 1)とした座標系です。画面解像度に依存しない座標を扱いたい場合に便利です。
例えば、カメラの描画領域(Viewport Rect)の指定などで使われます。
ワールド座標 (World Coordinates)
- ワールド座標は、ゲーム空間全体の基準となる座標系で、オブジェクトが配置される場所や向きを示します。ワールド空間は3D空間上の絶対位置を示し、UIに限らず3Dオブジェクトの位置もここで定義されます。
- UI要素を3D空間内で移動させたり、他の3Dオブジェクトと一緒に動かしたい場合に使用します。
2. 各座標を用いた実践的なプログラム例
UnityのUIでは、これらの座標変換を行うメソッドが提供されており、次の例では、ワールド座標からスクリーン座標への変換や、その逆を行う方法を示します。
例1:ワールド座標からスクリーン座標への変換
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 に設定しています。
例2:スクリーン座標からワールド座標への変換
画面上の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;
}
}
}
このスクリプトでは、マウスのクリック位置を取得し、そのスクリーン座標をワールド座標に変換してオブジェクトを移動させます。
例3:ビュー座標の活用
ビュー座標を使用して、画面解像度に依存しない配置を行う。
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を配置します。ビュー座標は解像度に依存せず位置を決定できるため、どの解像度でも安定した表示位置を確保できます。
まとめ
- スクリーン座標は、画面解像度に依存したピクセル単位の座標。
- ビュー座標は、正規化された座標で、画面サイズや解像度に依存せずに配置を制御できる。
- ワールド座標は、3D空間の座標で、UI要素を3Dオブジェクトと連携させるのに役立つ。
実践的には、UIが動的な3Dオブジェクトを追従する場合にワールドからスクリーンへの変換が頻繁に使われ、クリック位置のワールド変換などもゲーム内での操作性向上に活用されます。