アニメーションノードは、ポーズのブレンディングやボーンの直接操作などを行うために、 アニメーション ブループリント 内で使用します。複数のアニメーション ノードがありますが、 ゲームの必要性に応じたカスタムノードを作成できます。
アニメーション ノードの仕組み
アニメーションノードは以下の 2 つの要素から構成されています。
- 出力ポーズを生成するために実際の演算を実行するランタイム構造体
- ノードタイトルやコンテキスト メニューなど、グラフ内のノードの 視覚的側面と機能を処理する editor-time のコンテナ クラス
アニメーション ノードを新規で追加するには、この両方を作成しなければいけません。
ノードの階層
ノードの階層を作成することは可能ですが、非抽象的な editor-time クラスには、
1 つだけランタイム ノードを格納しなければいけません (親が抽象クラスでノードが一つも格納されていない場合を除き、派生時にノードを追加しないでください)。
例えば、 UAnimGraphNode_BlendListBase
ファミリーをご覧ください。
ランタイムノード
ランタイム構造体は FAnimNode_Base
から派生し、必要な出力ポーズを生成するために
初期化、更新、一つ以上の入力ポーズの操作を行います。必要な演算を実行するためにノードが必要とする
入力ポーズのリンクやプロパティも宣言します。
ポーズの入力
ランタイム ノードでは、ポーズ入力はタイプ FPoseLink
、または FComponentSpacePoseLink
のプロパティの作成によってエクスポーズされます。
FPoseLink
は、ローカル空間でポーズの作業、例えばアニメーションのブレンディングなどに使用されます。
FComponentSpacePoseLink
は、コンポーネント空間でポーズの作業、例えばスケルタル コントローラーの適用に
使用されます。
ノードは単一ポーズ入力を持つことができます。
Local Space
UPROPERTY(Category=Links)
FPoseLink BasePose;

Component Space
UPROPERTY(Category=Links)
FComponentSpacePoseLink ComponentPose;

コンポーネント空間ポーズのピンは青い陰影がかかっています。
または、ノードに対し一つ以上の入力が複数のアニメーションでブレンドされます。
UPROPERTY(Category=Links)
FPoseLink Base;
UPROPERTY(Category=Links)
FPoseLink Additive;

こうした各プロパティによってポーズのリンクが表示されます。このタイプのプロパティは常に入力ピンとして 公開されます。任意で非表示にしたり、[Details (詳細)] パネルで、 編集可能なプロパティとしてのみ使用することはできません。
プロパティとデータ入力
アニメーション ノードは、ノード操作の実行に使用するためのアルファ値や変換データなど、
いくつでもプロパティを持つことができます。こうしたプロパティは他のプロパティと同様に、
UPROPERTY()
マクロを使用して宣言されます。
UPROPERTY(Category=Settings, meta(PinShownByDefault))
mutable float Alpha;

ノードへ値を渡すために、特別なメタデータ キーを使用して データ入力としてアニメーション ノードのプロパティをエクスポーズすることができます。これにより、ノードが使用するプロパティは、ノード外で計算された値を使用することができます。 以下のメタデータキーを利用できます。
メタデータ | 説明 |
---|---|
NeverAsPin |
プロパティはデータピンとしてエクスポーズされず、ペルソナの [Details (詳細)] パネルのみで編集が可能です。 |
PinHiddenByDefault |
プロパティはデータピンとしてエクスポーズすることができますが、デフォルトでは非表示になっています (下記の オプション ピン 参照)。 |
PinShownByDefault |
プロパティはデータピンとしてエクスポーズすることが可能で、デフォルトで可視化されています (下記の オプション ピン 参照)。 |
AlwaysAsPin |
プロパティは常にデータピンとしてエクスポーズされます。 |
(#OptionalPins) Optional Pins
Editor Node
Editor クラスは UAnimGraphNode_Base
から派生し、ビジュアルノードのタイトルや、
コンテキスト メニュー アクションの追加を行います。
editor-time クラスには、編集可能としてエクスポーズされたランタイム ノードを格納するようにします。
UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;
Title

ペルソナで Animation ブループリントのグラフに表示される背景色とアニメーション ノードのタイトルテキストは、
GetNodeTitle()
関数と GetNodeTitleColor()
関数をオーバーライドして定義します。
例えば、UAnimGraphNode_ApplyAdditive
ノードはグレーの背景色を使用し、 "Apply Additive" を表示します。
FLinearColor UAnimGraphNode_ApplyAdditive::GetNodeTitleColor() const
{
return FLinearColor(0.75f, 0.75f, 0.75f);
}
FString UAnimGraphNode_ApplyAdditive::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return TEXT("Apply Additive");
}
ツールチップ

ペルソナでノード上にカーソルを重ねると表示されるツールヒントは、GetTooltip
関数をオーバーライドして定義します。
FString UAnimGraphNode_ApplyAdditive::GetTooltip const
{
return TEXT("Apply additive animation to normal pose");
}
コンテキストメニュー
各アニメーション ノードは、ペルソナのグラフでノードを 右クリック すると表示されるコンテキストメニューへ、
ノード固有オプションを追加することができます。オプションは、全てのブループリント ノードのメンバーである
GetContextMenuActions
関数を使用して追加します。

例えば、UAnimGraphNode_LayeredBoneBlend
ノードは、新規入力の追加または既存入力の削除をするためのメニュー エントリを追加します。
void UAnimGraphNode_LayeredBoneBlend::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const
{
if (!Context.bIsDebugging)
{
if (Context.Pin != NULL)
{
// we only do this for normal BlendList/BlendList by enum, BlendList by Bool doesn't support add/remove pins
if (Context.Pin->Direction == EGPD_Input)
{
//@TODO:Only offer this option on arrayed pins
Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend"));
{
Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().RemoveBlendListPin);
}
Context.MenuBuilder->EndSection();
}
}
else
{
Context.MenuBuilder->BeginSection("AnimNodesLayeredBoneBlend", NSLOCTEXT("A3Nodes", "LayeredBoneBlend", "Layered Bone Blend"));
{
Context.MenuBuilder->AddMenuEntry(FGraphEditorCommands::Get().AddBlendListPin);
}
Context.MenuBuilder->EndSection();
}
}
}
派生ネイティブ ゲッター
多くのプロジェクトでは独自の UAnimInstance
派生クラスを作成し、パフォーマンスを高めます。これに合わせて、必要に応じて新しいゲッターを追加することができます。ただし、そのためには適切に動作するように若干のセットアップが必要になります。
- ゲッター関数には UFUNCTIONS とタグ付けします。
- これらは BlueprintPure でなければなりません。
- これらはメタデータ、 AnimGetter="True" を含まなければなりません。
いくつかの名前が付けられたパラメータも定義しなければなりません (これは上記の AnimInstance.h
の基本の anim getter 関数でも説明されています)。パラメータのリストは以下のようになります。
パラメータ | 説明 |
---|---|
int32 AssetPlayerIndex | このゲッターはアセット プレイヤーに作用し、利用可能なアセット プレイヤー毎にエントリがエディタに追加されます。 |
int32 MachineIndex | このゲッターはステートマシンに作用し、ステートマシン毎にエントリが追加されます。 |
int32 StateIndex | これには MachineIndex も必要です。ゲッターはステートに作用し、ステート毎にエントリが追加されます。 |
int32 TransitionIndex | これには MachineIndex も必要です。ゲッターは遷移に作用し、遷移毎にエントリが追加されます。 |
ゲッターで実際のノードを get するヘルパー関数もあります。これは、UAnimInstance
にあります。
関数 | 説明 |
---|---|
GetStateMachineInstance(int32 MachineIndex) | ベイクしたステートマシンのインスタンスを get します。 |
GetCheckedNodeFromIndex(int32 NodeIdx) | インデックスからノードを get します。無効ならアサートします。 |
GetNodeFromIndex(int32 NodeIdx) | 上記のように、nullptr を戻すことがあります。 |
GetRelevantAssetPlayerFromState(int32 MachineIndex, int32 StateIndex) | ステート内で一番ウェイトが高いアセット プレイヤーを get します。 |