はじめに
本記事は「【UE5】猫でも分かるChooser(動的アセットの選択)ことはじめ Part 1 - Chooserとは?編 -」の続きです!もしまだ見ていない方は Part 1 からどうぞ! pafuhana1213.hatenablog.com
Part 1 ではChooserの用途例や基本機能について説明し、「なんかChooserすごそう!便利そう!」と少し感じていただいたのかなぁと思います!(感じて!!!)
ただ実際に使おうとすると…Evaluate Chooser ノードの仕様に頭を抱えることになります。
Evaluate Chooser ノードは使用するChooser Tableアセットを動的に設定・変更することができないため、使用する箇所(キャラ・機能など)事にEvaluate Chooserノードを新たに配置する必要があるからです。
例えば「Template Animation BP(以降 TABP)を使ってアニメーション制御を共通化 ▶ 派生ABPで再生するアニメーションアセットを指定」というのはよくある実装フローです。ここにChooserを活用する場合、「TABPに Evaluate Chooser ノードを配置 ▶ 派生ABP で 使用する Chooser Tableアセットを設定」としたい所です。

が、残念ながら Evaluate Chooser ノードは動的にChooser Table アセットを変更することができないため、派生ABP毎にEvaluate Chooser ノードを配置する必要があります。これではTABPによる処理共通化・Chooserによるデータドリブン化のウマミが半減してしまします。

これはABPに限った話ではありません。例えば ダメージ処理を行う汎用BPを作る場合、Chooserを含む処理を共通化したい所ですが上述の理由によりできません。その結果、GA_Grayman_Damage, GA_Manny_Damage, GA_Dragon_Damage, GA_HogeHoge_Damage…といった感じで増えていってしまいます。これではChooserを使うのが嫌になってしまいます…

これを解決するのが、ProxyAsset / Table 機能です。これを利用することで Evaluate Chooserノードは共通・汎用処理に書くだけでOKになります!
と長くなりましたが、本記事ではProxy Asset / Table について書いていきます!
(なお、アニメーション制御にChooserを使った例が続きますが、Chooserはそれ以外にも使えます!)
微妙に長くなったので、AIに要約してもらいました(クリックで展開)
記事の要約
概要
- Unreal Engine 5(UE5)の「Chooser(動的アセット選択)」をより使いやすくするためのテクニックとして
「Proxy Asset / Table」 を活用する方法を紹介している。 - 前回(Part1)で挙げた「Evaluate Chooser ノードでは Chooser Table を動的に切り替えられない」問題を回避し、
共通処理(テンプレートABPなど)に 1 つだけノードを置いてデータ差分を外部で管理する構成を目指す。
Proxy Asset / Table とは?
- Proxy Asset
- “ID”のようなもので、動的に切り替えたいアニメーションやアセットを特定するための名前(ID)の役割。
- Proxy Table
- “ID”ごとに実際のアセット(AnimSequence など)を紐づけるためのリスト。
- これらを組み合わせることで、共通処理に
Evaluate Chooser相当のノードを増やさずに
キャラクターごとの差分管理を実現できる。
実装フローの例
- Proxy Asset の作成
- Proxy Table の作成
- 共通ABP(Template ABP)と派生ABP の設定
- Template ABP(TABP)に
Evaluate Proxyノードを配置し、必要な Proxy Asset(ID)を呼ぶ処理を組む。 - Manny や Dragon の派生ABPでは “どの Proxy Table を使うか” を設定するだけで、
それぞれのアニメーションが再生される。
- Template ABP(TABP)に
Chooser Table との併用
- Proxy Asset / Table は “アセットの動的切り替え” が得意だが、
“複数条件に応じたトリガー” の実装はノードを増やす必要がある。 - そこで Chooser Table を組み合わせると、
- 条件分岐(たとえば Speed が 0 のとき Idle、1~300 のとき Walk など)
- キャラごとのアニメ差し替え(Proxy Table)
を同時に外部データ化できる。
- さらに Proxy Asset に Chooser Table を紐づける ことで、キャラクターごとに異なるロジックを足すことも可能になる。
メリット
- 共通ロジックの ABP は最小限のノード構成のまま拡張でき、
キャラクターや動作ごとの差分は 外部アセット(Proxy Table / Chooser Table) で管理できる。 - ABP 内部を複雑にせずに済むので、規模が大きくなるほど管理がラクになる。
- アーティストやゲームデザイナーが “データ(テーブル)を編集” して実装を進めやすい、
いわゆるデータドリブンなワークフローを実現できる。
まとめ
- Proxy Asset / Table は、UE5 の “Chooser” 機能の弱点(
Evaluate Chooserの動的切り替え不可)を補完し、
汎用・共通処理に対してキャラごとのデータ差分を外部管理できる強力な仕組み。 - Chooser Table と組み合わせれば、条件分岐とキャラ差分をまとめて外部化することも可能。
- 記事の最後では、さらに運用上の知見や Tips(Part3)に続くとしており、
大規模プロジェクトでのアニメーション・イベント処理を楽にする方法として注目されている。
- はじめに
- 記事の要約
- Proxy Asset / Table ってなんなん?
- Proxy Asset / Tableを使ってみる!
- Chooser Table と Proxy Asset / Tableを併用してみる
- さいごに
Proxy Asset / Table ってなんなん?
ざっくり言うと、「Proxy Asset は ID、Proxy Table は その ID に紐づけるデータのリスト」です。
そして、これらを活用すると各キャラ毎のデータを直接ではなくIDを経由して呼ぶことが可能になるため、Evaluate Chooserノードを共通処理のみに用意するだけでOKになります。つまり、キャラ毎の違いをProxy Tableが管理するので、Chooserを呼び出す側はその違いを意識する必要がなくなります!

別の表現で言い換えると…「Proxy AssetはDataTableの行名, Proxy TableはDataTableそのもの」って感じです!
…言葉だけだとややこしく感じますが、実際はシンプルなんです!ということで、使い方・実例を交えて説明していきます。
Proxy Asset / Tableを使ってみる!
まずは上図の処理を組んでみましょう!流れはこんな感じ
- Idle, Walk 用の Proxy Asset を作成
- Manny, Dragon 用の Proxy Table を作成
- TemplateABP, Manny用ABP, Dragon用ABPを作成 ▶ 1,2で作ったものを組み込み
なお、Dragonに関しては機能別サンプル(ContentExample)のものを使用しています。
Idle, Walk 用の Proxy Asset を作成
まずはコンテンツブラウザの右クリックメニューから Proxy Asset を2つ作成し、それぞれ PA_Idle, PA_Walk と名付けます。これらが、先程の図におけるID : Idle, Walk にあたります。

次に、作成したProxy Assetを開き、ProxyカテゴリのTypeをAnimSequenceに設定します。これはProxy Asset に紐づけるアセットのクラス(タイプ)を制限するためのものです(Chooser Tableにおける Result Class に近いもの)。設定しなくても動作はするのですが、Proxy Asset・Table で扱うアセットが限定されている場合は設定しておいた方が事故は少ないです。

これでProxy Asset の準備はOK!かんたん!
Manny, Dragon 用の Proxy Table を作成
まずはProxy Tableアセットを1つ作成し、Manny用なのでPT_Mannyと名付けます。

次に、作成したProxy Tableアセットを設定していきます。ここで行っているのは、各ID(Proxy Asset)に対してアニメーションアセットの紐づけです。

Manny用のProxy Tableなので、Idle には Manny用待機モーション、Walk には Manny用歩きモーションを設定します。

Dragon用のProxy Tableも設定内容はほぼ同じなので、Manny用ProxyTableを複製しちゃいましょう!
PT_Dragonと名付けて…紐づけるアセットをDragon用のに差し替えて…終わり!

テキストだと複雑そうに感じますが、実際作ってみると簡単&シンプルですね!
(「なんかChooesr Table と設定が似てるなぁ…もしかして…?」と思った方はカンが鋭い!あとで説明するのでもう少しお待ちを!)
ABPを作成 ▶ Proxy Asset / Table を組み込み
最後に、作ったProxyAsset, TableをABPに組み込んでいきます!
まず、TABPを作成 ▶ TABPを元にManny用・Dragon用のABPを作成・設定します。TABPの作り方に関しては割愛します、下記資料をどうぞ!(作っておいて良かった!)
猫でも分かる UE5.0, 5.1 におけるアニメーションの新機能について

次に、TABPのAnimGraphに以下の処理を追加します。ここまではChooser Tableと大体同じですね!

そして、ここからが違ってきます。TABPのUpdate処理( スレッドセーフ版を推奨)にEvalute Proxy ノードを追加し、ノードの設定にあるProxy に PA_Walk を指定します。

ここで行っているのは下図の赤枠の部分で、「ID:Walkモーションを アニメーション再生処理に使うSequence プロパティに保存」ということをしています。どのProxy Table に対してリクエストするのか?に関してはProxy Tableプロパティにて制御します。

「あれ、Evaluate Chooserじゃなくて Evaluate Proxy なの?」と100割の方がツッコんだと思います! が…Proxy Asset, Tableの説明にChooser Tableとの併用もいれると頭が混乱するので、まずはProxy Asset, Tableのみで完結するようにしてます
最後に、各派生ABPのProxy Tableプロパティに適切なアセットを指定します。

これで準備完了です! レベル上に配置すると、MannyとDragonがそれぞれの歩きモーションを再生するはずです!やったね!

これで「アニメーションの制御処理はTABPで、実際に再生するアニメーションの設定・管理はキャラ毎のProxy Table で」というデータドリブンな構成を実現できます。
この構成にすることで、プログラマの手を借りなくても、ゲームデザイナー・アーティストだけで作業が完結します! アニメーション差し替えはProxy Tableの設定内容を変えるだけですし、キャラを追加する際も追加キャラ用のProxyTableとABPを用意するだけでOKになります。しかも、ABPはプロパティを設定するだけ!これは楽ちんです!
ただ、Evalute ProxyノードのProxy Asset設定も動的に変更することができないため、待機・歩きモーションを移動速度に応じて使い分ける場合だと…こんな感じになります。

うーん…なんか微妙…ProxyAssetが増えるたびにノードを追加しないといけない…こういう遷移条件も別アセットで設定・管理できたらなぁ…でも、そんな機能は…
あるやん! Chooser Tableや!!!
ということで、Chooser Table と Proxy Asset / Tableを併用し上図における問題点を解決してみます。
Chooser Table と Proxy Asset / Tableを併用してみる
まずは Animation Chooser 設定で Chooser Tableアセットを作成します。CT_CharacterBase という名前にしてみます。

次に、Add Row ▶ Lookup Proxy で行を追加し、「Bind」と書かれた部分に TABP_CharacterのProxy Tableプロパティを紐づけます。

そして、その右横にある「None」にProxy Assetを設定した後に、各行が選択される条件を設定します(TABPが持つ Speed プロパティで判定)。

そして、TABPにおけるEvaluate Proxyノードを Evaluate Chooserノードに差し替えます。

これで以下の処理を実現できました!
- Speed が 0 の場合、ABPが持つProxy Table の PA_Idle に紐づけられた アニメーションを再生
- Speedが1~300の場合、ABPが持つProxy Table の PA_Walk に紐づけられた アニメーションを再生
ChooserTableによって遷移条件を外部データ化し、ProxyAsset/Tableによりキャラ毎の設定を外部データ化することができました! その結果、共通処理の実装がシンプルになりますし、完全にデータドリブンなので挙動の変更・追加・削除がカンタンになります!これは一定規模以上のプロジェクトでは本当に重要な点なので、それが標準機能だけで実現できるのは本当に嬉しいです!
なお、「ダメージモーションを再生する!」といったように、使用するID(Proxy Asset)が確定している場合は Evaluate Proxy で十分かと思います。
更に凄いのが、
Proxy Asset には アセットだけでなくChooser Tableを紐づけられます!
例えば「Dragonの場合は歩きモーションは1つだけど、Mannyの場合は状態に応じて歩きモーションを使い分けたい」という場合、Manny用Proxy Table の PA_Walk に「状態に応じた歩きモーションを選択する」Chooser Tableを設定することで実現できます!

これをChooserを使わずに実装すると…結構めんどう!ABP毎に独自実装をしないといけないし、こういうのはキャラ毎にやりたいことが変わってくるので処理の共通・汎用化 もしづらいです。それが「外部アセットだけで(ある程度)実現できちゃう!」というのは非常に強力…!Chooser…最高や…!
さいごに
ながーーーーーーーくなりましたが、Proxy Asset・Table がどんな機能なのか、そして、Chooser Tableと組み合わせるとでUEにおける実装・データ管理フローがどう変わるのか?について書いてみました。ぼ、ぼくはすごいことになる!と興奮しっぱなしなのですが、ど、どうでしょうか?
少しでも良さそうと感じた方は、ぜひ実際に触ってみたり、機能別サンプルのAnimation_Choosersレベルをざっと眺めてみることをオススメします!(そして、もっと皆記事かいて!)
以上で機能に関しての説明は終わりなのですが、実際に運用してみて気付いたTipsや検証すべきことがいくつかあったので、今後の記事にて雑多に書こうかなと思います。
お楽しみに!
おわり
書きました