Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Vector2 / Vector3 の操作

Vector2 / Vector3 の操作

Unity での 2D 座標・方向を表す『Vector2』と、3D 座標・方向を表す『Vector3』の基本操作、距離計算・補間・正規化の使い方です。

構文
using UnityEngine;

// Vector2(2D)を作成します。
Vector2 v2 = new Vector2(float x, float y);

// Vector3(3D)を作成します。
Vector3 v3 = new Vector3(float x, float y, float z);

// 2点間の距離を返します。
float 距離 = Vector3.Distance(Vector3 a, Vector3 b);

// ベクトルを正規化します(長さが 1 のベクトルを返します)。
Vector3 正規化 = Vector3.Normalize(Vector3 value);
Vector3 正規化 = v3.normalized; // プロパティでも取得できます。

// a から b へ t(0〜1)の割合で補間します。
Vector3 補間 = Vector3.Lerp(Vector3 a, Vector3 b, float t);

// ベクトルの長さ(マグニチュード)を返します。
float 長さ = v3.magnitude;
メソッド一覧
メソッド / プロパティ概要
Vector3.Distance(a, b)a と b の 2 点間のユークリッド距離を返します。
Vector3.Lerp(a, b, t)a から b へ t(0〜1)の割合で線形補間したベクトルを返します。
Vector3.Normalize(v)v と同じ方向で長さ 1 のベクトルを返します。
v.normalizedベクトル v を正規化したものを返すプロパティです(元のベクトルは変更しません)。
v.magnitudeベクトルの長さ(大きさ)を返します。平方根計算が入るため sqrMagnitude より低速です。
v.sqrMagnitudeベクトルの長さの二乗を返します。大小比較のみなら magnitude より高速です。
Vector3.Dot(a, b)a と b の内積を返します。2ベクトルの角度関係を調べるのに使います。
Vector3.Cross(a, b)a と b の外積(両方に垂直なベクトル)を返します。
Vector3.zero / one / up / right / forwardよく使うベクトルの定数です。
サンプルコード
using UnityEngine;

public class VectorSample : MonoBehaviour
{
    [SerializeField] private Transform ターゲット;
    [SerializeField] private float 移動速度 = 3f;
    [SerializeField] private float 攻撃範囲 = 5f;

    void Start()
    {
        // Vector3 の基本操作です。
        Vector3 位置A = new Vector3(0f, 0f, 0f);
        Vector3 位置B = new Vector3(3f, 4f, 0f);

        // 2点間の距離を計算します。
        float 距離 = Vector3.Distance(位置A, 位置B);
        Debug.Log($"距離: {距離}"); // 5

        // ベクトルの大きさ(magnitude)を取得します。
        Vector3 移動方向 = 位置B - 位置A;
        Debug.Log($"magnitude: {移動方向.magnitude}"); // 5

        // 正規化(長さ 1 に変換)します。
        Vector3 単位ベクトル = 移動方向.normalized;
        Debug.Log($"normalized: {単位ベクトル}"); // (0.6, 0.8, 0.0)

        // 内積を使って「前方かどうか」を判定します。
        Vector3 自分の前 = transform.forward;
        Vector3 ターゲット方向 = (ターゲット.position - transform.position).normalized;
        float 内積 = Vector3.Dot(自分の前, ターゲット方向);
        bool 前方にいる = 内積 > 0f;
        Debug.Log($"ターゲットが前方: {前方にいる}");
    }

    void Update()
    {
        if (ターゲット == null) return;

        // 攻撃範囲内かどうかを距離で判定します(sqrMagnitude で効率化)。
        Vector3 差分 = ターゲット.position - transform.position;
        if (差分.sqrMagnitude < 攻撃範囲 * 攻撃範囲)
        {
            Debug.Log("攻撃範囲内です!");
        }

        // Vector3.Lerp() で滑らかにターゲットへ移動します。
        transform.position = Vector3.Lerp(
            transform.position,
            ターゲット.position,
            移動速度 * Time.deltaTime
        );
    }
}
概要

距離の大小比較(「5m 以内か?」のような判定)を行う場合は、Distance() より sqrMagnitude と距離の二乗を比較する方法が高速です。magnitude は内部で平方根計算(Sqrt)を行うため、Update() 内で毎フレーム使うと処理負荷が高くなります。

『Vector2』と『Vector3』は相互に暗黙的に変換できます(z 成分は 0 として扱われます)。Unity の数学関数全般についてはMathfを、時間制御を伴うアニメーションにはコルーチンを活用できるCoroutine / IEnumeratorもご確認ください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。