Developer

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

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

1.Vector2とは

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

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

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

using UnityEngine;

public class Vector2_Sample : MonoBehaviour {

	Vector2 v = new Vector2(1, 2);

}

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

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

void Start() {

    Vector2 v = new Vector2(10, 20);
    Debug.Log(v.x);     // 10
    Debug.Log(v.y);     // 20

}

※TransformのPosition(Vector3)の値をVector2の値で更新した場合、Z成分は自動的に0で補完されます。

 

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

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

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

using UnityEngine;

public class Vector2_Sample : MonoBehaviour {

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

}

 

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

void Start() {
    Vector2 v = new Vector2(1, 1);
    Debug.Log(v.magnitude);     // 1.414214 (=√2)
}

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

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

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

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

 

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

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

 

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

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

   Vector2 v2 = new Vector2(100, 100);
    Debug.Log(v2.normalized);     // (0.7, 0.7)
}

 

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

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

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

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

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

 

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

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

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

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

 

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

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

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

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

 

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

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

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

 

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

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

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

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

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

Unity実践編 - 目次リンク

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