【 Unity】ベクトル正規化の学習

この資料では、Unityにおけるベクトルの正規化(Normalization)の基礎を学習するためのサンプルコードを提供します。ベクトルの正規化は、ベクトルの方向を保ったまま、その長さを1にする操作で、ゲーム開発などでベクトルの方向を計算する際によく使われます。本資料では、UnityのVector2型を用いた2種類の正規化方法を紹介します。


用語の定義:

  • ベクトルの正規化: ベクトルの方向を変えずに、その長さ(大きさ)を1にする操作。ベクトルの長さを計算する際に使われる。
  • Vector2: Unityで2D空間におけるベクトルを表す構造体。Vector3は3D空間のベクトルに対応する。

正規化の必要性:

ベクトルの長さが変動する場合(例: スピードや距離の影響を受ける場合)に、ベクトルの方向のみを使用したいときに正規化を行います。例えば、移動方向を一定にしたいときや、特定の方向に力を加える場合などです。


使用する方法:

1. normalizedプロパティを使用したベクトルの正規化

normalizedプロパティを使うことで、元のベクトルを変更せずに、正規化されたベクトルのコピーを取得することができます。

public Vector2 originalVector1 = new Vector2(3, 4); // 任意のベクトル
public Vector2 normalizedVector;

void Start()
{
    // 正規化されたベクトルの取得
    normalizedVector = originalVector1.normalized;
    Debug.Log("Original Vector 1: " + originalVector1);
    Debug.Log("Normalized Vector (using normalized property): " + normalizedVector);
}
  • 説明: normalizedプロパティを使うと、元のベクトルを保持したまま、そのベクトルの正規化されたコピーを取得できます。

2. Normalize()メソッドを使用したベクトルの正規化

Normalize()メソッドを使用すると、元のベクトルそのものが正規化されます。

public Vector2 originalVector2 = new Vector2(5, 12); // 任意のベクトル

void Start()
{
    // ベクトルの正規化(元のベクトルが変更される)
    originalVector2.Normalize();
    Debug.Log("Original Vector 2 (after Normalize method): " + originalVector2);
}
  • 説明: Normalize()メソッドはベクトルを直接変更するため、元のベクトルが正規化されます。

サンプルコード: 2種類の正規化方法を比較

以下は、両方の正規化方法を組み合わせたUnityスクリプトのサンプルです。Wキーでnormalizedプロパティを使ったベクトルで移動し、SキーでNormalize()メソッドを使ったベクトルで移動します。

using UnityEngine;

public class NormalizationSample : MonoBehaviour
{
    // 2Dベクトルの定義
    public Vector2 originalVector1 = new Vector2(3, 4);  // 任意のベクトル1
    public Vector2 originalVector2 = new Vector2(5, 12); // 任意のベクトル2

    public Vector2 normalizedVector;  // 正規化されたベクトル(normalizedプロパティを使用)

    void Start()
    {
        // 1. normalizedプロパティを使用した正規化
        normalizedVector = originalVector1.normalized;
        Debug.Log("Original Vector 1: " + originalVector1);
        Debug.Log("Normalized Vector (using normalized property): " + normalizedVector);

        // 2. Normalizeメソッドを使用した正規化
        originalVector2.Normalize();
        Debug.Log("Original Vector 2 (after Normalize method): " + originalVector2);
    }

    void Update()
    {
        // Wキーを押すと、normalizedプロパティを使ったベクトルで移動
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(normalizedVector * Time.deltaTime * 5); // Normalized Vector 1 で移動
        }

        // Sキーを押すと、Normalizeメソッドを使ったベクトルで移動
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(originalVector2 * Time.deltaTime * 5); // Normalized Vector 2 で移動
        }
    }
}

動作確認:

  1. シーンセットアップ:
  • Unityで新しいプロジェクトを作成し、シーン内に2Dオブジェクト(例えば、Sphere)を配置します。
  • 上記のスクリプトを作成し、2Dオブジェクトにアタッチします。
  1. 実行方法:
  • Unityのプレイモードを開始し、Wキーを押すと、normalizedプロパティを使って正規化されたベクトルでオブジェクトが移動します。
  • Sキーを押すと、Normalize()メソッドを使って正規化されたベクトルでオブジェクトが移動します。

まとめ:

  • normalizedプロパティ は元のベクトルを変更せずに、正規化されたベクトルのコピーを取得できます。
  • Normalize()メソッド は元のベクトルを直接変更し、そのベクトルを正規化します。
  • このサンプルを使って、Unityでのベクトルの正規化を体験し、その違いを理解することができます。

Unity

Posted by hidepon