2020/11/09
今回はUnityのAnimatorに関する軽めのお話です。
ことの発端はこれ!
よく見ると、アザラシ2匹がほとんど同じモーションをとっているんですね。
私のゲームの場合、「待機中」と「移動中」のステートはRigidbody.velocity.magnitude
が一定値以上かどうかで切り替えています。
なので2匹が同タイミングで移動したり止まったりするとこうなります。機械ならともかく、生物的にはかなり不自然。
ということで、待機ステートや移動ステートに入った際に「CycleOffsetをランダムに変えてモーションをずらす」ようにしました。
まずは簡単なスクリプトを2つ作成します。
using System.Linq; using UnityEngine; public class IdleCycleSetter : StateMachineBehaviour { public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetFloat("IdleOffset", Random.Range(0, 0.5f)); } }
using System.Linq; using UnityEngine; public class MoveCycleSetter : StateMachineBehaviour { public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.SetFloat("MoveOffset", Random.Range(0, 0.5f)); } }
私は待機用(Idle)と移動用(Move)で2つ作りましたが、パラメータ名やランダムの幅をフィールドで持って共通化しても良いと思います。
次にアザラシのAnimatorControllerを開き、floot型のパラメータとして「IdleOffset」と「MoveOffset」を追加します。
待機ステートを選択し、インスペクターから先ほど作成した待機用のスクリプトを設定します。
あとはインスペクター上部にある「Cycle Offset」の右のチェックを入れ、パラメータに「IdleOffset」を指定。
移動ステートも同じようにスクリプトとCycleOffsetを設定します。
この状態で実行すると、待機・移動ステートに入る度にOffsetのパラメータが変化し、微妙にモーションの開始位置がずれます。
これで「毎回ぴっちり同じモーションになる」ことがなくなりました!