投稿

Unity.PhysicsをFixedUpdateさせる

イメージ
Unity Physics 0.4.1-preview時点ではUnityPhysicsはフレームレート依存の挙動をするので従来のPhysXのようにフレームレートによらず一定間隔で物理シュミレートする場合以下のスクリプトを書いておく必要がある。   using Unity.Entities; public class UnityPhysicsFixedUpdateSystem : SystemBase { bool done = false; protected override void OnUpdate() { if (!done) { FixedRateUtils.EnableFixedRateWithCatchUp(World.GetOrCreateSystem (), UnityEngine.Time.fixedDeltaTime); done = true; } } } これはコンポーネントシステムなのでゲームオブジェクト等にアタッチする必要はない。

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のチェックボックスを有