【Unity】これだけは覚えよう! 狙った位置に表示するための座標3種類

Unityの座標って、いろいろ種類があって難しくないですか?
Scriptで狙った場所に表示できずに、ズレちゃったこととかありますよね。

これを読めば、あらゆる狙った場所にピッタリ表示できる……とまでは言いませんが、「何が原因で表示がズレているのか」ぐらいは自力で理解できるようになります。

基礎を知らずして座標の変換をあやつるのは難しいので、まずはそれぞれの座標についてしっかり勉強して、脱初心者を目指しましょう!

ワールド座標

3D空間上の(0,0,0)から見てどこなのかを表した座標です。いちばん見る機会が多いですね。座標といったら大抵はこれを指します。

取得の仕方

Scriptなら、親か子かに関係なく transform.position です。
もはや見ない日はないほどおなじみです。

Inspectorでは、子Objectじゃないなら「Transform」の「Position」の項目で取得できます。
子Objectの場合は、Scriptから取得する必要があります。

まあ、これの理解に手こずる人は少ないでしょう。

ローカル座標

子Objectが「親Objectから見てどこにいるか」を表した座標です。
親を持たない場合は、ワールド座標と同じ値になります。

親子というのは、Hierarchy上の階層構造のことを表しています。

ワールド座標と同じく「3D空間のどこにいるのか」を表していますが、原点が(0,0,0)ではなく、親Objectのワールド座標である点が異なります。

あくまで「親から見た座標」なので、親Objectが移動して子Objectが自動追従してきた場合でも、ローカル座標は変わりません。

取得の仕方

Scriptなら、transform.localPosition です。
繰り返しになりますが、親を持たないObject(画像の場合はParent)が取得しても、transform.position と同じ値です。

Inspectorでは、子Objectなら「Transform」の「Position」です。

ワールド座標の時と同じですね。Inspectorで表示されるTransformは、親か子かで情報が変わるので、注意が必要です。

スポンサードサーチ

uGUIの座標(RectTransform)

UnityでUIを表示するときに使用する専用の座標です。
めちゃくちゃ複雑なので、一度で覚えられなくても大丈夫です。

UIにもいろいろありますが、大体の場合は「Cameraの位置に関係なく、画面の特定の位置に表示するもの」ですよね。

たとえば、UIをワールド座標で表示しようとしたら、どうなるでしょうか。
Cube(白い箱)のように、ぽんと3D空間にButtonを置いたとします。
当然ですが、Cameraが動いたら位置が変わっちゃいますよね。
移動せずとも、Cameraがその場で回転するだけで見えなくなります。

Cubeが動かなくても、Cameraが動けば表示位置が変わってしまう。

この問題を対策するには、Cameraの座標や角度をもとに常にワールド座標を再計算し、Cameraの特定の位置に移動し続けなくてはいけません。

しかも、実機で動かすとなると画面サイズも異なりますよね。横長の4Kかもしれないし、縦長のスマホかもしれないのです。
さらに、奥行きによって大きく見えたりしちゃいますよね。
全部気にして表示するの、めっちゃ大変じゃないですか?

それを避けるために、RectTransformがあります。
この辺の面倒くさいことを全部解決して、

  • 解像度が変わろうが
  • Cameraがどこにいようが
  • 画面上の望む位置に
  • 座標1つで

表示できるようになります。

取得の仕方

Scriptなら、GetComponentで取得できます。

Inspectorなら、RectTransformという項目で取得できます。

ワールド座標やローカル座標と比べて、項目の名前や数が違いますね。
これは解像度の違いに対応するためです。

  • 解像度に関係なく、画面の端から端までゲージを表示したい
  • 常に画面の左上に表示したい

など、UIにも色々あるので、そのための設定項目ということです。詳細はテラシュールブログさんが詳しく解説しているので、そちらに譲ります。

まとめ

というわけで、3つ解説してみました。

混乱の原因はだいたいRectTransformのせいですね。
紙面のほとんどがこれという。

とりあえず「座標は3種類あるんだ」と覚えてもらえれば十分です。

ズレる原因は、ほとんどがこれらの理解がアヤフヤなせいです。
ローカル座標を動かしたいのにワールド座標を動かしちゃったり、UIなのにワールド座標を取得しちゃったりすると、バグります。

それぞれの座標の変換については、 長くなってしまったので別記事で取り扱います。
更新を見逃したくない!という方は、ぼくのTwitter(@LuckyDuet)をフォローしておいてもらえると嬉しいです。

記事をシェアする