アニメーション ノード は、アニメーション アセット での作業や、アニメーション ポーズ のブレンド、ボーン 対する操作といった処理を実行するために Anim ブループリント 内で使用されます。Unreal Engine には一連のアニメーション ノードが備わっていますが、プロジェクトのニーズに合わせてカスタム ノードを作成することもできます。
プロジェクトの ソースコード編集 IDE でアニメーション ブループリントを開くには、アニメーション ブループリント エディタ でアニメーション ブループリントを開いて、エディタ ウィンドウの左上の Parent Class リンクをクリックします。
アニメーション ノードの仕組み
アニメーション ノードの主要なコンポーネントは次のとおりです。
出力ポーズを生成する実際の操作を実行する ランタイム構造体。
ノードのタイトルやコンテキスト メニューなど、グラフ内のノードの視覚的な側面と機能を処理する エディタ時コンテナ クラス。
新しいアニメーション ノードを追加するには、これらの 2 つを作成する必要があります。
ノード階層
ノードの階層を作成することは可能ですが、あらゆる非抽象的な編集時のクラスに、ランタイム ノードを 1 つだけ含める必要があります。
その親が抽象的でランタイム ノードが含まれていなかった場合を除き、派生時に追加のノードを加えないでください。
例として、UAnimGraphNode_BlendListBase
ノード ファミリーを参照してください。
ランタイム ノードのコンポーネント
ランタイム構造体 は FAnimNode_Base
から派生され、一つまたは複数の入力ポーズにおける処理の初期化、更新、実行を担い、希望の出力ポーズを生成します。また、入力ポーズのリンクと、目的の処理を実行するためにノードで必要になるあらゆるプロパティを宣言します。
ポーズ入力
ランタイム ノードでは、FPoseLink
または FComponentSpacePoseLink
タイプのプロパティを作成することでポーズ入力が公開されます。FPoseLink
は、アニメーションのブレンドなど、ローカル空間でポーズの作業を行う場合に使用され、FComponentSpacePoseLink
は、スケルタル コントローラーの適用など、コンポーネント空間でポーズの作業を行う場合に使用されます。
Anim BP ノードには単一のポーズ入力を含めることができます。以下は、単一のポーズ入力を使用するアニメーション ノードの例です。
ノードの分類 |
画像 |
コード例 |
---|---|---|
ローカル空間 |
ローカル空間 ポーズ入力のコード実装:
|
|
コンポーネント空間 |
コンポーネント空間 ポーズ入力のコード実装:
|
コンポーネント空間の ポーズ入力ピン は青色で表示されています。 |
Anim BP ノードには、複数のアニメーション間でブレンドされるノードのポーズ入力ピンを複数含めることもできます。
ノードの分類 |
画像 |
コード例 |
---|---|---|
ブレンド モード |
ベース ポーズ と 加算ポーズ 入力ピンのコード実装:
|
|
カスタム Anim BP ノードに実装すると、これらの各プロパティにポーズ リンク 入力ピンが表示されます。
このタイプのプロパティは常に入力ピンとして公開されます。これらを任意で非表示にしたり、[Details (詳細)] パネルで編集可能なプロパティのみとして使用したりすることはできません。
プロパティとデータ入力
ノードの処理の実行に使用される AnimBP には、任意の数のプロパティを割り当てることができます。他のプロパティと同様に、UPROPERTY
マクロを使ってカスタム プロパティを宣言できます。
ノードの分類 |
画像 |
コード例 |
---|---|---|
アルファ プロパティ実装 |
アルファ プロパティ ピンのコード実装:
|
|
特殊な メタデータ キー を使用することで、アニメーション ノードのプロパティを データ入力ピン として公開し、そのノードに値を渡せるようにできます。以下は、プロジェクトでカスタム AnimBP ノードを作成する際に使用できるメタデータ キーです。
メタデータ キー |
説明 |
---|---|
|
このキーは AnimGraph でプロパティをデータ ピンとして隠すもので、ノードの [Details] パネルのみで編集できます。 |
|
このキーを使って、プロパティをデフォルトでピンとして隠すことができます。その後、そのプロパティをデータ ピンとして AnimGraph で公開できるようになります。AnimGraph で隠されているピンの公開については、「オプションのピン」セクションを参照してください。 |
|
このキーでは、プロパティをデータ ピンとして AnimGraph で公開できます。 |
|
このキーでは、プロパティを常にデータ ポイントとして AnimGraph で公開します。 |
オプションのピン
隠されてはいるものの、AnimGraph で公開可能なプロパティについては、PinHiddenByDefault
や PinShownByDefault
などのキーを使って、当該のプロパティに移動してドロップダウン メニューから [Expose As Pin (ピンとして公開)] を切り替えることで、このプロパティをノードの [Details] パネルで公開できます。
AnimGraph でプロパティ ピンを隠すこともできます。こうするには、目的のピンを 右クリック して [Binding (バインディング)] オプションをクリックし、ドロップダウン メニューから [Expose As Pin] を切り替えます。
エディタ ノードのコンポーネント
エディタ クラスは UAnimGraphNode_Base
から派生され、ノードのタイトルやコンテキスト メニュー オプションの追加など、ビジュアル要素の制御を担います。
この編集時クラスには、編集可能として公開されているランタイム ノードのインスタンスが含まれます。
UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;
タイトル
テキストや背景色など、AnimGraph に含まれるアニメーション ノードのタイトル要素の表示を、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
関数をオーバーライドすることで、AnimGraph で表示可能なカスタム ツールヒントを作成できます。
FString UAnimGraphNode_ApplyAdditive::GetTooltip const
{
return TEXT("Apply additive animation to normal pose");
}
コンテキスト メニュー
独自のカスタム アニメーション ノードを作成する際は、ノード特有のオプションをノードのコンテキスト メニューに追加できます。このオプションには、AnimGraph でそのノードを 右クリック することでアクセスできます。コンテキスト メニュー オプションは GetContextMenuActions
関数を使ってカスタム アニメーション ノードに追加します。この関数は、Unreal Engine のすべてのブループリント ノードの関数でもあります。
例えば UAnimGraphNode_LayeredBoneBlend
ノードでは、Add Blend Pin または Remove Blend Pin を加えるためのコンテキスト メニュー オプションを追加します。
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
」にあるベース アニメーション ゲッター関数の上でも説明されています)。それらのパラメータには次が含まれます。
パラメータ |
説明 |
---|---|
int32 AssetPlayerIndex |
ゲッターはアセット プレイヤーに作用し、エントリは利用可能なアセット プレイヤーごとにエディタに追加されます。 |
int32 MachineIndex |
ゲッターはステート マシンに作用し、エントリはステート マシンごとに追加されます。 |
int32 StateIndex |
これには MachineIndex も必要です。ゲッターはステートに作用し、エントリはステートごとに追加されます。 |
int32 TransitionIndex |
これには MachineIndex も必要です。ゲッターは遷移に作用し、エントリは遷移ごとに追加されます。 |
ヘルパー関数を使って、ゲッターで実際のノードを取得することも可能です。ヘルパー関数は UAnimInstance
にあります。
関数 |
説明 |
---|---|
GetStateMachineInstance(int32 MachineIndex) |
ベイク済みのステート マシン インスタンスを取得します。 |
GetCheckedNodeFromIndex(int32 NodeIdx) |
ノードをインデックスから取得し、無効な場合は有効にします。 |
GetNodeFromIndex(int32 NodeIdx) |
上記と同様で、nullptr を返す場合があります。 |
GetRelevantAssetPlayerFromState(int32 MachineIndex, int32 StateIndex) |
ステートで最も大きいウェイトのアセット プレイヤーを取得します。 |