Developer

【初心者Unity】Vector3のスクリプト操作まとめ
2022.01.11
Lv1

【初心者Unity】Vector3のスクリプト操作まとめ

1.Vector3とは

Vector3はUnityで3Dのベクトル(位置や方向)を表すために使用する構造体です。
位置情報であるTransformのpositionや速度情報であるRigidbodyのvelocityなどもVector3構造体であり、それらはVector3型として扱われます。
構造体についての詳しい解説はここでは行いませんが、最初は「Vector3とはX, Y, Z の3成分で構成される情報である」とイメージしておきましょう。

Vector2に関するまとめはこちら ⇒ Vector2のスクリプト操作まとめ
構造体の使い方についてはこちら ⇒ 構造体の基本的な使い方

コンストラクタ
Vector3のデータの作り方です。

using UnityEngine;

public class Vector3_Sample : MonoBehaviour {

	Vector3 v = new Vector3(1, 2, 3);

}

「new Vector3(x, y, z)」のかっこの中の3成分を指定することで、Vector3のデータを生成できます。
変数に代入する場合はVector3型の変数を用意しましょう。

各成分の値はx, y , zの変数で取得できます。

void Start() {

    Vector3 v = new Vector3(10, 20, 30);
    Debug.Log(v.x);     // 10
    Debug.Log(v.y);     // 20
    Debug.Log(v.z);     // 30

}

 

2.Vector3でよく使用される変数

頻繁に使用するVector3のデータは、値が取得しやすいよう変数が用意されています。

Static変数
Unityのワールド座標における上下左右や前後方向を表すベクトルを簡単に取得できます。
(前項で紹介したコンストラクタを使用する必要がないので少し楽に記述できます)

using UnityEngine;

public class Vector3_Sample : MonoBehaviour {

	Vector3 v1 = Vector3.one;     // new Vector3(1, 1, 1) と同じ意味
	Vector3 v2 = Vector3.zero;    // new Vector3(0, 0, 0)
	Vector3 v3 = Vector3.up;      // new Vector3(0, 1, 0)
	Vector3 v4 = Vector3.down;    // new Vector3(0, -1, 0)
	Vector3 v5 = Vector3.right;   // new Vector3(1, 0, 0)
	Vector3 v6 = Vector3.left;    // new Vector3(-1, 0, 0)
	Vector3 v7 = Vector3.forward; // new Vector3(0, 0, 1)
	Vector3 v8 = Vector3.back;    // new Vector3(0, 0, -1)

}

 

Vector3.magnitude
ベクトルの長さ(float)を取得するための変数です。

void Start() {
	Vector3 v = new Vector3(1, 1, 1);
	Debug.Log(v.magnitude); // 1.732051 (=√3)
}

Vector3のデータ同士は足し算や引き算が出来るため、例えばプレイヤーと敵の座標の差からmagnitudeを取得することで間の距離を取得できます。
ですが、後ほど紹介するDistanceメソッドでも同じことができるため、下記は理解の補足程度にとらえてください。

void Start() {
    Vector3 playerPos = new Vector3(1, 1, 1);
    Vector3 enemyPos = new Vector3(10, 10, 10);

    // ベクトルの引き算をして差を求める
    Vector3 distance = playerPos - enemyPos;

    // 差から距離を取得
    Debug.Log(distance.magnitude);
}

 

Vector3.sqrMagnitude
ベクトルの長さの2乗の値(float)を取得出来る変数です。
前項のmagnitudeと違い、平方根の計算を行わないため処理がいくらか軽量です。
2つのオブジェクトのうちどっちが近いか?などの単純な距離の比較をする場合には、こちらの変数の使用が推奨されています。

void Start() {
    Vector3 v = new Vector3(1, 1, 1);
    Debug.Log(v.sqrMagnitude);     // 3 (√3の2乗)
}

 

Vector3.normalized
長さが1となるベクトル(単位ベクトル)を取得できる変数です。
ベクトルの長さが違ったとしても、向きが同じであればnormalizedの値は同じになります。

void Start() {
    Vector3 v1 = new Vector3(1, 1, 1);
    Debug.Log(v1.normalized);     // (0.6, 0.6, 0.6)

   Vector3 v2 = new Vector3(100, 100, 100);
    Debug.Log(v2.normalized);     // (0.6, 0.6, 0.6)
}

 

3.Vector3でよく使用される関数

Vector3ではベクトル操作に関する関数が複数用意されています。ここではよく使うものを紹介します。

Vector3.Distance(a, b)
ベクトルab間の距離を取得出来ます。(a-b).magnitudeと同じ結果となります。

void Start() {
    Vector3 a = new Vector3(1, 1, 1);
    Vector3 b = new Vector3(10, 10, 10);

    float dist = Vector3.Distance(a, b);
    Debug.Log(dist);
}

 

Vector3.MoveTowards(a, b, s)
aからbに向けてsだけ移動させた分のベクトルを取得出来ます。
単独で使用されることよりも、Updateと組み合わせて目的の座標に等速度で近づける処理を作るときに使われます。

void Update() {
	Vector3 playerPos = transform.position;
	Vector3 targetPos = new Vector3(10, 10, 10);

	transform.position = Vector3.MoveTowards(playerPos, targetPos, 5.0f * Time.deltaTime);
}

※Time.deltaTimeはフレームの経過時間です。かけ合わせることで実行環境による移動量の差異を無くします。

 

Vector3.Lerp(a, b, t)
ベクトルab間をtで補完した値を取得出来ます。tの値はab間の割合を表すため、例えばtを0.5fとすると、ab間の半分(50%)の位置を指すベクトルを取得出来ます。
単独で使用されることよりも、Updateと組み合わせて目的の座標にゆっくり近づけるなどの処理を作るときに使われています。

void Update() {
	Vector3 playerPos = transform.position;
	Vector3 targetPos = new Vector3(10, 10, 10);

	transform.position = Vector3.Lerp(playerPos, targetPos, 0.5f * Time.deltaTime);
}

※Time.deltaTimeはフレームの経過時間です。かけ合わせることで実行環境による移動量の差異を無くします。

 

Vector3.Max(a, b)
ベクトルabのうち大きい方を返します。
※小さい方を取得したい場合はMin関数を使います。

void Start() {
	Vector3 a = new Vector3(1, 1, 1);
	Vector3 b = new Vector3(2, 2, 2);

	Debug.Log(Vector3.Max(a, b));   // (2.0, 2.0, 2.0)
}

 

Vector3.Normalize(v)
引数に渡したベクトルと同じ向きで、長さが1となるベクトルを取得できる関数です。
返る値はVector3.normalizedの変数で得られる値と同じです。

void Start() {
	Vector3 v = new Vector3(20, 20, 20);
	Vector3 nlz = Vector3.Normalize(v);

	Debug.Log(nlz); 	// (0.6, 0.6, 0.6)
}

 

Normalize()
作用させたベクトル自体を、長さが1のベクトルに書き換えます。
※ Static関数ではないので、Vector3オブジェクトから呼び出します。

void Start() {
	Vector3 v = new Vector3(20, 20, 20);
	v.Normalize();

	Debug.Log(v);   	// (0.6, 0.6, 0.6)
}

以上、Vector3のよく使うところの紹介でした。

Vector3に関するまとめはこちら ⇒ Vector3のスクリプト操作まとめ

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次