こんにちは、しゅみぶろぐです。
今回はGDScriptにおけるプレイヤーやオブジェクトの斜め移動の速さを一定にする際に登場した、
(Vector2 / Vector3).normalized()
の仕組みとその使い方を解説していきます。
normalized()とは
文章として表現すると、
与えられたベクトルの大きさを向きを変えずに1にする
もっと簡単に言うと、
与えられたベクトルの向きを抽出する
処理です。
具体的に考える

数学を使って考えると、Vector2/3.normalized()は
Vector2/3の単位ベクトルを返す処理です。(習っていない人は上の図で感覚的に頼む!)
例えば、
var v = Vector2(3, 4)
var n = v.normalized() #vの単位ベクトルを返す結果は、
v = (3, 4) #大きさ5
n = (0.6, 0.8) #大きさ1となります。図で表すと下のようになります。

斜め移動の高速化を防ぐ
代表的な使用例として、Vector2(2D)やVector3(3D)における斜め移動の高速化を防ぐために用いられます。
斜め移動の高速化の問題と原因
例えば、Vector2でのプログラムとして下のスクリプトが実行されるとします。
(velocityを速度の変数として定義しています。)
if Input.is_action_pressed("move_right"): #右移動
velocity.x += 1
if Input.is_action_pressed("move_left"): #左移動
velocity.x += -1
if Input.is_action_pressed("move_up"): #上移動
velocity.y += -1
if Input.is_action_pressed("move_down"): #下移動
velocity.y += 1
ここで、右移動と上移動が同時に行われた場合どうなるでしょうか。

上の図のように、右移動と上移動を合成した斜め移動の大きさは
となり、斜め移動は通常の移動速度の約1.414倍になってしまいます。
斜めに移動すると足が速くなる!!大問題です。
ここでnormalized()の出番です。
if velocity.length() > 0: #速度が0より大きいとき ⇔ 動いているとき
velocity = velocity.normalized()というコードを加えることで斜め移動高速化問題は解決します。
実際に計算をしてみる
右移動と上移動を同時に行うとその速度ベクトルは
velocity = (1, -1)ここに、normalized()の処理を行うと
velocity = (0.707, 0.707) #大きさ1となり、大きさは
斜め移動の速度が、ほかの移動速度と一致しました。高速化は解決できたことがわかります。
まとめ
・normalized()は、対象のベクトルの単位ベクトルを返す処理
・使用例として斜め移動の高速化などを防ぐプログラムがある
今回学んだnormalized()は2D、3Dゲームでこれから何度もお世話になりそうなコードですね。
中身を理解してうまく付き合っていきましょう^^
GDScriptについてまだ基礎がかためきれていない方は、ぜひこちらの記事も参考にしてみてください。

最後まで見ていただきありがとうございました。

コメント