斜め移動が早いゲームはもう卒業しよう!
一部界隈では、Unityで作られたクソゲーをあえて遊んで徳を積む行為が行われているそうです。そういった動画を見ているのが私も好きなので暇なときに見ています。
が、そこでよく出てくる要素として
斜め移動が早いゲームは「あ~・・・なるほどね」と、一気にクソゲー認定される傾向がある
ということです。 意図的に斜め移動が早いという仕様ではない限り、移動速度はどの方向でも統一されているべきだと思います。ということで斜め移動が早いという仕様を解決していきましょう!
やりがちな実装
サンプルコード
Unityでキャラクターを動かそうとするとき、よくやるのがInput.GetAxis("Horizontal");
やInput.GetAxis("Vertical");
なんかを使ってあげて入力値をキャラクターの移動値へと使うような流れだと思います!
ここでそれぞれの値が取る範囲が0~1なことがほとんどだと思いますが、斜めのベクトルを作るときに問題が発生します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test: MonoBehaviour { Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } private void Update() { // 入力を取得 var _h= Input.GetAxis("Horizontal"); var _v= Input.GetAxis("Vertical"); // 速度ベクトルを作成(3次元用) var _speed = new Vector3(_h, rb.velocity.y, _v); // 速度に正規化したベクトルを代入 rb.velocity =_speed; } }
しかし、この実装には問題があります。縦横移動と斜め移動で速度が変わってしまいます。
三平方の定理の復習
この問題の根っこの部分を知るためには三平方の定理を思い出す必要があります。 懐かしい三平方の定理ですが、縦と横のベクトルがそれぞれ1のとき斜辺は12 + 12 = √2 となります。
つまり斜め移動のときのベクトルの長さは 12 + 12 = √2 となります
√2っていうのは、1.414…です。よって斜め移動は通常の速度より1.4倍速度となっていることがわかります。
ほしいのは四角の内側にある円までの長さです。
つまり「正規化されたベクトル」があれば問題は解決することがわかります(ベクトルの長さが1であればOK)
正規化しよう
「正規化」というワードでピンとくる方も多いと思いますが、単純にベクトルの正規化を利用すれば解決できてしまいます! ということでコードに起こしていってみましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test: MonoBehaviour { Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } private void Update() { // 入力を取得 var _h= Input.GetAxis("Horizontal"); var _v= Input.GetAxis("Vertical"); // 速度ベクトルを作成(3次元用) var _speed = new Vector3(_h, rb.velocity.y, _v); // 速度に正規化したベクトルを代入 rb.velocity =_speed.normalized; } }
試しに斜め移動を試してみましょう(PCならWASDキーで斜めへの移動をやってみるとわかりやすいですね) これでもう斜め移動が早いゲームとは言わせない!
※ たぶん合っていると思いますが、もし間違ったこと書いてたら教えて下さい😨