Language:
Page Info
Engine Version:

アニメーション ノードのテクニカル ガイド

アニメーションノードは、ポーズのブレンディングやボーンの直接操作などを行うために、 Anim ブループリント 内で使用します。複数のアニメーション ノードがありますが、 ゲームの必要性に応じたカスタムノードを作成できます。

アニメーション ノードの分析

アニメーションノードは以下の 2 つの要素から構成されています。

  • 出力ポーズを生成するために実際の演算を実行するランタイム構造体

  • ノードタイトルやコンテキスト メニューなど、グラフ内のノードの 視覚的側面と機能を処理する editor-time のコンテナ クラス

アニメーション ノードを新規で追加するには、この両方を作成しなければいけません。

ノードの階層

ノードの階層を作成することは可能ですが、非抽象的な editor-time クラスには、 1 つだけランタイム ノードを格納しなければいけません (親が抽象クラスでノードが一つも格納されていない場合を除き、派生時にノードを追加しないでください)。
例えば、 UAnimGraphNode_BlendListBase ファミリーをご覧ください。

ランタイムノード

ランタイム構造体は FAnimNode_Base から派生し、必要な出力ポーズを生成するために 初期化、更新、一つ以上の入力ポーズの操作を行います。必要な演算を実行するためにノードが必要とする 入力ポーズのリンクやプロパティも宣言します。

ポーズの入力

ランタイム ノードでは、ポーズ入力はタイプ FPoseLink、または FComponentSpacePoseLink のプロパティの作成によってエクスポーズされます。 FPoseLink は、ローカル空間でポーズの作業、例えばアニメーションのブレンディングなどに使用されます。 FComponentSpacePoseLink は、コンポーネント空間でポーズの作業、例えばスケルタル コントローラーの適用に 使用されます。

ノードは単一ポーズ入力を持つことができます。

Local Space

UPROPERTY(Category=Links)
FPoseLink BasePose;

Pose Input Pin

Component Space

UPROPERTY(Category=Links)
FComponentSpacePoseLink ComponentPose;

Pose Input Pins

コンポーネント空間ポーズのピンは青い陰影がかかっています。

または、ノードに対し一つ以上の入力が複数のアニメーションでブレンドされます。

UPROPERTY(Category=Links)
FPoseLink BasePose;

UPROPERTY(Category=Links)
FPoseLink Additive;

Pose Input Pins

こうした各プロパティによってポーズのリンクが表示されます。このタイプのプロパティは常に入力ピンとして 公開されます。任意で非表示にしたり、[詳細] パネルで、 編集可能なプロパティとしてのみ使用することはできません。

プロパティとデータ入力

アニメーション ノードは、ノード操作の実行に使用するためのアルファ値や変換データなど、 いくつでもプロパティを持つことができます。こうしたプロパティは UPROPERTY() マクロを使用して、 他のプロパティと同様に宣言されます。

UPROPERTY(Category=Settings, meta(PinShownByDefault))
mutable float Alpha;

Property Pin

ノードへ値を渡すために、特別なメタデータ キーを使用して データ入力としてアニメーション ノードのプロパティをエクスポーズすることができます。これにより、ノードが使用するプロパティは、ノード外で計算された値を使用することができます。 以下のメタデータキーを利用できます。

メタデータ

説明

NeverAsPin

プロパティはデータピンとしてエクスポーズされず、ペルソナの [詳細] パネルのみで編集が可能です。

PinHiddenByDefault

プロパティはデータピンとしてエクスポーズすることができますが、デフォルトでは非表示になっています (下記の オプション ピン 参照)。

PinShownByDefault

プロパティはデータピンとしてエクスポーズすることが可能で、デフォルトで可視化されています (下記の オプションピン 参照)。

AlwaysAsPin

プロパティは常にデータピンとしてエクスポーズされます。

Optional Pins

PinHiddenByDefault または PinShownByDefault を持つプロパティでは [詳細] パネルのプロパティの横にチェックボックスが表示され、 表示/非表示を選択することができます。

Property Details

Editor Node

Editor クラスは UAnimGraphNode_Base から派生し、ビジュアルノードのタイトルや、 コンテキスト メニュー アクションの追加を行います。

editor-time クラスには、編集可能としてエクスポーズされたランタイム ノードを格納するようにします。

UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;

Title

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");
}

ツールチップ

Node Tooltip

ペルソナでノード上にカーソルを重ねると表示されるツールヒントは、GetTooltip() 関数をオーバーライドして定義します。

FString UAnimGraphNode_ApplyAdditive::GetTooltip() const
{
    return TEXT("Apply additive animation to normal pose");
}

コンテキストメニュー

各アニメーション ノードは、ペルソナのグラフでノードを 右クリック すると表示されるコンテキストメニューへ、 ノード固有オプションを追加することができます。オプションは、全てのブループリント ノードのメンバーである GetContextMenuActions() 関数を使用して追加します。

Node Context Menu Entry

例えば、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 します。