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

Anim ブループリントのグラフで使用するために新しいノードを作成するためのガイドです。

アニメーション ノード は、アニメーション アセット での作業や、アニメーション ポーズ のブレンド、ボーン 対する操作といった処理を実行するために Anim ブループリント 内で使用されます。Unreal Engine には一連のアニメーション ノードが備わっていますが、プロジェクトのニーズに合わせてカスタム ノードを作成することもできます。

example animation blueprint nodes

プロジェクトの ソースコード編集 IDE でアニメーション ブループリントを開くには、アニメーション ブループリント エディタ でアニメーション ブループリントを開いて、エディタ ウィンドウの左上の Parent Class リンクをクリックします。

open an animation blueprint in your project's source code ide with the parent class instance

アニメーション ノードの仕組み

アニメーション ノードの主要なコンポーネントは次のとおりです。

新しいアニメーション ノードを追加するには、これらの 2 つを作成する必要があります。

ノード階層

ノードの階層を作成することは可能ですが、あらゆる非抽象的な編集時のクラスに、ランタイム ノードを 1 つだけ含める必要があります。

その親が抽象的でランタイム ノードが含まれていなかった場合を除き、派生時に追加のノードを加えないでください。

例として、UAnimGraphNode_BlendListBase ノード ファミリーを参照してください。

example blend list base animation blueprint nodes

ランタイム ノードのコンポーネント

ランタイム構造体FAnimNode_Base から派生され、一つまたは複数の入力ポーズにおける処理の初期化、更新、実行を担い、希望の出力ポーズを生成します。また、入力ポーズのリンクと、目的の処理を実行するためにノードで必要になるあらゆるプロパティを宣言します。

ポーズ入力

ランタイム ノードでは、FPoseLink または FComponentSpacePoseLink タイプのプロパティを作成することでポーズ入力が公開されます。FPoseLink は、アニメーションのブレンドなど、ローカル空間でポーズの作業を行う場合に使用され、FComponentSpacePoseLink は、スケルタル コントローラーの適用など、コンポーネント空間でポーズの作業を行う場合に使用されます。

Anim BP ノードには単一のポーズ入力を含めることができます。以下は、単一のポーズ入力を使用するアニメーション ノードの例です。

ノードの分類

画像

コード例

ローカル空間

ローカル空間 ポーズ入力のコード実装:

        UPROPERTY(Category=Links)
        FPoseLink BasePose;

Pose Input Pin

コンポーネント空間

コンポーネント空間 ポーズ入力のコード実装:

        UPROPERTY(Category=Links)
        FComponentSpacePoseLink ComponentPose;

Pose Input Pins

コンポーネント空間の ポーズ入力ピン は青色で表示されています。

Anim BP ノードには、複数のアニメーション間でブレンドされるノードのポーズ入力ピンを複数含めることもできます。

ノードの分類

画像

コード例

ブレンド モード

ベース ポーズ加算ポーズ 入力ピンのコード実装:

        UPROPERTY(Category=Links)
        FPoseLink Base;

        UPROPERTY(Category=Links)
        FPoseLink Additive;

Pose Input Pins

カスタム Anim BP ノードに実装すると、これらの各プロパティにポーズ リンク 入力ピンが表示されます。

このタイプのプロパティは常に入力ピンとして公開されます。これらを任意で非表示にしたり、[Details (詳細)] パネルで編集可能なプロパティのみとして使用したりすることはできません。

プロパティとデータ入力

ノードの処理の実行に使用される AnimBP には、任意の数のプロパティを割り当てることができます。他のプロパティと同様に、UPROPERTY マクロを使ってカスタム プロパティを宣言できます。

ノードの分類

画像

コード例

アルファ プロパティ実装

アルファ プロパティ ピンのコード実装:

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

Property Pin

特殊な メタデータ キー を使用することで、アニメーション ノードのプロパティを データ入力ピン として公開し、そのノードに値を渡せるようにできます。以下は、プロジェクトでカスタム AnimBP ノードを作成する際に使用できるメタデータ キーです。

メタデータ キー

説明

NeverAsPin

このキーは AnimGraph でプロパティをデータ ピンとして隠すもので、ノードの [Details] パネルのみで編集できます。

PinHiddenByDefault

このキーを使って、プロパティをデフォルトでピンとして隠すことができます。その後、そのプロパティをデータ ピンとして AnimGraph で公開できるようになります。AnimGraph で隠されているピンの公開については、「オプションのピン」セクションを参照してください。

PinShownByDefault

このキーでは、プロパティをデータ ピンとして AnimGraph で公開できます。

AlwaysAsPin

このキーでは、プロパティを常にデータ ポイントとして AnimGraph で公開します。

オプションのピン

隠されてはいるものの、AnimGraph で公開可能なプロパティについては、PinHiddenByDefaultPinShownByDefault などのキーを使って、当該のプロパティに移動してドロップダウン メニューから [Expose As Pin (ピンとして公開)] を切り替えることで、このプロパティをノードの [Details] パネルで公開できます。

Property Details

AnimGraph でプロパティ ピンを隠すこともできます。こうするには、目的のピンを 右クリック して [Binding (バインディング)] オプションをクリックし、ドロップダウン メニューから [Expose As Pin] を切り替えます。

Property Details

エディタ ノードのコンポーネント

エディタ クラスは UAnimGraphNode_Base から派生され、ノードのタイトルやコンテキスト メニュー オプションの追加など、ビジュアル要素の制御を担います。

この編集時クラスには、編集可能として公開されているランタイム ノードのインスタンスが含まれます。

UPROPERTY(Category=Settings)
FAnimNode_ApplyAdditive Node;

タイトル

Node Title

テキストや背景色など、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");
}

ツールヒント

Node Tooltip

カスタム アニメーション ノードを作成する際は、GetTooltip 関数をオーバーライドすることで、AnimGraph で表示可能なカスタム ツールヒントを作成できます。

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

コンテキスト メニュー

独自のカスタム アニメーション ノードを作成する際は、ノード特有のオプションをノードのコンテキスト メニューに追加できます。このオプションには、AnimGraph でそのノードを 右クリック することでアクセスできます。コンテキスト メニュー オプションは GetContextMenuActions 関数を使ってカスタム アニメーション ノードに追加します。この関数は、Unreal Engine のすべてのブループリント ノードの関数でもあります。

Node Context Menu Entry

例えば 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)

ステートで最も大きいウェイトのアセット プレイヤーを取得します。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル