おもちゃラボ

Unityで遊びを作ってます

【Unity】画面四隅のワールド座標を取得する

モデルが画面外に出たことを検知したり、画面いっぱいにPlaneを広げたりしたい場合、画面四隅のワールド座標がわかると案外便利です。

そこで、この記事では画面四隅のワールド座標を取得する方法を説明します。

ワールド座標変換

画面四隅のワールド座標を取得するには、画面四隅のスクリーン座標をワールド座標に変換します。Unityでスクリーン座標をワールド座標に変換するにはScreenToWorldPointメソッドを使用します。

ScreenToWorldPointは引数にスクリーン座標をとり、これをワールド座標に変換するメソッドです。画面四隅のスクリーン座標はそれぞれ、

  • (0,0)
  • (Screen.Width, 0)
  • (0, Screen.Height)
  • (Screen.Width, Screen.Height)

なので、これをScreenToWorldPointに渡せば、画面四隅のワールド座標が得られます。

ただし、変換するときに、カメラからの奥行きによって四隅のワールド座標が変化するので、引数のz値にカメラからの距離(depth)を指定する必要があります。

f:id:nn_hokuson:20201022203824p:plain:w450

画面右上(Screen.Width, Screen.Height)と左下(0, 0)のワールド座標を取得するスクリプトは次のようになります。ここではdepth=5.0として、カメラから5m先のワールド座標がを取得しています。

float depth = 5.0f;
rightTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.Width, Screen.Height, depth));
leftBottom = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, depth));

カメラがOrthographicの場合

カメラからの奥行きによってワールド座標が変化するのは、カメラのProjectionがPerspectiveのときです。Orthographicのときは下図のようにカメラからの奥行きに関わらずワールド座標は一定なので、depthには0を指定しておいて問題ありません。

f:id:nn_hokuson:20201022203833p:plain:w450

カメラがOrthographicのときのスクリプトは次のようになります。

rightTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.Width, Screen.Height, 0));
leftBottom = Camera.main.ScreenToWorldPoint(Vector3.zero);