【Unity】ワールド座標とスクリーン座標

Unity

 

こんばんは、ちきなるです。

 

前回。

Raycast

 

 

今回は、

Unityで、使用されている2つの座標

ワールド座標スクリーン座標

について、まとめます。

(ローカル座標とビューポート座標には、ふれません)

 

(2Dゲーム)

 

ワールド座標って?

ゲームのキャラクターが、存在している空間。

その空間の座標が、ワールド座標です。

 

空間の中心(0, 0)から、

左右←→(X座標)、

上下↑↓(Y座標)に広がります。

スクリーン座標って?

カメラが表示している範囲。

その範囲の座標が、スクリーン座標です。

 

表示されている左下が、(0, 0)

表示されている右上が、(pixelWidth, pixelHeight)

(0, 0)から、(pixelWidth, pixelHeight)まで、等間隔で分割された座標。

(白枠が、カメラの表示範囲です)

pixelWidthpixelHeightは、カメラに設定されている幅と高さです。

 

メインカメラの場合は、

Camera.main.pixelWidth

Camera.main.pixelHeight

で、取得できます。

補足

スクリーン座標について調べていると、

右上の座標について、2つの記述がありました。

 

Camera.WorldToScreenPoint

Camera.ScreenToWorldPoint

上の方では、(pixelWidth -1, pixelHeight -1)。

下の方では、(pixelWidth, pixelHeight)。

 

共に、公式リファレンスなのに、違うことが書いています。

 

どっちやね~ん。

と、言う事で、調べてみました。

 

ScreenToWorldPointを使って、(pixelWidth, pixelHeight)の座標をワールド座標に変換。

・変換した座標を、適当なGameObjectのpositionに設定。

・GameObjectが、どこに配置されるのか確認したところ・・・。

 

画面の右上に行きました。

 

つまり、

画面右上の座標は、

(pixelWidth, pixelHeight)

と、言う事です。

(-1は、いりません)

 

とはいえ、

公式の記述なので・・・。(書き間違えの可能性もありますが)

スクリーン座標がずれてる?

って、時は、

右上の座標を確認してみるのも、良いと思います。

 

 

どこで使われているの?

ワールド座標は・・・

Transform Componentが、

設定されたゲームオブジェクトの配置情報などで、使用されます。

((0, 0)座標にあるGameObject)

 

ゲームのキャラクターなど、

ゲームの世界に存在するものに対して使用されます。

(ゲームの中で、動いたり、ぶつかったりするもの)

 

スクリーン座標は・・・。

Rect Transform Componentが、

設定されているGameObjectの配置情報などで、使用されます。

(画面の右上に配置されたGameObject)

 

UIなど、

プレイヤーに向けて表示されているものに対して使用されます。

(メニューボタンとか体力バーとか)

 

 

補足

TransformRect Transform

必ずどちらかが、GameObjectに設定されます。

 

UIを配置する時は、Rect Transformが、

それ以外は、Transformが、

自動で設定されます。

(手動で付け替えも可能)

(UIは、Canvasの下に配置されるGameObject)

 

ボタンにTransformを付けることも出来ますし、

操作キャラクターにRect Transformを付けることも出来ます。

 

あくまで、

切り分けのイメージなので、好きなように設定することが出来ますが、

ゲームキャラクターとUIで切り分けた方が、使いやすいし、わかりやすいです。

 

どういう時に必要?

基本的には、

Unityが自動で振り分けてくれるので、意識する必要性は、ありません。

 

そんな中でも、

使う可能性が高いのが・・・。

 

マウス操作

マウスのクリックで、ゲームキャラクターを掴みたい!!

 

そんな時に、必要になってきます。

 

マウスの位置情報は、スクリーン座標

ゲームキャラクターの位置情報は、ワールド座標

 

そのまま使用しても、上手くいきません。

(違う位置にあるのに、お互い(0, 0)座標なので、接触しているよ。って、なります)

 

なので、

スクリーン座標をワールド座標に変換して、確認します。

(逆でも出来ますが、Raycastを使いたいので、ワールド座標に合わせた方が、使いやすいです)

 

簡単な例を書くと・・・。

    Vector3 W_MousePoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);

Input.mousePositionは、マウスの場所が、スクリーン座標で入っています。

Camera.main.ScreenToWorldpoint(Vector3 position)は、メインカメラのスクリーン座標をワールド座標に変換する関数です。

(Camera.mainは、メインに設定されているカメラが取得できます)

 

この後、

Raycastで取得するも良し、

お互いの座標を比較するも良し。

って、感じです。

 

 

まとめ

ワールド座標は、

ゲーム空間の座標。Transformで使用される。

 

スクリーン座標は、

画面内の座標。RectTransformで使用される。

基本的に、意識する必要はないが、

マウス操作(ポインタ操作)の時に、使用する事がある。

 

補足

意識する必要が無い理由は、

プレイヤーの操作は、基本的に、UIに対して行われます。

ボタンクリックなど)

UI同士で処理を行う場合は、スクリーン座標のみで行います。

(そもそもEventSystemが処理を行ってくれるので座標を扱う必要も無い)

 

UI同士で処理を行い、条件を満たした時、ゲームキャラクターに影響を与える。

 

なので、

スクリーン座標を意識する必要は有りません。(基本的に)

 

ちなみに、

EventSystemは、マウス操作やキーボードの入力操作が行われた時に、イベントを発生させてくれるすごいやつです。

 

ボタンのクリック処理が出来るのも、EventSystem君が頑張っているからです。

なので、UIのイベントが発生しない時は、だいたいEventSystemが不在だからです。

HierarchyビューのEventSystemは、消さないようにしましょう。

コメント

タイトルとURLをコピーしました