Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Unityネタ】アニメーションの再生開始位置をランダムにする

今回はUnityネタをやっていきます。
アニメーション再生時の開始位置をランダムにする方法について。

f:id:Raspberly:20210513040305g:plain

まとめ

animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));

でアニメーションを再生すれば良い

 

 

はじめに

ゲームや映像作品の背景用に適当な歩行者を配置することがあると思いますが。
全員が同じタイミングでアニメーションを再生すると完全に歩調が合ってしまい、
歩行者として見た場合かなり不自然な見た目になります。意図的に合わせたいなら別ですが。

f:id:Raspberly:20210513023845g:plain

 

アニメーション再生時の開始位置をそれぞれずらすことで、複数体表示しても違和感のない絵面にできます。

f:id:Raspberly:20210513023905g:plain

 

 

 

開発環境

Unity 2020.3.0f1

 

キャラクターとアニメーションはこちらのアセットを使用しています

Low Poly Animated People

 

 

 

 

キャラクターやAnimatorの準備

一番シンプルな方法でやります。
適当なキャラクターと再生するアニメーションを用意しておきます。

キャラクター

キャラクターをシーンに配置し、Animatorコンポーネントをアタッチします。

f:id:Raspberly:20210513032435p:plain

Animator Controller

Animator Controllerを作成し、アニメーションを紐づけておきます。

f:id:Raspberly:20210513031616p:plain

作成したAnimator ControllerをキャラクターにアタッチしたAnimatorにアサインします。

f:id:Raspberly:20210513032528p:plain

アニメーション再生開始位置をランダムにするスクリプト

以下のC#スクリプトをキャラクターにアタッチします。

using UnityEngine;

public class WalkerAnimation : MonoBehaviour
{
    public Animator animator;

    void Start()
    {
        animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));
    }
}

 

アタッチしたら、変数animatorにAnimatorをアサインします。

f:id:Raspberly:20210513033013p:plain

これで完了です。
シーンを実行してみると毎回アニメーションの開始位置がランダムに変化します。

 

 

 

スクリプトの解説

Animator.Play()はアニメーションを再生するメソッドですが、ここで重要なのは第三引数です。
ここに時間のオフセットを設定することで、アニメーションの開始位置を指定することができます。
オフセットは0~1の値で設定できます。0以外の値の場合アニメーションは途中から再生されます

 

今回は0~1までの乱数を与え、アニメーションがバラバラになるようにしています。

docs.unity3d.com

 

 

 

まとめ

animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));

でアニメーションを再生すれば良い

 

 

もっと違和感をなくしたいなら、再生速度も+-してあげるといいかも

 

 

 

参考資料

taskem — アニメーションの再生位置をスクリプトで管理する

※animator.ForceStateNormalizedTimeでのやり方は現在非推奨になっているようです。