UnityのVector3は位置と方向を表します。どう違うんでしょうか?

今回はUnityで使うVector3について見ていきたいと思います。

Vector3を単純に考えればゲームオブジェクトが存在している場所の情報です。

わたくし達の世界で言う家の住所ですね。

しかしVector3は位置情報だけでなく方向も表しています。

この位置と方向の2つを表しているという事で混乱してしまう人もいるんではないでしょうか?

わたくしもその一人です。(^_^;)

そろそろちゃんと理解して位置と方向を使い分けたいという事で簡単にVector3について見てみようと思います。

スポンサーリンク

Unity内でのVector3について

Unityでは横軸がX軸、縦軸がY軸、前後がZ軸となっています。

今回は位置と方向の違いを見る為に下のようにX、Y、Z軸を作成し、3つの点を設定して確認してみましょう。

位置と方向の違い

3つの点はそれぞれ位置情報をVector3として持っておりA点はVector3(1,0,0)、B点はVector3(2,0,1)、C点はVector3(3,2,2)の位置にあります。

これらの情報は位置情報を表していて方向ではありません。

では方向を表すVector3について見ていきます。

原点のVector3(0,0,0)からB点Vector3(2,0,1)の方向を求めたい時があります。

こういった時は

求めたい方向=求めたい方向の座標 – 現在の座標

なので

求めたい方向=Vector3(2,0,1) – Vector3(0,0,0)となり

求めたい方向はVector3(2.0,1)となります。

これはB地点の位置情報と同じVector3の値になりますが、原点Vector3(0,0,0)からみたB点の方向も表しています。

A点からB点の方向を求めたい時は

B点Vector3(2,0,1) – A点Vector3(1,0,0)なので

A点からみたB点の方向はVector3(1,0,1)となります。

Vector3(1,0,1)だけを見るとその座標の位置情報と見ることも出来ますが、今回求めたのはA点から見たB点の方向を表した座標なんですね。

同じVector3で表すからここで混乱しますね(^_^;)

キャラクターを動かす為の関数で使うVector3について見る

ここでキャラクターを動かす為の関数で実際の例を見てみましょう。

CharacterControllerのMove関数で動かすキャラクターとRigidbodyのMovePositionで動かすキャラクターを見てみます。

CharacterControllerのMove関数

CharacterControllerのMove関数で指定する引数は移動する方向を指定します。

↑のように移動キーの方向を取得(input.normalized)しCharacterControllerのMove関数の引数に渡しています。

RigidbodyのMovePosition関数

いっぽうRigidbodyでは

↑のようにキャラクターの現在の位置に移動キーを押した方向を足して目的地を作り、RigidbodyのMovePosition関数の引数に渡しています(velocityの計算はCharacterControllerと同じなので省略)。

このように引数にVector3の値を渡す時に位置を指定する必要がある場合や方向を指定する必要がある場合があります。

Vector3の引数を渡す必要がある関数を使用する場合は位置なのか方向なのかをUnityのスクリプトマニュアルを見て確認した方がいいと思います。

ゲームオブジェクトが向いている方向から向きを取得する方法

最後にゲームオブジェクトが向いている方向(前方)から前後左右、上下の向きを取得するのに簡単な方法があります。

自身のゲームオブジェクトの位置情報はtransformで取得出来ます。
それを使って

transform.forward(ゲームオブジェクトが向いている方向)
transform.right(ゲームオブジェクトの右方向)

等と簡単に取得出来ます。
ここでは言及してませんが、他の方向を表すプロパティもあります。

似たようなものに

Vector3.forward(ワールド空間の前方)
Vector3.right(ワールド空間の右方向)

がありますが、これはゲームの世界の前方と右方向なので値は常にVector3(0,0,1)とVector3(1,0,0)になります。

transformとVectot3での違いを確認する為にちょっとしたスクリプトを作ります。

↑のようにUpdateで毎フレーム方向を出力します。
シーンにCube等のゲームオブジェクトを設定しこのスクリプトを取りつけます。

デフォルトのゲームオブジェクトはPositionとRotationのX、Y、Zが0でScaleが1なので
最初はConsoleにtransform.forwardとVector3.forward、transform.rightとVector3.rightは同じ値を出力します。

Unityの実行ボタンを押してからSceneタブを表示し、Cubeを回転させてみてください。

方向のサンプル

Vector3.forwardとVector3.rightは常に同じ値を出力しますが、transform.forwardとtransform.rightはこのゲームオブジェクトの向いている方向から見た前方と右方向を出力していることがわかると思います。

結局のところ位置と方向はどう使い分けてるの?

これで簡単ではありますが、Vector3で位置と方向を扱い方が少しわかったのではないでしょうか?

引数にVector3を指定する関数は結構ありますが、位置なのか方向なのかを理解して使えるようにしていくと困らなくなるかもしれません。

信じるか信じないかはあなた次第です!!(謎)

ここまでで位置と方向の扱い方についてやってきましたが、Vector3はベクトルであり大きさと向きを持っています。

つまり、このVector3の値は位置でもあり、方向でもあるんですね。

位置と方向という別の物として取り扱ってきましたが

  • 位置の場合は原点(0, 0, 0)から見た場所
  • 方向の場合はある点からみた場所
  • ということなんですね。

    位置と方向と考えるからわからなくなり、Vector3はベクトルで大きさと方向を持つと解釈しておくとわかるかも?

    最後にまたわからなくさせているかもしれませんね(+_+)

    あ・・・・、最初の画像のC点使ってないですね・・・・(^_^;)

    ご利用は計画的に(謎)