ベクトル(Vector3)を正規化する2つの方法


概要

Unityでベクトル(UnityEngine.Vector3)を正規化する方法を2つ記します。

Unityバージョン:Unity 2019.4.14f1
使用言語:C#

結論

以下の2つでベクトルを正規化できます。

  • Vector3.Normalized
  • Vector3.Normalize()

サンプルコードはそれぞれ以下の通りです。

Normalization1.cs
Vector3 v = new Vector3(1, 1, 1); // 正規化したいベクトル, 長さは√3
Vector3 vn = v.normalized; // vを正規化したベクトルvnを新たに得た, 長さは1
Normalization2.cs
Vector3 v = new Vector3(1, 1, 1); // 正規化したいベクトル, 長さは√3
v.Normalize(); // v自身を正規化した, 長さは1

本論にて、2つ方法の違いや使い分け方を述べます。

本論

結論にて、ベクトルを正規化する方法として

  • Vector3.normalized
  • Vector3.Normalize()

の2つを挙げましたが、これらには大きな違いが2つあります。

それは以下の通りです。
Vector3.normalized

  • 変数
  • 元のベクトルは変わらない

Vector3.Normalize()

  • メソッド
  • 元のベクトルは変わる

変数かメソッドか

Vector3.normalized:変数
Vector3.Normalize():メソッド

Vector3.Normalize()はメソッドであるため、以下のようにVector3.normalizedのサンプルコードのようには使えません。

ErrorSample.cs
Vector3 v = new Vector3(1, 1, 1); // 正規化したいベクトル, 長さは√3
Vector3 vn = v.Normalize(); // エラー

このコードをVisual Studioで書くと
「型'void'を'UnityEngine.Vector3'に暗黙的に変換できません」
というエラーメッセージが出てしまいます。

また、変数名の頭文字は小文字、メソッド名の頭文字は大文字という命名規則にも留意しておきましょう。

元のベクトルは変わるか変わらないか

Vector3.normalized:元のベクトルは変わらない
Vector3.Normalize():元のベクトルは変わる

Vector3-normalized - Unity スクリプトリファレンスにも'Vector3.normalized'は「読み取り専用(Read Only)」だと書かれています。
つまり、元のベクトルは変更されません。

用途に応じて使い分けしましょう。

参考文献

Vector3-Normalize - Unity スクリプトリファレンス
Vector3-normalized - Unity スクリプトリファレンス
【Unity】ベクトルを正規化する - ぱふの自由帳