Unity_Lesson

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

1. 各座標の意味と役割

スクリーン座標 (Screen Coordinates)

マス目の左下を基準とした場合、右上のピクセルのスクリーン座標は(画面の幅 – 1, 画面の高さ – 1)となります。
(1を引く理由は、画面左下ピクセルのスクリーン座標が0始まりであるためです。)

ピクセルのマス目の中心座標は端数が.5となることに注意する必要があります。

マウスカーソル位置などを扱う際には下記のように使用されます。

// マウスカーソルのスクリーン座標
var mousePosition = Input.mousePosition;


ビュー座標 (Viewport Coordinates)

左下を(0, 0)、右上を(1, 1)とした座標系です。画面解像度に依存しない座標を扱いたい場合に便利です。

例えば、カメラの描画領域(Viewport Rect)の指定などで使われます。



ワールド座標 (World Coordinates)



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を配置します。ビュー座標は解像度に依存せず位置を決定できるため、どの解像度でも安定した表示位置を確保できます。


まとめ

実践的には、UIが動的な3Dオブジェクトを追従する場合にワールドからスクリーンへの変換が頻繁に使われ、クリック位置のワールド変換などもゲーム内での操作性向上に活用されます。

z座標について