渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity Input座標と値はどこから来てる?


f:id:esakun:20150730215258g:plain

何もライブラリを入れずにピュアにUnityでコードを書くことになると途端に、どこが基準点だっけかな?あの機能って元々どういう仕様だっけかな?ってことがよく私には起きます。

ググれば良いのですが、ググった情報がそもそも正しいのか疑問に思ってしまい、結局新しく test みたいな名前でUnityプロジェクトを作り、ショートコードを書いて「あ〜やっぱりね」と仕様を把握して作業に戻る、、、みたいな無駄な人生の過ごし方をしてしまっています。

ググれば良いのですが、ググった情報がそもそも正しいのか疑問に思ってしまい

↑要はここを信用すればよいのですが、性格からか自分の曇りなき眼で確認しなければ前に進めないので、ご了承を。

今回はInputクラスについて

以下のコードを書いて、画面をクリックしたときの座標を出力しています。

private void Update ()
{
    if (Input.GetMouseButtonDown(0))
    {
        Debug.Log (Input.mousePosition);
    }
}

すぐに結果が出ました。

左下が(0, 0) 右上に行くほど値が大きくなります。

Q. 右上の値はどこから来ているのか?

スクリーンのサイズがそのまま入ります。

結論

左下が(0, 0,) 右上(Screen.width, Screen.height) となります。

新たな疑問点

Unityゲーム画面の左上には解像度を指定できるプルダウンがあります。

f:id:esakun:20161009154653p:plain

ここの指定によって取得のロジックは変わるのでしょうか?
一つ一つ見ていきます。

Free Aspect

縦横の比率が自由です。Aspect というキーワードから解像度を指定するものではなくあくまで 比率 と思われます。

以上のことから右上の座標は

(Screen.width, Screen.height)

となります。

その他の比率

5:44:316:10 などありますが、こちらも比率なのでFree Aspectと同様右上の座標は

(Screen.width, Screen.height)

となります。

指定解像度の場合

Web(960☓600) は、960px☓600pxという事になります。この場合の右上の座標は

(960, 600)

※(Screen.width, Screen.height)と同じ値

となります。

指定解像度がモニタより大きかった場合

ひっかけ問題ですが、この場合も右上の座標は

(Screen.width, Screen.height)

となります。 ※この場合のScreen.widthとScreen.heightは指定した解像度の値ではありません。あくまでモニタ内の解像度です。

まとめ

Inputで取得できる座標は、

  • 左下 : (0, 0)
  • 右上 : (Screen.width, Screen.height)

です。

また、ゲーム画面を指定解像度にした場合でも、その解像度がScreenクラス経由で取得できるわけではなく、あくまでその状態で表示されたモニタの解像度で返却されるということがポイントです。

最終出力のモニタサイズが指定解像度より大きい場合は大丈夫ですが、小さかった場合は比率を保ったまま、Screenのサイズも小さくなります。何が言いたいかというと、オブジェクトの座標などのTransform値を絶対値で開発していると多解像度対応が難しくなる場合もあるという事です。比率で実装できるところは比率を使うほうが、後々問題になりづらい気はします。が、工数は増えますな。