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

프로젝트의 소스 코드 편집 IDE 에서 애니메이션 블루프린트를 열려면 AnimBP 에디터에서 AnimBP를 열고 에디터 창 왼쪽 상단에 있는 부모 클래스(Parent Class) 링크를 클릭하면 됩니다.
애니메이션 노드의 구조
애니메이션 노드는 두 부분으로 이루어집니다.
- 출력 포즈 생성을 위한 실제 작업을 하는 런타임 구조체
- 노드 제목이나 컨텍스트 메뉴처럼, 그래프 안에서 노드의 시각적인 면과 함수성을 처리하는 에디터 시간 컨테이너 클래스
새로운 애니매이션 노드를 추가하기 위해서는, 두 가지 다 만들어야 합니다.
노드 계층구조
노드에 계층구조를 만드는 것이 가능은 하지만, 비추상(non-abstract) 에디터 시간 클래스의 경우 반드시 딱 하나의 런타임 노드가 있어야 합니다.
부모가 추상이면서 한 개도 포함하지 않는 경우를 제외하고는 파생 시 추가 노드를 추가하지 마세요.
예제로는 UAnimGraphNode_BlendListBase
노드 패밀리를 참고하세요.

런타임 노드 컴포넌트
런타임 구조체 는 FAnimNode_Base
에서 파생되며, 초기화와 업데이트는 물론
하나 이상의 입력 포즈에서 원하는 출력 포즈를 생성하기 위한 작업을 담당합니다.
또한 노드가 원하는 작업을 하는 데 있어 필요한 입력 포즈 링크라든가 프로퍼티가 있으면 선언해 주기도 합니다.
포즈 입력
런타임 노드에서, 포즈 입력의 노출은 FPoseLink
또는 FComponentSpacePoseLink
유형의 프로퍼티를 만들면 됩니다. FPoseLink
는 애니메이션 블렌딩처럼 로컬 스페이스에서의 포즈 작업시 사용됩니다. FComponentSpacePoseLink
는 스켈레탈 컨트롤러 적용시처럼 컴포넌트 스페이스에서의 작업시 사용됩니다.
Anim BP 노드는 단일 포즈 입력만 가능합니다. 다음은 단일 포즈 입력을 사용하는 애니메이션 노드 예제입니다.
노드 분류 | 이미지 | 코드 예제 |
---|---|---|
로컬 스페이스 | 로컬 스페이스 포즈 입력 코드 구현:
|
![]() |
컴포넌트 스페이스 | 컴포넌트 스페이스 포즈 입력 코드 구현:
|
![]() 컴포넌트 스페이스 포즈 입력 핀 은 파랑색입니다. |
Anim BP 노드는 여러 애니메이션 블렌딩을 하는 노드에 대해 둘 이상의 포즈 입력을 가질 수도 있습니다.
노드 분류 | 이미지 | 코드 예제 |
---|---|---|
블렌딩 노드 | 베이스 포즈 및 애디티브 포즈 입력 핀 코드 구현implementation:
|
![]() |
커스텀 AnimBP 노드에 구현되면 각 프로퍼티에 포즈 링크 입력 핀이 표시됩니다.
이런 유형의 프로퍼티는 항상 입력 핀으로 노출됩니다. 선택적으로 숨기거나, 디테일 패널에서 편집 가능한 프로퍼티로만 사용할 수는 없습니다.
프로퍼티와 데이터 입력
노드의 작업을 수행하는 데 사용되는 프로퍼티를 원하는 만큼 AnimBP에 할당할 수 있습니다. 다른 프로퍼티와 마찬가지로 UPROPERTY
매크로를 사용하여 커스텀 프로퍼티를 선언할 수 있습니다.
노드 분류 | 이미지 | 코드 예제 |
---|---|---|
알파 프로퍼티 구현 | 알파 프로퍼티 핀 코드 구현:
|
![]() |
UPROPERTY(Category=Settings, meta(PinShownByDefault))
mutable float Alpha;

애니메이션 노드의 프로퍼티는 노드에 값을 전달하기 위해 특수한 메타데이터 키 를 사용하여 데이터 입력 핀 에 노출시킬 수 있는데, 이를 통해 노드에 사용되는 프로퍼티에 노드 밖에서 계산된 값을 사용할 수 있습니다. 가능한 메타데이터 키는 다음과 같습니다.
메타데이터 | 설명 |
---|---|
NeverAsPin |
이 키는 AnimGraph에서 데이터 핀에 프로퍼티를 숨기며, 노드의 디테일 패널에서만 편집 가능합니다. |
PinHiddenByDefault |
이 키를 사용하면 기본적으로 핀에 프로퍼티를 숨길 수 있습니다. 그러면 프로퍼티는 AnimGraph에서 데이터 핀으로 노출할 수 있습니다. AnimGraph에서 숨겨진 핀을 노출하는 방법에 대한 자세한 내용은 옵션 핀 섹션을 참조하세요. |
PinShownByDefault |
이 키를 사용하면 기본적으로 AnimGraph에 프로퍼티를 데이터 핀으로 노출할 수 있습니다. |
AlwaysAsPin |
이 키는 항상 AnimGraph에 프로퍼티를 데이터 핀으로 노출됩니다. |
옵션 핀
AnimGraph에서 숨겨져 있지만 노출 가능한 프로퍼티의 경우 PinHiddenByDefault
또는 PinShownByDefault
를 사용하여 프로퍼티를 찾아 드롭다운 메뉴에서 핀으로 노출(Expose As Pin) 을 토글하면 노드의 디테일 패널에 프로퍼티를 노출할 수 있습니다.

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

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

예를 들어 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) | 스테이트에서 가중치가 가장 높은 에셋 플레이어를 구합니다. |