애니메이션 노드 테크니컬 가이드

애님 블루프린트의 그래프 안에서 사용할 노드를 새로 만드는 방법에 대한 가이드입니다.

Choose your operating system:

Windows

macOS

Linux

애니메이션 노드애님 블루프린트 내부에서 사용되어 작업을 수행합니다. 예를 들면 애니메이션 에셋 작업을 하고 , 애니메이션 포즈를 블렌딩하고, 스켈레탈 메시의 을 조작합니다. 애니메이션 노드 모음은 언리얼 엔진 에 포함되어 있지만 프로젝트에 맞게 커스텀 노드를 만들 수도 있습니다.

example animation blueprint nodes

프로젝트의 소스 코드 편집 IDE 에서 애니메이션 블루프린트를 열려면 AnimBP 에디터에서 AnimBP를 열고 에디터 창 왼쪽 상단에 있는 부모 클래스(Parent Class) 링크를 클릭하면 됩니다.

애니메이션 노드의 구조

애니메이션 노드는 두 부분으로 이루어집니다.

새로운 애니매이션 노드를 추가하기 위해서는, 두 가지 다 만들어야 합니다.

노드 계층구조

노드에 계층구조를 만드는 것이 가능은 하지만, 비추상(non-abstract) 에디터 시간 클래스의 경우 반드시 딱 하나의 런타임 노드가 있어야 합니다.

부모가 추상이면서 한 개도 포함하지 않는 경우를 제외하고는 파생 시 추가 노드를 추가하지 마세요.

예제로는 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 노드는 여러 애니메이션 블렌딩을 하는 노드에 대해 둘 이상의 포즈 입력을 가질 수도 있습니다.

노드 분류

이미지

코드 예제

블렌딩 노드

베이스 포즈애디티브 포즈 입력 핀 코드 구현implementation:

        UPROPERTY(Category=Links)
        FPoseLink Base;

        UPROPERTY(Category=Links)
        FPoseLink Additive;

Pose Input Pins

커스텀 AnimBP 노드에 구현되면 각 프로퍼티에 포즈 링크 입력 핀이 표시됩니다.

이런 유형의 프로퍼티는 항상 입력 핀으로 노출됩니다. 선택적으로 숨기거나, 디테일 패널에서 편집 가능한 프로퍼티로만 사용할 수는 없습니다.

프로퍼티와 데이터 입력

노드의 작업을 수행하는 데 사용되는 프로퍼티를 원하는 만큼 AnimBP에 할당할 수 있습니다. 다른 프로퍼티와 마찬가지로 UPROPERTY 매크로를 사용하여 커스텀 프로퍼티를 선언할 수 있습니다.

노드 분류

이미지

코드 예제

알파 프로퍼티 구현

알파 프로퍼티 핀 코드 구현:

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

Property Pin

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

Property Pin

애니메이션 노드의 프로퍼티는 노드에 값을 전달하기 위해 특수한 메타데이터 키 를 사용하여 데이터 입력 핀 에 노출시킬 수 있는데, 이를 통해 노드에 사용되는 프로퍼티에 노드 밖에서 계산된 값을 사용할 수 있습니다. 가능한 메타데이터 키는 다음과 같습니다.

메타데이터

설명

NeverAsPin

이 키는 AnimGraph에서 데이터 핀에 프로퍼티를 숨기며, 노드의 디테일 패널에서만 편집 가능합니다.

PinHiddenByDefault

이 키를 사용하면 기본적으로 핀에 프로퍼티를 숨길 수 있습니다. 그러면 프로퍼티는 AnimGraph에서 데이터 핀으로 노출할 수 있습니다. AnimGraph에서 숨겨진 핀을 노출하는 방법에 대한 자세한 내용은 옵션 핀 섹션을 참조하세요.

PinShownByDefault

이 키를 사용하면 기본적으로 AnimGraph에 프로퍼티를 데이터 핀으로 노출할 수 있습니다.

AlwaysAsPin

이 키는 항상 AnimGraph에 프로퍼티를 데이터 핀으로 노출됩니다.

옵션 핀

AnimGraph에서 숨겨져 있지만 노출 가능한 프로퍼티의 경우 PinHiddenByDefault 또는 PinShownByDefault 를 사용하여 프로퍼티를 찾아 드롭다운 메뉴에서 핀으로 노출(Expose As Pin) 을 토글하면 노드의 디테일 패널에 프로퍼티를 노출할 수 있습니다.

Property Details

그리고 숨기고 싶은 핀을 우클릭 하고 바인딩 옵션 을 찾아 드롭다운 메뉴에서 핀으로 노출** 을 토글하면 AnimGraph에서 프로퍼티 핀을 숨길 수도 있습니다.

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 를 사용하여 커스텀 애니메이션 노드에 컨텍스트 메뉴 옵션을 추가할 수 있습니다.

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

파생된 네이티브 Getter

별도의 UAnimInstance 파생 클래스를 만들어 퍼포먼스를 높일 수 있습니다. 개선된 퍼포먼스에 필요하다면 새로운 getter를 추가할 수 있습니다. 새로운 getter는 아래 단계에 따라 구성할 수 있습니다.

  • getter 함수는 반드시 UFUNCTIONS 태그를 붙여야 합니다.

  • 반드시 BlueprintPure 여야 합니다.

  • 반드시 AnimGetter="True" 메타데이터를 포함해야 합니다.

또한 구체적인 이름이 있는 파라미터도 정의해야 합니다. 이 부분은 AnimInstance.h 의 베이스 애님 getter 함수에도 설명되어 있습니다. 파라미터 목록은 다음과 같습니다.

파라미터

설명

int32 AssetPlayerIndex

에셋 플레이어에 작용하는 getter로, 가능한 에셋 플레이어마다 에디터에 하나의 항목이 추가됩니다.

int32 MachineIndex

스테이트 머신에 작용하는 getter로, 스테이트 머신마다 하나의 항목이 추가됩니다.

int32 StateIndex

MachineIndex가 필요합니다. 스테이트에 작용하는 getter로, 스테이트마다 하나의 항목이 추가됩니다.

int32 TransitionIndex

MachineIndex가 필요합니다. 트랜지션에 작용하는 getter로, 트랜지션마다 하나의 항목이 추가됩니다.

getter에서 실제 노드를 구하는 헬퍼 함수도 있는데, UAnimInstance 에 존재합니다.

함수

설명

GetStateMachineInstance(int32 MachineIndex)

구운 스테이트 머신 인스턴스를 구합니다.

GetCheckedNodeFromIndex(int32 NodeIdx)

인덱스에서 노드를 구하며, 유효하지 않은 경우 어서트가 납니다.

GetNodeFromIndex(int32 NodeIdx)

위와 마찬가지로, nullptr 반환이 가능합니다.

GetRelevantAssetPlayerFromState(int32 MachineIndex, int32 StateIndex)

스테이트에서 가중치가 가장 높은 에셋 플레이어를 구합니다.