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のパラメータが変化し、微妙にモーションの開始位置がずれます。
これで「毎回ぴっちり同じモーションになる」ことがなくなりました!











