今回は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メソッドで指定する引数は速度を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 地面に接地してる時は初期化 if(cCon.isGrounded) { velocity = Vector3.zero; x = Input.GetAxis("Horizontal"); y = Input.GetAxis("Vertical"); input = Vector3(x, 0, y); // 方向キーが多少押されている if(input.magnitude > 0.1f) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += input.normalized * 2; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0); } } velocity.y += Physics.gravity.y * Time.deltaTime; cCon.Move(velocity * Time.deltaTime); |
↑のように移動キーの方向を取得(input.normalized)しCharacterControllerのMoveメソッドの引数に渡しています。
RigidbodyのMovePosition関数
いっぽうRigidbodyでは
1 2 3 4 5 6 | void FixedUpdate() { // キャラクターを移動させる処理 rigid.MovePosition(transform.position + velocity * Time.deltaTime); } |
↑のようにキャラクターの現在の位置に速度を足して目的地を作り、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での違いを確認する為にちょっとしたスクリプトを作ります。
1 2 3 4 5 6 7 8 | void Update () { Debug.Log("transform.forward" + transform.forward); Debug.Log("Vector3.forward" + Vector3.forward); Debug.Log("transform.right" + transform.right); Debug.Log("Vector3.right" + Vector3.right); } |
↑のように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の値はある地点から見た位置でもあり、方向でもあるんですね。
位置と方向という別の物として取り扱ってきましたが
ということなんですね。
位置と方向と考えるからわからなくなり、Vector3はベクトルで大きさと方向を持つと解釈しておくとわかるかも?
最後にまたわからなくさせているかもしれませんね(+_+)
あ・・・・、最初の画像のC点使ってないですね・・・・(^_^;)
ご利用は計画的に(謎)