今回はUnityネタをやっていきます。
アニメーション再生時の開始位置をランダムにする方法について。
まとめ
animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));
でアニメーションを再生すれば良い
はじめに
ゲームや映像作品の背景用に適当な歩行者を配置することがあると思いますが。
全員が同じタイミングでアニメーションを再生すると完全に歩調が合ってしまい、
歩行者として見た場合かなり不自然な見た目になります。意図的に合わせたいなら別ですが。
アニメーション再生時の開始位置をそれぞれずらすことで、複数体表示しても違和感のない絵面にできます。
開発環境
Unity 2020.3.0f1
キャラクターとアニメーションはこちらのアセットを使用しています
キャラクターやAnimatorの準備
一番シンプルな方法でやります。
適当なキャラクターと再生するアニメーションを用意しておきます。
キャラクター
キャラクターをシーンに配置し、Animatorコンポーネントをアタッチします。
Animator Controller
Animator Controllerを作成し、アニメーションを紐づけておきます。
作成したAnimator ControllerをキャラクターにアタッチしたAnimatorにアサインします。
アニメーション再生開始位置をランダムにするスクリプト
using UnityEngine; public class WalkerAnimation : MonoBehaviour { public Animator animator; void Start() { animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f)); } }
アタッチしたら、変数animatorにAnimatorをアサインします。
これで完了です。
シーンを実行してみると毎回アニメーションの開始位置がランダムに変化します。
スクリプトの解説
Animator.Play()はアニメーションを再生するメソッドですが、ここで重要なのは第三引数です。
ここに時間のオフセットを設定することで、アニメーションの開始位置を指定することができます。
オフセットは0~1の値で設定できます。0以外の値の場合アニメーションは途中から再生されます。
今回は0~1までの乱数を与え、アニメーションがバラバラになるようにしています。
まとめ
animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));
でアニメーションを再生すれば良い
もっと違和感をなくしたいなら、再生速度も+-してあげるといいかも
参考資料
taskem — アニメーションの再生位置をスクリプトで管理する
※animator.ForceStateNormalizedTimeでのやり方は現在非推奨になっているようです。