Unityで移動速度とアニメーション速度を同期させて足滑りを防ぐ方法

足滑りを防ぐ

個人開発の3Dゲームに良く見られる歩行モーションと移動速度があっていないせいで足が滑る現象。最近の作品だとリメイクだがゼノブレイドDEの足滑りがものすごく気になった。少し前であったら大手のゲームでも足滑りはよく見られたが足が滑っているだけで大きく見栄えが悪くなる。
速度によってモーションを用意するのは大変だと思うかもしれないが、これは一つのモーションの速度を変えることで足滑りを防ぐという手法なので、個人開発でも容易に実装できる。
足が滑ってしまっている

移動速度とアニメーション速度を同期する

やることは簡単で、rigidbodyからvelocityを取得し定数を乗算・除算してanimatorに渡す。
下のコードではwalkAnimSpeedで割っているが除算の負荷が気になるなら逆数をキャッシュしておいて乗算すれば良い。
 private void SetAnimParameters()
    {
    	//Update等で毎フレーム呼び出す
        
        //歩行にY軸速度は関係ないのでvelocityに(1, 0, 1)を掛ける(これをしないと落下やジャンプ中に高速で再生される)
        
        //walkAnimSpeedはそのアニメーションの1倍速時の速度[m/s]で,実際に操作しながら調整する
        //対象のアニメーションがRootMotionならその移動量から計算する
        
        var velocityXZ = Vector3.Scale(_rigidbody.velocity, new Vector3(1, 0, 1));
        _animator.SetFloat("WalkSpeed", velocityXZ.magnitude / walkAnimSpeed);
    }
AnimatorのParametersに歩行アニメーション用の
パラメータ(上の画像だとWalkSpeed)を設定しておく
(MoveSpeedはアニメーション遷移用なので関係ない)

後は用意したパラメータ(WalkSpeed)を対象のアニメーションのSpeedのMultiplierに設定するだけ(Parameterのチェックボックスを有効にする必要あり)。


結果

足が滑っていない


© Unity Technologies Japan/UCL

コメント

このブログの人気の投稿

Unityでソウルライクが作りたい人のためのカメラスクリプト