【Unity/C#】normalized(向きの正規化)の基本と書き方

Unityコード専用検索

コードの型

ベクトル(方向と大きさ)の長さを「1」にして、向きだけの状態にします。

C#

Vector3 direction = new Vector3(1, 1, 0); // 右上に進むベクトル

// 長さを1にする(向きは右上のまま)
Vector3 normalizedDirection = direction.normalized;

コードの仕組み

数学的には、元のベクトルの各成分を、そのベクトルの長さで割る処理をしています。

  • なぜ使うの?:
    • 斜め移動のバグを防ぐためです。
    • キーボードで「右(1, 0)」と「上(0, 1)」を同時に押すと、斜めのベクトルは (1, 1) になります。この長さは実は「約1.41」あります。
    • そのまま移動に使うと、斜め移動だけ「1.4倍速く動く」という不公平な動きになってしまいます。
  • 正規化の効果: .normalized を使うと、長さが強制的に「1」になるので、どの方向に進んでも移動速度が一定になります。

活用例(スムーズな斜め移動)

キャラクターの移動処理で、斜めに速くなるのを防ぐための定番パターンです。

C#

void Update()
{
    float h = Input.GetAxisRaw("Horizontal");
    float v = Input.GetAxisRaw("Vertical");

    // 入力方向のベクトルを作成
    Vector3 moveDir = new Vector3(h, v, 0);

    // 向きを正規化(長さ1)にしてから、スピードを掛ける
    transform.Translate(moveDir.normalized * 5.0f * Time.deltaTime);
}

その他(重要ポイント)

  • ゼロベクトルに注意: ベクトルが (0, 0, 0) の時に .normalized を使うとエラーにはなりませんが、計算結果も (0, 0, 0) になります。
  • 元の変数は変わらない: .normalized を呼び出しても、元のベクトル自体の値は変わりません。「変換した結果を別の変数に入れる」か「そのまま掛け算に使う」のが基本です。
  • Normalize(メソッド版)との違い:
    • .normalized: 変換後の新しい値を返す(元の変数はそのまま)。
    • .Normalize(): その変数自身を直接書き換える。

初心者向けまとめ

.normalized は、「速さは無視して、どっちに進みたいかという『方向』だけ教えて!」という命令です。

  • 車で言うなら「アクセル(大きさ)」を外して、「ハンドル(向き)」だけを抽出するようなイメージです。

コメント

タイトルとURLをコピーしました