ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】AnimatorControllerのステート開始時にCycleOffsetをランダムにずらす

time 2020/07/15

今回は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のパラメータが変化し、微妙にモーションの開始位置がずれます。

これで「毎回ぴっちり同じモーションになる」ことがなくなりました!

down

コメントする