Language:
Page Info
Engine Version:
The translation of this page is out of date. Please see the English version for the latest version of the page.

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

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

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

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

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

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

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

ノードの階層

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

ランタイムノード

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

ポーズ入力

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

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

ローカル空間

UPROPERTY(Category=Links)
FPoseLink BasePose;

Pose Input Pin

コンポーネント空間

UPROPERTY(Category=Links)
FComponentSpacePoseLink ComponentPose;

Pose Input Pins

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

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

UPROPERTY(Category=Links)
FPoseLink Base;

UPROPERTY(Category=Links)
FPoseLink Additive;

Pose Input Pins

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

プロパティとデータ入力

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

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

Property Pin

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

メタデータ

説明

NeverAsPin

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

PinHiddenByDefault

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

PinShownByDefault

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

AlwaysAsPin

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

オプション ピン

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

Property Details

エディタノード

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

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

UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;

タイトル

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)
        {
            // これは通常の BlendList / 列挙型変数による BlendList でのみ行います。ブールによる BlendList ではピンの追加 / 削除に対応していません。
            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();
        }
    }
}