【Unity】2Dゲーム 斜め移動の移動量が大きくなる件

概要

2Dのゼルダのような、見下ろし型でプレイヤーを四方八方動かせるようなゲームにおいて、
移動の実装方法によっては、斜め方向の移動速度が大きくなり手触り感に支障をきたす場合があります。

例えば、以下の処理の場合、inputX=1, inputY=1が入力されると
斜め方向の移動量は√2になります。
これは、三平方の定理を使えば算出できます。

using UnityEngine;

public class PlayerMover : MonoBehaviour {
    
    void Update () {

        var inputX = Input.GetAxisRaw("Horizontal");
        var inputY = Input.GetAxisRaw("Vertical");

        this.transform.position += new Vector3(inputX, inputY, 0);
    }
}

斜め移動の量を、水平や垂直方向と同じ様にするには、
以下のサイトの様に斜め移動時に補正値をかけることで対応できます。
斜めに移動させる | ゲームプログラミング入門~bituse~

角度が45,135,225,315度以外の時の実装方法が見当たらなかったので、
コードを書いてみました。

実装

using UnityEngine;
using System;

public class PlayerMover : MonoBehaviour {
    
    void Update () {

        var inputX = Input.GetAxisRaw("Horizontal");
        var inputY = Input.GetAxisRaw("Vertical");

        var moveVectorBeforeCorrection = new Vector2(inputX, inputY);

        //極座標の距離rを計算
        var r = Mathf.Sqrt(
            moveVectorBeforeCorrection.x * moveVectorBeforeCorrection.x +
            moveVectorBeforeCorrection.y * moveVectorBeforeCorrection.y
            );
        
        // 極座標のラジアンを計算
        var radian = Vector2.Angle(Vector2.right, moveVectorBeforeCorrection) * Mathf.Deg2Rad;

        // 斜め移動の補正
        // 斜め45度の時、補正を最大にする。水平や垂直の時は補正をかけない。
        //
        // ・角度が45,135,225,315の時→Cosが0になるので、rには0.7071fの補正値が乗算される
        // ・角度が0,90,180,270の時→Cosが1になるので、rには0.7071f+0.2928f = 1の補正値が乗算される(つまり補正されない)
        r *= (0.7071f + 0.2928f * Mathf.Abs(Mathf.Cos(2 * radian)));

        if(inputY >= 0){
            this.transform.position += new Vector3(r * Mathf.Cos(radian), r * Mathf.Sin(radian), 0);
        }else{
            this.transform.position += new Vector3(r * Mathf.Cos(radian), -r * Mathf.Sin(radian), 0);
        }
    }
}

角度が45,135,225,315度の時、移動量がもっとも大きくなってしまうので、
この際の補正値がもっとも大きくなる様に三角関数を組みました。