[UE5]アニメーションアセットをProxyTableで管理してみた備忘録
キャラクターごとにアニメーションを一覧で管理したくて、なんかいい方法がないか調べていたところ、Chooserプラグインでいい感じに管理できそうだったので検証内容をまとめてみました
下記の記事をみて自分なりに実装した手順を備忘録代わりにまとめたものになります
神ドキュメントに感謝です🙏
Chooserプラグインとは
Chooserプラグインとは、動的にアニメーションなどのアセットをランタイム時に選択して使用できるようにする機能が含まれているプラグインです
詳細は下記の公式のドキュメントをご確認ください
Chooserプラグインに含まれている主なアセット
Chooserプラグインを追加すると下記のアセットが使用できるようになります
- ChooserTable
- ProxyAsset
- ProxyTable
とりあえずProxyTableを作成してみる
アニメーションを管理するためのテーブルとしてProxyTableが利用できます
上記3つのアセットは他のアセットと同様に、コンテンツブラウザのADDボタンから追加できます
データテーブルと同様にMiscellaneous(その他) の欄にあります
作成されたProxyTableを開くと、ProxyとValueという行がある空のテーブルが表示されます
Valueの下にある「AddRow」をクリックすると画像のようにProxyTableに紐づけるものを指定できます
なにやらいろいろとありますが、とりあえず「Asset」を選びます
するとProxyの欄には、指定のProxyAssetの参照を設定するドロップダウンが表示され、
Valueの欄には、何かしらのAssetの参照を設定するドロップダウンが表示されます
つまり、ProxyTableはProxyAssetをKeyとしてアセットなどを管理するテーブルのようです
ProxyAssetを作成する
ProxyTableのKeyとして使用するProxyAssetを作ってみます
開いてみると、ProxyとInputという項目があります
Inputは今回使用しないのでそのままにしておき、Proxyの内容を設定します
Typeには、ProxyTableで管理したいアセットの型を指定すればよさそうです
今回は、AnimSequenceを指定します
Result Typeは正直よくわかっていないのですが、とりあえずObject Of Typeのままでよさそうでした
ProxyAssetをProxyTableに設定してみる
ProxyAssetを作成して設定を行えたので、先ほど作成したProxyTableに設定してみます
Proxyのドロップダウンを確認すると作成したProxyAssetが表示されるので選択します
ProxyAssetを設定後に、Valueの欄にあるドロップダウンをクリックしてみます
すると、ProxyAssetの設定前と異なり、AnimSequenceしか選択肢に表示されなくなりました
このように、ProxyAssetはKeyとしての役割だけでなく、行で扱うアセットの型設定も管理できるみたいです
それでは、アセットの欄にテスト用に、待機モーションを設定しておきます
これでProxyTableの設定は完了です
テーブルからアニメーションを呼び出す
テーブルはできたので、そこからアニメーションを呼び出す部分を作っていきます
とりあえず、ABPを作成していきます
今回はキャラクターごとにロジックを共有して、それぞれ別のテーブルのアニメーションを呼び出してみようと思うので、ABPはテンプレートで作成していきます
空のABPを作成したら、まずはProxyTableを保存するための変数を用意します
次に、アニメーション再生用の「SequencePlayer」ノードを追加し、OutputPoseにつなげます
このSequencePlayerの設定を見ると流すアニメーションシーケンスを設定する変数があります
通常はここにそのまま再生したいアニメーションを設定すれば流れるようになるのですが、
今回はProxyTableから取得して動的に流すアニメーションを設定したいと思います
そのため、変数の設定欄の横にある「Bind」とあるプルダウンを選択し、「Dynamic Value」に設定します
これで動的にアセットを指定できるようになったので、このノードの初期化時にアニメーションをProxyTableから持ってくる処理を追加します
SequencePlayerの詳細欄にある「On Initial Update」という関数のプルダウンを選択し、
「Create Binding」から新規の関数を生成します
作成された関数の中に移動すると自動で「Context」と「Node」という引数があります
Nodeピンを引っ張り、「Convert to Sequence Player」関数を呼び出します
これでSequencePlayerの設定にアクセスできるようになるので、「SequencePlayer」ピンを引っ張り、「Set Sequence」関数を呼び出します
この関数で先ほど「Dynamic Value」に設定したアニメーションの変数の値を変更します
それでは、ProxyTableからアニメーションを持ってくる部分を行います、
作成しておいた「AnimationTable」(ProxyTableの保存用変数)をグラフに追加します
ピンを引っ張り、「EvaluateProxy」ノードを追加します
これが、テーブルからアニメーションを持ってくるノードになります
EvaluateProxyノードの詳細欄を確認するとProxyAssetを設定する箇所があります
ここに先ほど作成したProxyAssetを設定しましょう
すると、EvaluateProxyノードの見た目が変わり、「Evaluate Proxy:[ProxyAssetName]」という表示なりました
また、Resultのピンから取得できる値の型もAnimSequenceになっています
これでProxyTableに設定された指定されたProxyAssetの行のアニメーションを取得できました
それではこのアニメーションををSeqSequenceノードにつないでアニメーションを設定しましょう
出来上がった処理が下記の画像になります
これでアニメーションを呼び出して設定することができました!
実際に確認をしてみる
ABPの設定はできたので実際にキャラクターにアニメーションを流して確認をしてみます
ThirdPersonTemplateを使用しているので、BP_ThirdPersonCharacterにABPを設定してみます
プレイをしてみると待機モーションが流れました!
キャラクターごとのテーブルを作成して紐づける
最後にキャラクターごとのアニメーションを紐づける部分を行ってみます
ProxyTableを複製して、中身を変えたものを検証用に作成します
複製したProxyTableには、Idleモーションの代わりにJumpのモーションを設定してみます
次に先ほど作成したABPを継承してChildABPを作成していきます
ABPを右クリックして、「Create Child Anim Blueprint with Skeleton」から「SK_Mannequin」を指定してChildABPを作成します
作成したABPを開き、ClassDefaultsを確認すると「AnimationTable」にProxyTableが設定されているのが確認できます
このようにChildABPで使用するProxyTableを差し替えることができます
テンプレートABPを継承したキャラクターごとのChildABPにてProxyTableを差し替えてあげれば、ロジックは同じもの(継承元のABP)を使用しつつテーブルを差し替えるだけでアニメーションを切り替えられそうです
それでは、ChildABPにて複製したProxyTableを設定します
最後に、BP_ThirdPersonCharacterに設定されているABPをChildABPに差し替えてプレイしてみましょう
待機モーションではなく、ジャンプのモーションが流れました!
最後に
思いのほか簡単にアニメーションをProxyTableで管理することができそうでした
ここにChooserTableを絡めるとより複雑なロジックでもアニメーションを管理できそうです!
この記事を書くにあたって参考にした資料などを下記にまとめてますので、今回あまり触れられなかったChooserTableや動的なアニメーション設定につきましては添付のリンクを参考にしていただければと思います
この記事が何かの参考になりましたら幸いです🙇
参考資料
Discussion