0.0 はじめに
Vector3の便利な関数と変数があります。よく使われるものをまとめました。
1.0 パラメータが(0,0,0)、(1,1,1)用のベクトル変数
static(スタティック)な変数なのでVector3.xxxxで使用できます。
Vector3 vOne = Vector3.one; // ( 1, 1, 1)ベクトル
Vector3 vZero = Vector3.zero; // ( 0, 0, 0)ベクトル
2.0 上下左右前後の6方向ベクトルを表す変数
同様にstatic(スタティック)な変数なのでVector3.xxxxで使用できます。
Vector3 vB = Vector3.back; // ( 0, 0,-1) 後方向
Vector3 vD = Vector3.down; // ( 0,-1, 0) 下方向
Vector3 vF = Vector3.forward; // ( 0, 0, 1) 前方向
Vector3 vL = Vector3.left; // (-1, 0, 0) 左方向
Vector3 vR = Vector3.right; // ( 1, 0, 0) 右方向
Vector3 vU = Vector3.up; // ( 0, 1, 0) 上方向
3.0 ベクトルの大きさにかかわる変数magnitudeとsqrMagnitude
大きさにかかわる変数です。Vector3.magnitudeを使うとベクトルの大きさをfloatで返してくれます。
尚、magnitudeは平方根の計算をするので比較的重い処理です。単純にベクトル大きさを比較する場合には平方根の計算をしないVector3.sqrMagnitudeを使用しましょう。
Vector3 v = new Vector3(5, 0, 1);
float vMag = v.magnitude; // 5.09902 大きさ
float vSMag = v.sqrMagnitude; // 26 大きさの2乗
Vector3 vNor = v.normalized; // (1.0, 0.0, 0.2) 1の大きさ
4.0 ベクトルの回転を扱うQuaternion
Quaternion.Euler(x, y, z)を使ってVector3の回転ができます。回転させたい量(角度)をrotationにかけてあげます。
尚、回転では反時計回りが正の方向となります。
// z軸で45度だけ反時計回りさせています。
transform.rotation *= Quaternion.Euler(0, 0, 45f);
5.0 線形補完Lerp
オブジェクトを滑らかに移動させるためによく使うLerpは2点間にある任意の点を表現できる線形補完を行う関数です。
始まりの点Vector3 aからbまでの間の点を0から1の間の割合tで補完します。例えば0は点a、1は点b、0.5はa点とb点のちょうど真ん中を示します。
Vector3.Lerp(a, b, t)の形で使用します。
// fromから、fromからTo間の長さの4割(0.4f)の地点へ移動する
transform.position = Vector3.Lerp(from, to, 0.4f);
6.0 球面線形補間Slerp
Lerpと同じ補完を行いますがこちらは円を描くように補完します。
引数も同じくaからbまでの間の点を0から1の間の割合tで補完、Vector3.Slerp(a, b, t)の形で使用します。
// fromから、fromからTo間の長さの6割(0.6f)の地点へ球面線形移動する
transform.position = Vector3.Slerp(from, to, 0.6f);
7.0 移動時に使用するMoveTowards
Lerpと同じく線形補完ですが、MoveTowardsは出発の地点currentから目的地targetに向けての距離を設定することができます。尚、距離は目的地を超えることはありません。
// 下記をUpdate関数などに入れると時間とともに移動する
Vector3 current = Vector3.zero; //現在地
Vector3 target = Vector3.one*10; //目的地
float dist = Time.time; //現在地からの距離
// fromからToに向けての長さdistの地点へ移動する
transform.position = Vector3.MoveTowards(current, target, dist);
8.0 回転移動RotateTowards
現在地から目標値まで回転します。
maxRadiansDeltaの値で回転速度の調整ができます。
maxRadiansDeltaにマイナスの値を与えると逆方向に回転します。
// 下記をUpdate関数などに入れると時間とともに回転する(上から右に回転)
Vector3 current = Vector3.up;//現在地
Vector3 target = Vector3.right;//目標値
float maxRadiansDelta = Time.time;//2点間におけるラジアンの差分の範囲内で設定する
float maxMagnitudeDelta = 0f;//1回で何度回転させるか。
transform.position = Vector3.RotateTowards(current, target, maxRadiansDelta, maxMagnitudeDelta);
9.0 距離 Distance
ベクトルab間の距離を取得出来ます。(a-b).magnitudeと同じ結果となります。
Vector3 a = new Vector3(1, 1, 1);
Vector3 b = new Vector3(4, 5, 1);
float dist = Vector3.Distance(a, b); // dist = 5