Unity ScreenToWorldPoint 座標変換ガイド|2D/3D クリック位置と UI 連動

Unity ゲーム開発 座標変換 C#
結論:30秒で Unity 座標変換をマスターする
  • 基本 C# コード: Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, distanceToCamera));
  • ハマりどころ: Input.mousePosition.z0 なので必ず手動で Z 距離を代入する
  • 変換ツール: 下のコンポーネントでブラウザ内即時座標検証

1. オンライン Unity 座標変換シミュレーター

画面解像度とカメラ設定を入力し、スクリーンピクセル座標がどのワールド空間座標にマッピングされるかをシミュレーションできます。

🎮 この場で座標変換を計算する

カメラ設定

Screen → World

ScreenToWorldPoint 相当。screen.z はカメラからの距離(depth)

World: (0, 0, 0)

World → Screen

WorldToScreenPoint 相当

Screen: (960, 540) / Depth:: 10


2. C# 実装コード例(2D & 3D)

using UnityEngine;

public class MouseToWorldPosition : MonoBehaviour
{
    [SerializeField] private Camera targetCamera;
    [SerializeField] private float targetZDistance = 10f;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 mouseScreenPos = Input.mousePosition;
            // 重要: カメラからの奥行き(距離)を Z に代入
            mouseScreenPos.z = targetZDistance;

            Vector3 worldPos = targetCamera.ScreenToWorldPoint(mouseScreenPos);
            Debug.Log($"Screen: {Input.mousePosition} -> World: {worldPos}");
        }
    }
}

3. 注意点(ハマりどころ)

  1. Camera.main の null 参照とパフォーマンス問題
    • Camera.main は毎フレーム参照すると内部で GameObject.FindWithTag("MainCamera") が走り低速になる場合があります。Awake()[SerializeField] で変数にキャッシュしてください。