Vector3を完全に理解した人
いや結局Vector3ってそもそもなんなんだ…。
キャラクターを動かしたいんだけれど、Vector3でやっても思い通りに動かないんだが?
こういった疑問に答えます。
本記事の内容
●Vector3サンプルの詳細
●Vector3のUnityでの使われ方
この記事を書いている私は12才からフルスクラッチでゲームを作っています。
またコンパイラを専門として情報理工学の博士まで進学、中退をしており、プログラミング言語の文法にも関わる論文を書いていました。
ベクトルに関しては実用数学技能検定1級を所持しており、高校数学レベルであれば問題なく扱える範囲まで学習をしています。
本記事ではサクっと使える実行済みのコードを紹介します。
加えて数学的な背景も含めた理解が出来るよう、単純な図も添えてご説明します。
※実行環境:Unity2021.3.1f1
とりあえずコピペでVector3をなんとかしよう
プログラミングではどうしてもx,y,zそれぞれの値に意識が向きがちだと思います。
この手のベクトルの扱いで大事なのは実は「向き」と「長さ」であることを意識していただいたうえでコードを使ってみてください。
インスタンス操作
//Vector3インスタンスの新規作成 _vector3 = new Vector3(_x, _y, _z); //それぞれの軸方向の値を取得 _float = _vector3.x; _float = _vector3.y; _float = _vector3.z;
足し算、引き算、定数倍
//ベクトル同士を足し算、引き算する _vector3 = _vector3_A + _vector3_B; _vector3 = _vector3_A - _vector3_B; //ベクトルの定数倍、要するに長さを変える _vector3 = _vector3_A * _float; _vector3 = _vector3_A / _float;
基本的なベクトルのstatic変数
//ゼロベクトル、Vector3(0, 0, 0)のイメージ _vector3 = Vector3.zero; //oneと名前がついているが長さはルート3、Vector3(1, 1, 1)のイメージ _vector3 = Vector3.one; //それぞれの軸に向いており、長さが1のベクトル //右向き、Vector3(1, 0, 0)のイメージ _vector3 = Vector3.right; //左向き、Vector3(-1, 0, 0)のイメージ _vector3 = Vector3.left; //上向き、Vector3(0, 1, 0)のイメージ _vector3 = Vector3.up; //下向き、Vector3(0, -1, 0)のイメージ _vector3 = Vector3.down; //前向き、Vector3(0, 0, 1)のイメージ _vector3 = Vector3.forward; //後ろ向き、Vector3(0, 0, -1)のイメージ _vector3 = Vector3.back;
向きと長さを扱う
//ベクトルの長さを取得する _float = _vector3.magnitude; //ベクトルの向きを取得する _vector3 = _vector3.normalized;
2つのベクトルを使った操作あれこれ
//ベクトル同士の距離を計算する _float = Vector3.Distance(_vector3_A, _vector3_B); //ベクトルAからBの間を、float値の距離だけ移動させる _vector3 = Vector3.MoveTowards(_vector3_A, _vector3_B, _float); //ベクトルAからBの間を、0~1のfloat値で移動させる _vector3 = Vector3.Lerp(_vector3_A, _vector3_B, _float);
●_x, _y, _z
それぞれの軸方向のfloat値
例えばTransformでは座標や角度を表すためにもfloatが用いられている
●_float
float値
Vector3で扱われる値は基本float型
●_vector3_A, _vector3_B
Vector3のインスタンス
Vector3サンプルの詳細
ベクトルの足し算、引き算、定数倍
下図のような操作です。
引き算が少し分かりづらいかもしれませんが、
$$A + (B – A) = A + B – A = B$$
と、文字だと確かに合っていることが分かりやすいと思います。
さすがに慣れが必要ですね。
プログラミングだとどうしても数値の発想に偏りがちですが、実際にキャラクターを動かすなどの用途ではこのようなイメージで理解した方が効率的かと思います。
static変数のベクトル
要保存といってもいいでしょう。
くり返しになりますが、値よりも「向き」を意識しましょう
向きと長さ
3Dだと認識しづらいと思います、2Dで考えると下図の通りです。
図にすれば一発ですし、また速度で考えるのもオススメです。
●magnitude:秒速何メートル
という理解であればほぼ迷わなくなると思います。
2つのベクトルを使った操作
実はどれも、2つのベクトルの間のスキマを利用した関数です。
下図のDistanceで取得できる長さは、まさに先ほど引き算で求めたベクトルですよね。
ちなみに引き算で求めたベクトルのmagnitudeとDistanceの値は一致するのでご安心ください。
MoveTowardsとLerpは似ているどころかもはや同じと言っていいでしょう。
演出によってfloat値の計算がめんどいかどうかぐらいの使い分けで良いと思います。
Vector3のUnityでの使われ方
基本的にはx軸、y軸、z軸それぞれの値をまとめて管理する場合に利用されます。
例えばTransformの値はx軸を表すfloat値を直接書きかえることが出来ない仕様で、Vector3インスタンスを書きかえるしかありません。
参考:【コピペでUnity】ややこしいTransform(トランスフォーム)を爆速で理解する
このようにコーディングに最低限の制約を用意することで、予期せぬ不具合を回避したりする思想なのではないかと思っています。
以上です!
Unityはいいぞ。
コメント