Unity2d スクリーン座標をワールド座標に変換する

2018/2/24 追加更新

 

スクリーン座標をワールド座標に変換する

標題の通り、Unityでスクリーン座標からワールド座標を取得する方法を記載します。

まずは、マウスポイントされた座標をワールド座標に変換するSampleコードを示します。

```
Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
```

# ワールド座標

Unityでは画面の位置と、シーンの中の位置は必ずしも一致していません。
Unityでは、シーンの中に無限に広がる空間を持っており、そこにSpriteを配置しています。
この無限空間の座標をワールド座標と呼びます。


# スクリーン座標

スクリーン座標は、ワールド座標の中から、画面上の左上から距離を測った距離を指します。


# Unityでマウスポイント(タップ)座標を取るには

マウスポイント、タップ座標はスクリーン上の座標ですから、PGM上で処理するには、ワールド座標に変換してから処理を行わないと行けません。

これを実現するのが、Cameraオブジェクトです。
Sampleに示した、

```
Camera.main
```

は、メインカメラオブジェクトです。
このCamera.mainに属している、ScreenToWorldメソッドを呼び出すことで、Main Cameraのスクリーン座標をワールド座標に変換することが出来ます。

変換したワールド座標はVectore2オブジェクトとして返却されます。

 

ScreenToWorldPointで座標がずれる時

私がハマったのですが、 

単純に

Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

で、Input.mousePositionを与えるだけだと、Input.mousePositionはx,yしか入っていないため、ずれてしまいます。

例えば、2Dで出す場合は、

Vector3 cameraPosition = Input.mousePosition;

cameraPosition.z = 10.0f;

この後に、

Vector2 pos = Camera.main.ScreenToWorldPoint(cameraPosition);

とやるとうまくとれます。

※10.0は、2D上のカメラのzの距離を入れています。上記カメラのz軸座標で一度Vectorを作ってScreenToWorldPointで変換します。