Unityの座標系

2015年05月24日 (日) 17時54分53秒
このエントリーをはてなブックマークに追加

Unityの座標系について

UnityのY軸は画面に対し上が+、下が−である。
そのため画面に対し左上が(0,max),右下が(max,0)になっている。
他の多くのプログラムでは左上が(0,0)、右下が(max,max)になっている。

これは現実世界を反映したUnityの仕様である。
Unityにはこの2つの座標系が混同し存在しているため注意。

例えばRectクラスはBoxを作るクラスである。
Rect(左上x,左上y,横幅,縦幅)として使う。
Rectの(0,0)は左上である。

例えば画面の一部を覆う時
スクリーン座標を取得すると左下が(0,0)だが、覆うためのRectでの指定は左上が(0,0)である。
変換が必要なので注意。

また、Camera.main.WorldToScreenPointではy座標が負で取得される?ようだ。
原因や仕様が見つからなかったため知っている方はコメントをいただけると助かる。
追記
2DモードではCamera.main.WorldToScreenPointで負が取得されることはなかった。

スクリーンの一部を覆う処理では以下がある。

public float bottom;
public float width;
public float height;

void OnGUI () {
        var leftDown = Camera.main.WorldToScreenPoint(new Vector3(-width / 2, bottom, 0));
        var rightUp = Camera.main.WorldToScreenPoint(new Vector3(width / 2, bottom+ height,0 ));
        GUI.TextField(new Rect(leftDown.x, Screen.height-rightUp.y, rightUp.x - leftDown.x, rightUp.y - leftDown.y),"Text");
    }

WorldToScreenPointで左下と右上を取得し、GUI.TextFieldでは左上のx用に左下のx(leftDown.y)を、左上のy用にスクリーンサイズ-右上のy(rightUp.y)とすることで左下基準の座標を左上基準にしている。
オススメはWorldToScreenPointの拡張メソッドを作り左上基準で取得できるようにすることである。