UnityのAnimatorの保存と再生の機能

今回はUnityのAnimatorの保存機能と再生機能を使ってみようと思います。

Animatorの保存機能と再生機能を使うとゲーム中のキャラクターのアニメーションを保存して再生する事が出来ます。

この保存機能はAnimatorの保存なのでAnimatorControllerのアニメーションの動きしか保存できない為、キャラクターのアニメーションの動きをゲーム中に反映させていない場合(AnimatorのApply Root Motionにチェックを入れていない場合)は移動値等を再現出来ません。

ただゲーム中に実行したアニメーションを即座に再生したい時などは便利かもしれません。

↑のようなキャラクターのアニメーションの保存と再生の機能が出来ました。

アニメーションの動きは保存してますが、キャラクターの向き等は保存できない為、録画開始時の位置と向きになります(アニメーションで向きを変えなければ)。

スポンサーリンク

Animatorの保存と再生機能

Animatorには元々保存と再生の機能が備わっているのでその機能を呼び出して実行するだけで出来ます。

ただ、再生をする時にはAnimatorControllerのアニメーションパラメータのデータを使う必要があるみたいなので、キャラクターのAnimatorとは別にレコーダーのAnimatorを作り、

そこにfloat型のアニメーションパラメータを用意してその数値を使用する必要があります。

Recorderオブジェクトの作成

まずは保存と再生を扱うゲームオブジェクトを作成しそこにAnimatorやスクリプトを設定するようにします。

ヒエラルキー上に空のゲームオブジェクトを作成し名前をRecorderとします。

RecorderにはインスペクタのAdd ComponentからMiscellaneous→Animatorを取り付けます。

Assetsフォルダで右クリックからCreate→AnimatorControllerを選択し名前をRecorderAnimatorとして、アニメーションパラメータにfloat型のSpeedを作成します。

レコーダー用のAnimatorControllerにSpeedを作成

RecorderAnimatorはアニメーションパラメータのSpeedを使うだけなので特に状態や遷移は作成しません。

RecorderゲームオブジェクトのAnimatorにこのRecorderAnimatorをドラッグ&ドロップします。

Animator保存スクリプトの作成

次にAnimatorRecorderスクリプトを作成しRecorderゲームオブジェクトに取り付けます。

isPlayBackはAnimatorを再生中かどうかのフラグ。

animatorはキャラクターのAnimatorを指定し、recorderAnimatorには先ほど作成したRecorderAnimatorを設定します。

defaultPosとdefaultRotはキャラクターのAnimatorを録画する前の位置と角度を入れておくフィールドとして使用します。

Startメソッドでレコーダー用のAnimatorのアニメーションパラメータのSpeedを1にして通常の速度で再生するようにします。

スロー再生や早送りをしたい時はこの値を操作します。

StartRecordメソッドは保存ボタンを押した時に実行するメソッドです。

ここでキャラクターの位置や角度をデフォルトの値として保持しておきます。

Animatorの保存は

↑のように保存フレーム数を指定して保存を開始させます。

指定出来る数は10000までで0を指定するとStopRecordingメソッドが呼ばれるまで保存します。

キャラクターのAnimatorとRecorderのAnimatorの両方のStartRecordingを呼び出して同期させます。

StopRecordメソッドは保存を停止ボタンを押した時に呼び出すメソッドでこちらはStopRecordingメソッドを呼び出して保存を停止しているだけです。

PlayBackメソッドでは

のようにAnimatorのrecorderStopTimeプロパティで保存を終了した位置を取得出来るのでそれが0以下だと保存してないのでreturnでその後の処理をさせません。

その後Rebindメソッドで再配置します。

その後

でAnimatorの再生をします。

再生をする時に保存の最初の位置から再生したいので

とanimator.recorderStartTimeで最初の位置を取得しそれをanimator.playbackTimeに入れることで最初から再生させます。

StopPlayBackメソッドは再生を停止ボタンを押した時に呼び出すメソッドで

のようにStopPlayBackメソッドを呼び出して再生を停止させます。

Updateメソッドでは再生中にplaybackTimeの値を更新して保存したAnimatorを徐々に再生させています。

再生位置はRecorderAnimatorのplaybackTimeにRecorderAnimatorのアニメーションパラメータのSpeed値にTime.deltaTimeをかけて再生位置を計算します。

保存した位置を超えた場合は最初に戻り、また再生していくという形になります。

Recorderゲームオブジェクトのインスペクタは

Recorderゲームオブジェクトのインスペクタ

↑のようになります。

animatorには操作するキャラクターのAnimatorを設定します。

Recorderの機能を呼び出すUIの作成

先ほど作成したAnimatorRecorderスクリプトのメソッドを呼び出すUIのボタンを作成します。

AnimatorRecorderスクリプトのメソッドを呼び出すUIボタン

↑のように4つのボタンを作成し、それぞれのボタンのOnClickでStartRecordメソッド、StopRecordメソッド、PlayBackメソッド、StopPlayBackメソッドを指定します。

これで機能が完成しました。

終わりに

今回の記事の機能を作成するとAnimatorの保存が出来ますが、保存したデータの出力やキャラクターの動いた位置を記録するのは難しいので、自前のキャラクターの動きを保存する機能を作成しました。

というか・・・、このAnimatorの機能を知らずに先にそちらを作ってしまったんですが・・・・(^_^;)

その機能は

Unityでゲームプレイの保存をするゴースト機能を作成していきます。ただ単にゲームプレイの保存だけでなくアクションの例を示す時にも使えそうです。

の記事を参照してください。

参考サイト

今回の機能を作成するにあたり

Unity is the ultimate game development platform. Use Unity to build high-quality 3D and 2D games, deploy them across mobile, desktop, VR/AR, consoles or the Web...

のフォーラムのスクリプトを参考にさせて頂きました。

そちらのスクリプトはアニメーションスピードを変更する部分まで作成されています。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます