メインコンテンツまでスキップ

スクリーン座標・ビュー座標・ワールド座標について

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オブジェクトを追従する場合にワールドからスクリーンへの変換が頻繁に使われ、クリック位置のワールド変換などもゲーム内での操作性向上に活用されます。

z座標について