0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UE6 のアニメーションは Verse と UAF にどう分割されたか

0
Posted at

はじめに

UE6(ue6-main)で FirstPersonTemplate を Verse だけで再実装できるか を調べた記事の続きです。

結論は「カメラ・入力・移動・フレームワーク層の Verse API が無いので現状は無理」だったのですが、その調査の過程で アニメーション周りが AnimBP から大きく作り替えられている ことに気づきました。具体的には、AnimBP が担っていた役割が Verse と UAF(Unreal Animation Framework)の2つに分割 されています。

ここは FirstPerson の移植可否(=結局カメラ・入力が無い時点で詰む)にはあまり影響しないのですが、UE6 のアーキテクチャの話として面白かったので、前回の記事から切り出して まとめることにしました。本記事は アニメーション層と、その土台になっている RigVM の位置づけ が中心です。

調査環境について:
ue6-main / コミット: ef011d7aa002、調査日: 2026-06-21
本記事で触れる UAF / UAFChooser 系プラグインは すべて EnabledByDefault: false の Experimental、SceneGraph(EntityFramework)は Beta、Verse コアは安定版(IsBetaVersion: false)だが未有効、という状態です。API は今後ガラッと変わる前提で読んでいただければと思います。
プラグインやファイルのリストアップには Claude Code / Codex も併用しています。確認はしていますが、最終的にはご自身の環境でも確認するのを推奨します。
また、本記事は 「ソースから確認できた事実」と「推測」を区別して書く よう心がけています。推測の箇所はその旨を明示します。


結論:Verse → UAF は通る、UAF → Verse はまだ

先に要点だけ。Verse と UAF の間の連携は 片方向だけ整っていて、逆方向はまだほぼ無い 状態です。

方向 状況
Verse → UAF(再生指示) PlaySkeletalAnimation でアニメを再生できる
Verse → UAF(途中制御) Easeable でブレンドを後から操作できる
UAF → Verse(AnimNotify 相当) ✕ Verse 側に通知 API なし
UAF → Verse(ステート遷移通知)
UAF → Verse(ルートモーション値の取得)

「Verse から再生を指示する」ことはできるけれど、「アニメ側で起きたこと(攻撃判定のタイミング、ステート遷移、ルートモーション)を Verse 側で受け取る」仕組みが、現時点ではまだ用意されていません。AnimBP 時代には当たり前にあった AnimNotify がごっそり無い、という状態です。詳細は後半で見ていきます。


AnimBP の何が変わったのか

まずは大局観から。UE5 までと UE6 で、構造がどう変わったかを整理します。

UE5 まで:

AnimBP は「Blueprint の一種」でした。ゲームロジックを書く Gameplay BP と、アニメーションを書く AnimBP が、同じ VM・同じグラフ基盤の上に乗った兄弟 だったわけです。

UE6:

UE6 では、ゲームロジックを担う Verse(VerseVM 上で動く) と、アニメーションを担う UAF(RigVM 上で動く) が、そもそも別の仮想マシンの上に分かれて います。AnimBP のように「同じ基盤の派生」ではなく、言語・VM レベルで分離 されたのが UE6 の構図です。

イメージとしてはこんな感じです。

  • Verse = 「監督」(このシーンでこの曲を流せ、と指示する)
  • UAF = 「音響エンジニア」(その曲をどうフェードイン・ミックス・カットするか組む)
  • 境界 = 曲のリスト(AnimSequence)の受け渡しだけ

AnimBP 時代は監督と音響エンジニアが同じ Blueprint の中に同居していましたが、UE6 では役割がはっきり分かれた、というのが私の理解です。


UAF(Unreal Animation Framework)とは

Engine/Plugins/Experimental/UAF/ 配下に、AnimBP の後継となるプラグイン群が 14 個 あります。

プラグイン 役割
UAF コア(IsExperimentalVersion: true
UAFAnimGraph AnimGraph 本体(AnimBP の Anim Graph 後継)
UAFAnimNode アニメノード
UAFStateTree AnimBP のステートマシン相当を StateTree で記述
UAFChooser アニメ選択(条件分岐)
UAFLayering / UAFMirroring / UAFPoseSearch / UAFWarping 各種アニメ機能
UAFControlRig ControlRig 統合
UAFMass / UAFAnimGen / UAFSharedAssets / UAFTestSuites 周辺

ポイントは2つです。これらはすべて RigVM ベース(後述)で、Verse で書くものではありません。そして、AnimBP のステートマシンに相当するのは UAFStateTree が担当します。AnimGraph 内のステートマシンが、独立した StateTree として切り出された形ですね。


Verse 側の modifier(skeleton) モデル

では Verse 側はアニメーションに対して何ができるのか。鍵になるのが modifier(skeleton) という考え方です。

Engine/Plugins/EntityFramework/Source/EntitySkeletalAnimation/Verse/SkeletalAnimation.native.verse

@experimental
@available{MinUploadedAtFNVersion := 4100}
skeletal_animation<public><native> := class(skeletal_animation_base, modifier(skeleton)):
    Evaluate<native><override>(InValue:skeleton)<reads>:skeleton
    SetProperty<epic_internal><native>(PropertyName: string, NewValue: any, MarkDirty: logic)<transacts>:void
    InternalAsset<epic_internal><native>:animation_asset = animation_sequence{}

HasSkeletalAnimation.native.verse

has_skeletal_animation<epic_internal><native> := interface:
    @editable
    @category("Animation")
    SkeletalAnimation<epic_internal>:modifier_stack(skeleton)

ざっくり言うと、Verse 側からは AnimationSequence をエンティティに割り当て、modifier として skeleton に積む ことができます。skeletal_animationmodifier(skeleton) を実装していて、Evaluateskeleton を受け取って skeleton を返す——つまり 「ポーズを加工する処理」を Verse 側のオブジェクトとして表現 している、という構造です。


Verse ↔ UAF のブリッジ

では、Verse 側で作った modifier(skeleton) が、どうやって UAF(RigVM 側)のアニメーション評価につながるのか。その接続点がこのヘッダにありました。

Engine/Plugins/EntityFramework/Source/EntitySkeletalAnimation/Private/UAFGraphFactoryAsset_SkeletonModifier.h

namespace verse { class modifier; }

USTRUCT(DisplayName="modifier(skeleton)", meta=(Hidden))
struct FUAFGraphFactoryAsset_SkeletonModifier : public FUAFGraphFactoryAsset
{
    explicit FUAFGraphFactoryAsset_SkeletonModifier(TInterfaceInstance<verse::modifier> InModifier)
        : ModifierObject(InModifier.GetObject()) {}
    UPROPERTY()
    TWeakObjectPtr<UObject> ModifierObject;
};

FUAFGraphFactoryAsset を継承した構造体が、コンストラクタで verse::modifier を受け取って保持しています。つまり Verse の modifier(skeleton) が、そのまま UAF AnimGraph のソース(入力アセット)として取り込まれる 設計になっている、ということです。

ここまでを図にすると、こうなります。

Verse は「どのアニメを使うか」を供給し、UAF が「それをどう評価・ブレンドして最終ポーズを作るか」を担う。境界は modifier(skeleton) の受け渡し、という分担です。


双方向 API の現状

ここからが本題です。Verse と UAF の間の通信が、方向によってどれくらい整っているかを見ていきます。

Verse → UAF 方向(再生指示)

SkeletalAnimationPlay.native.verse に、再生を指示する API があります。

@experimental
@available{MinUploadedAtFNVersion := 4100}
(Entity:entity).PlaySkeletalAnimation<public>(
    Animation:skeletal_animation,
    ?EaseInWindow:easing_window = easing_window{},
    ?EaseOutWindow:easing_window = easing_window{})
<decides><transacts> : play_skeletal_animation_result

エンティティに対して PlaySkeletalAnimation を呼ぶとアニメが再生され、戻り値の play_skeletal_animation_result が持つ Easeable を使うと、再生中アニメのブレンドを後から操作 できます。つまり 「再生しろ」「ブレンドをこう変えろ」という Verse → UAF の指示はできる ということです。

UAF → Verse 方向(通知)

問題は逆方向です。EntitySkeletalAnimation/Verse/ 配下の全 .verse を、listenable / subscribable_event / notify で検索したところ、ヒット 0 件 でした。

AnimBP 時代に当たり前にあった、以下のような「アニメ側からゲームロジック側への通知」が、現状の Verse API には 存在しません

AnimBP 時代の機能 UE6 Verse API
AnimNotify(攻撃ヒット・足音・エフェクト発火)
ステート遷移イベント("Idle → Walk" など)
アニメ末端到達通知
ルートモーション値の取得

UAF 側には EvaluationNotifies プラグイン(AnimNotify の UAF 版にあたるもの)が存在しますが、これは すべて C++ 実装で Verse バインディングがありません。UAF AnimGraph の中で完結する仕組みで、Verse からは触れない、ということです。

整理すると、双方向はこうなります。

なぜそう言えるのか(イベント基盤自体は機能している)

「単にまだ Verse のイベント基盤が無いだけでは?」とも思ったのですが、そうではなさそうです。SceneGraph のコンポーネントレベル(たとえば KeyframedMovementComponent)には、Stopped / Played / Paused / Finished / KeyframeReached といった listenable イベントが豊富に揃っています

つまり Verse 側のイベント/購読の仕組みそのものは機能している わけで、Skeletal Animation 側にだけ、その通知がまだ実装されていない という状態です。

推測: Skeletal Animation が @experimental であることを踏まえると、UAF → Verse の通知系は「設計上できない」のではなく「Experimental 段階でまだ整備されていない」だけ、と考えるのが自然だと思います。ただし Epic 内部の意図までは分からないので、ここは推測です。


RigVM の位置づけ

UAF が「RigVM ベース」と何度か書いてきましたが、その RigVM 自体についても整理しておきます。

RigVM とは

Engine/Plugins/Runtime/RigVM/RigVM.uplugin

  • Description: "Provides frontend and backend for the RigVM visual programming language and runtime"
  • EnabledByDefault: true

RigVM は 汎用のビジュアルプログラミング言語 + 仮想マシン です。Blueprint より低レベルで高速、かつ ドメイン特化エディタの共通基盤 として使われています。

Control Rig との関係

Control Rig は、この RigVM の上に乗っているドメイン特化アプリの1つです。ControlRig.h で、

UControlRig : public URigVMHost

と明示されていて、ControlRig.upluginRigVM を必須プラグインとして宣言しています。

補足(推測): 業界的には「Control Rig が先に生まれ、その汎用グラフ/VM 部分が RigVM として切り出された」と知られていますが、その経緯を示す公式記述は UE6 リポジトリ内では確認できませんでした。確実に言えるのは、現在の継承関係(UControlRig : public URigVMHost)が事実だ、という点までです。

RigVM を使っている主要システム

システム 用途
ControlRig プロシージャルリギング、IK、ボーン制御
UAF AnimBP 後継、AnimGraph 全体
UAFAnimGraph / UAFAnimNode UAF の AnimGraph 本体
UAFChooser RigUnit_EvaluateChooser で Chooser を RigVM から呼ぶ
UAFControlRig UAF と ControlRig のブリッジ

Verse / Blueprint との階層分担

ここまでを階層で並べるとこうなります。

注: Actor / Blueprint の段階的な非推奨化(Verse への移行)は、State of Unreal 2026(2026/6/17)で公式に発表 されています。ロードマップ上、Actor / BP は UE6 の Early Access〜初期リリースには残り、新フレームワークが成熟した段階で非推奨化され、Verse への移行ツールが用意される、とされています。つまり「いずれ無くす」方向は公式ですが、ue6-main 時点ではまだ BP / C++ のテンプレートが現役で、本記事もその前提で書いています。BP 廃止と Verse の現状については別記事にまとめました → BP 廃止の UE6 で、Verse の「BP 風グラフビューワ」は自作できるのか


UAFChooser と Chooser の関係

最後に、UAFChooser が UE5 からある Chooser と何が違うのかを整理しておきます(名前が紛らわしいので)。

Chooser プラグイン(Engine/Plugins/Chooser/

  • UE5 から存在する 汎用基盤
  • Description: "Use Chooser and Proxy Tables to build dynamic asset selection logic."
  • 条件に基づいてアセットを選ぶロジックを組むためのもの

Chooser 自体の機能やコンセプト(データドリブンなアセット選択、ABP のステートマシンを Chooser + 1 ノードに寄せる例など)は、おかずさん(@pafuhana1213)の解説記事がとても分かりやすいです。

UAFChooser プラグイン(Engine/Plugins/Experimental/UAF/UAFChooser/

  • Description: "Chooser integration for UAF."Chooser を UAF に統合するアダプタ
  • IsExperimentalVersion: true
  • Build.csPublicDependencyModuleNames"UAF""Chooser"両方 を宣言

統合の証拠

// UAFAnimChooser.h
#include "Chooser.h"

UCLASS()
class UUAFAnimChooserTable : public UChooserTable  // Chooser のサブクラス
{
    ...
};

UUAFAnimChooserTableUChooserTable(Chooser 側のクラス)を継承しています。さらに UAFChooser 固有の要素として、

  • UAFChooserPlayerNode — UAF AnimGraph 上で Chooser を評価するアニメノード
  • RigUnit_EvaluateChooser — Chooser を RigVM から呼ぶための Unit
  • UAFGraphFactoryAsset_Chooser — Chooser Table を UAF AnimGraph ソースとして扱う

があります。

まとめると

質問 答え
UE5 の Chooser と別機能か いいえ(基盤は同じ)
UE5 の Chooser と同じものか いいえ(UAFChooser は別プラグイン)
Chooser の UAF 拡張か YES(公式説明・継承関係から明確)

つまり UAFChooser は、汎用の Chooser を UAF(RigVM の AnimGraph)から使えるようにするための統合レイヤー、という位置づけです。


おわりに

UE6 のアニメーションは、AnimBP のように1つの Blueprint の中で完結していたものが、ゲームロジック(Verse / VerseVM)とアニメーション(UAF / RigVM)に、言語・VM レベルで分割 されました。両者の境界は modifier(skeleton) の受け渡しで、Verse は「どのアニメを使うか」を供給し、UAF が「それをどう評価・ブレンドするか」を担います。

ただ、現時点で整っているのは Verse → UAF(再生指示・ブレンド制御)の片方向だけ で、UAF → Verse の通知(AnimNotify・ステート遷移・ルートモーション)はまだ Verse からは触れません。SceneGraph のコンポーネント側には listenable イベントが揃っているので、イベント基盤そのものは機能しています。Skeletal Animation 側にその仕組みが乗ってくれば、攻撃判定や足音のタイミングを Verse 側で受けられるようになるはずで、ここは今後に期待したいところです。

土台の RigVM は ControlRig も UAF も Chooser も載る共通グラフ基盤で、UE6 のアニメーション系がここに集約されつつあるのも見えてきました。

繰り返しになりますが、本記事で触れた UAF / UAFChooser はすべて Experimental 段階のスナップショットue6-main / ef011d7aa002)です。バージョンが上がれば、特に UAF → Verse の通知まわりは状況が変わる可能性が高いので、その前提で読んでいただけるとうれしいです。

前回の FirstPerson 移植可否の記事と合わせて、UE6 の Verse / SceneGraph まわりを触る方の入り口になればうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?