んななのゲーム開発備忘録

ゲーム制作の進捗と開発メモなど掲載しています。

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かしてすーっと止める

UnityではRigidBodyコンポーネントのAddForce()で力を加えて徐々に加速させられます。
どんどん加速していくのでゲームに使う時は速度制限が必要です。
そんな時に使えるTipsです。

手っ取り早く使いたい方は

RigidBody _rb;
Vector3 _moveVector;                  // 移動速度の入力
public float moveForceMultiplier;     // 移動速度の入力に対する追従度
_rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));

を使えばおっけーです。moveVectorは目的に応じて中身が変わります。
これを使うとどう動くか見たい場合は記事の一番最後の動画を見てみてください(。・ω・。)


どういうもの?

RigidBodyのAddForce()を使ってキャラクターなどを移動する際は最大の移動速度を決めておいて、
それ以上の速度になった時にAddForce()をやめるっていう方法をよく見ます。

簡単でわかりやすい方法ですが、キャラクターを止める力が働かないので移動速度が速くなってしまうと
全然止まらないのが欠点だと思います。

今回紹介するのはAddForceの引数に移動させたい速度の入力と、現在の移動速度を含めることで
すーっと動きはじめて、すーっと動きが止まる、そんな移動方法です。


実装

ソースコードは次の通り。

RigidBody _rb;
public bool isUseCameraDirection;    // カメラの向きに合わせて移動させたい場合はtrue
public float moveSpeed;              // 移動速度
public float moveForceMultiplier;    // 移動速度の入力に対する追従度
public GameObject mainCamera;
float _horizontalInput;
float _verticalInput;

void Start()
{
    _rb = GetComponent<RigidBody>();

    if(mainCamera == null)
        mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
}

void Update()
{
    _horizontalInput = Input.GetAxis("Horizontal");
    _verticalInput = Input.GetAxis("Vertical");
}

void FixedUpdate()
{
    Vector3 moveVector = Vector3.zero;    // 移動速度の入力

    if(isUseCameraDirection)
    {
        Vector3 cameraForward = mainCamera.transform.forward;
        Vector3 cameraRight = mainCamera.transform.right;
        cameraForward.y = 0.0f;    // 水平方向に移動させたい場合はy方向成分を0にする
        cameraRight.y = 0.0f;

        moveVector = moveSpeed * (cameraRight.normalized * _horizontalInput + cameraForward.normalized * _verticalInput);
    } else
    {
        moveVector.x = moveSpeed * _horizontalInput;
        moveVector.z = moveSpeed * _verticalInput;
    }

    _rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));
}


すーっと止まるのは

_rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));

この行で入力移動速度と現在の移動速度の差に応じて力を加えるからで、
入力がなくなったときには入力移動速度は0になるので、減速する方向に力が加わるって寸法ですね( -v- 。)

参考にmoveForceMultiplierを変化させたときのキャラクターの挙動を示した動画を載せておきます。
値が大きいほどきびきび動きます。
好みに合わせて値を設定するとよさそうです。


UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その1)

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その2)

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その3)


以上、Unityのキャラクターの移動方法に関するTipsでした。