많은 캐릭터 크라우드가 등장하는 애니메이션 시스템을 생성할 때, 애니메이션 공유(Animation Sharing) 플러그인 을 사용하여 프로젝트 퍼포먼스 비용을 크게 절감할 수 있습니다. 레벨에서 각 캐릭터에 대해 개별적으로 애니메이션 블루프린트 평가를 수행하는 대신 하나의 평가된 애니메이션을 많은 캐릭터 간에 공유할 수 있으므로, 100개의 캐릭터와 1,000개의 캐릭터가 등장하는 애니메이션 간에 증가하는 퍼포먼스 비용을 최소화하는 시스템을 만들 수 있습니다.
리더 포즈 컴포넌트 시스템을 활용하는 애니메이션 공유는 애니메이션 인스턴스가 평가되는 애니메이션 상태 버킷 세트를 활용합니다. 이렇게 나온 결과 포즈는 버킷에 포함된 모든 자손 컴포넌트에 전달됩니다. 그런 다음, 블렌딩 및 재생 위치 랜덤화 기법을 구현하여 크라우드를 더 다양한 애니메이션으로 재생할 수 있습니다.

다음 다이어그램은 포함된 컴포넌트를 설명하는 식별 번호를 통해 시스템 작동 방식을 개괄적으로 보여줍니다.

-
개별 크라우드 액터(AActor)
-
애니메이션 공유 구성의 일부인
UAnimationStateProcessor
인스턴스 -
애니메이션 공유 구성을 사용하여 초기화되는 런타임 매니저
-
사용자가 구성한 상태(열거형 이름)
-
스켈레탈 메시 컴포넌트의 형태를 취하는 상태의 런타임 표현
-
애니메이션을 자손 스켈레탈 메시 컴포넌트와 공유하는 데 사용되는 마스터 포즈 컴포넌트 시스템
전제조건
- Animation Sharing 플러그인을 활성화합니다. 메뉴 바(Menu Bar) 에서 편집(Edit) > 플러그인(Plugins) 으로 이동하여 애니메이션(Animation) 섹션 아래 목록에서 Animation Sharing 플러그인을 찾거나 검색창(Search Bar) 을 사용합니다. 플러그인을 활성화 하고 에디터를 재시작합니다.

-
크라우드 스켈레탈 메시 캐릭터입니다.
-
캐릭터에서 재생할 애니메이션 세트입니다.
애니메이션 공유 구성
Animation Sharing 플러그인을 설치한 다음에는 애니메이션 공유 구성(Animation Sharing Setup) 에셋을 생성합니다. 새 에셋을 생성하려면 콘텐츠 브라우저(Content Browser) 에서 + 추가(+ Add) 를 클릭하고 애니메이션(Animation) > 고급(Advanced) > 애니메이션 공유 구성(Animation Sharing Setup) 으로 이동합니다.

애니메이션 공유 구성 에셋에는 지정된 액터 전체에 공유할 모든 정보가 포함되어 있습니다.

애니메이션 공유 구성 에셋을 열고 디테일 패널에서 프로퍼티에 액세스합니다.

스켈레톤 구성
애니메이션 공유 구성 에셋의 스켈레톤 구성(Skeleton Setups) 프로퍼티를 사용하여 여러 스켈레톤을 해당하는 프로퍼티와 함께 할당하여 애니메이션 시스템을 공유할 메시를 정의할 수 있습니다. 이는 애니메이션 공유 중 애니메이션이 구동할 스켈레톤과 스켈레탈 메시가 여러 개인 경우에 유용합니다. 스켈레톤 구성 프로퍼티에서 + 추가 를 클릭하여 배열을 추가할 수 있습니다.

아래에서 에셋에 스켈레톤 구성 배열을 추가한 다음 액세스할 수 있는 프로퍼티 목록과 그 기능에 대한 설명을 참조할 수 있습니다.
프로퍼티 | 설명 |
---|---|
스켈레톤(Skeleton) | 리플리케이트할 스켈레톤 에셋입니다. 애니메이션 공유 구성은 지정된 스켈레톤에만 적용됩니다. |
스켈레탈 메시(Skeletal Mesh) | 리플리케이트할 스켈레탈 메시입니다. 포즈 디버깅에만 사용됩니다. |
블렌딩의 애니메이션 블루프린트(Animation Blueprint for Blending) | AnimSharingTransitionInstance의 자손인 애니메이션 블루프린트입니다. 상태 간 블렌딩 처리를 위해서는 이러한 블루프린트 중 하나를 생성해서 구성해야 합니다. 또한, 블렌드가 필요할 때마다 트랜지션을 처리하기 위해 이러한 블루프린트 중 하나가 생성되고 실행되어 비용이 추가됩니다. |
애디티브 애니메이션의 애니메이션 블루프린트(Animation Blueprint for Additive Animation) | 애디티브 애니메이션에 사용되는 AnimSharingAdditiveInstance의 자손인 애니메이션 블루프린트입니다. 애니메이션 공유 구성 에셋 안에서 애니메이션 상태(Animation State)를 요청 시(On Demand)로 설정하고 애디티브(Additive) 옵션도 활성화해야 합니다 |
상태 프로세서 클래스(State Processor Class) | 액터의 상태를 결정할 때 사용되는 인터페이스 클래스입니다. 애니메이션 상태를 추가하려면 이 프로퍼티를 설정해야 합니다. |
애니메이션 상태(Animation States) | 액터가 있을 수 있는 모든 상태를 포함하는 배열입니다. 각 상태는 자체 버킷입니다. |
각각의 스켈레톤 및 스켈레탈 메시 프로퍼티를 사용하여 애니메이션을 공유하려는 스켈레톤 및 스켈레탈 메시 에셋을 정의합니다.

애니메이션 상태 열거형
크라우드 캐릭터에 대한 포즈를 선택하려면 애니메이션 공유 구성 에셋에서 애니메이션 상태를 선택할 열거형 에셋 을 생성해야 합니다. 콘텐츠 브라우저 에서 + 추가 를 클릭한 다음 블루프린트(Blueprints) > 열거형(Enumeration) 을 선택하여 열거형 에셋을 생성합니다.

열거형 에셋의 이름 을 지정하고 에셋을 엽니다.

그런 다음, + 열거기 추가 (+ Add Enumerator) 버튼을 클릭하고 표시명(Display Name) 프로퍼티에 정의를 입력하여 각 크라우드 애니메이션 상태에 대한 열거형을 할당합니다. 이 워크플로에서는 Idle
및 Run
애니메이션에 대한 열거형 두 개가 생성됩니다.

애니메이션 공유 캐릭터 블루프린트
크라우드 캐릭터를 나타낼 캐릭터 블루프린트를 생성합니다. 콘텐츠 브라우저에서 + 추가 를 클릭하고 블루프린트 클래스(Blueprint Class) > 캐릭터(Character) 를 선택합니다.

크라우드 캐릭터 블루프린트의 이름 을 지정하고 블루프린트를 엽니다.

스켈레탈 메시 에셋(Skeletal Mesh Asset) 프로퍼티에서 드롭다운을 사용하여 캐릭터의 메시를 할당합니다.

캐릭터 블루프린트의 이벤트 그래프(Event Graph) 에서 변수 또는 게임플레이 상태에 따라 열거형 에셋의 상태를 설정할 로직을 빌드할 수 있습니다. 이 워크플로 예시에서 키 누르기 함수인 Keyboard Event 5 는 열거형 상태 변경에 사용됩니다.

그런 다음, Event Begin Play 노드의 로직에서 Get Animation Sharing Manager 노드를 생성합니다. 이어서 Register Actor 노드를 생성하고 Sharing Manager의 Return Value 핀을 Register Actor 노드의 Target 핀에 연결합니다. Self 레퍼런스 변수를 생성한 다음 In Actor 핀에 연결합니다. 마지막으로, 캐릭터의 스켈레톤을 공유 스켈레톤(Sharing Skeleton) 으로 설정합니다.

애니메이션 공유 상태 프로세서
AnimationSharingStateProcessor
클래스는 열거형(Enumeration) 에셋을 사용하여 재생해야 하는 애니메이션을 제어하기 위해 애니메이션 공유 구성 에셋 애니메이션 상태를 설정하는 데 사용할 수 있는 특수 블루프린트 클래스입니다.
새 AnimationSharingStateProcessor
블루프린트를 생성하려면 콘텐츠 브라우저 에서 + 추가 를 사용하여 블루프린트 클래스(Blueprint Class) 를 선택합니다.

검색창 을 사용하여 AnimationSharingStateProcessor
클래스를 찾아 선택한 다음, 선택(Select) 버튼을 클릭합니다.

블루프린트의 이름 을 지정하고 블루프린트 에디터에서 엽니다.

애니메이션 공유 상태 프로세서 블루프린트는 프로토타입 제작에만 사용해야 합니다. 블루프린트 구현이 아닌 네이티브 구현을 사용하면 런타임 퍼포먼스가 크게 향상됩니다.
블루프린트의 클래스 디폴트(Class Defaults) 패널에서 애니메이션 상태 열거형(Animation State Enum) 드롭다운 메뉴를 선택하고 열거형(Enumeration) 에셋을 선택합니다.

열거형 에셋을 추가한 다음에는 애니메이션 공유 상태 프로세서 블루프린트의 두 가지 오버라이드 함수(Override Functions) 를 사용하여 캐릭터 크라우드 전체에 걸쳐 애니메이션 선택을 참조하고 구동할 수 있습니다.

- Process Actor State 함수를 사용해서 공유 애니메이션 캐릭터의 블루프린트를 참조하고 열거형 에셋 상태를 참조할 수 있습니다.

- Get Animation State Enum 함수를 사용해서는 애니메이션 공유 상태 프로세서의 네이티브 구현과 인터페이스하여 열거형 클래스를 반환할 수 있습니다.
애니메이션 공유 상태 프로세서 블루프린트를 생성한 다음에는 애니메이션 공유 구성 에셋의 상태 프로세서 클래스(State Processor Class) 프로퍼티에 이를 할당합니다.

애니메이션 상태
애니메이션 공유 상태 프로세서 블루프린트를 애니메이션 공유 구성 에셋에 할당한 다음에는 애니메이션 상태(Animation States) 프로퍼티에서 + 추가 를 클릭한 다음 상태(State) 프로퍼티 드롭다운 메뉴에서 열거형 값을 선택해 애니메이션 상태 배열을 생성할 수 있습니다.

각 애니메이션 상태 배열에 대해, 재생할 애니메이션 시퀀스를 정의하기 위해 + 추가 를 클릭하여 애니메이션 구성(Animation Setups) 배열을 추가합니다.

아래에서 애니메이션 상태 배열 프로퍼티 목록과 그 기능에 대한 설명을 참조할 수 있습니다.
프로퍼티 | 설명 |
---|---|
상태(State) | 드롭다운 메뉴를 사용하여 애니메이션 상태 배열을 활성화할 열거형 상태를 정의합니다. 사용할 수 있는 옵션은 할당된 애니메이션 상태 프로세서(Animation State Processor) 의 애니메이션 상태 열거형 프로퍼티에 따라 상속됩니다. |
애니메이션 구성(Animation Setups) | 재생할 애니메이션 시퀀스와 적용되는 랜덤화 같은 애니메이션 상태 프로퍼티를 설정합니다. 애니메이션 상태 프로퍼티에 추가된 각 애니메이션 구성 배열에 대해 다음과 같은 프로퍼티를 사용할 수 있습니다.
|
요청 시(On Demand) | 활성화하면 이 상태는 요청 시 로 분류됩니다. 즉, 필요할 때 고유한 애니메이션을 시작할 수 있습니다. 이에 따라 요청 시 애니메이션별로 고유 인스턴스가 스핀업됩니다. 최대값에 도달하면 가장 가까운 애니메이션으로 스냅합니다. |
애디티브(Additive) | 활성화하면 상태가 애디티브 애니메이션 상태가 됩니다. 요청 시 도 활성화되어 있어야 하며 블렌딩을 처리하기 위해 애디티브 애니메이션 블루프린트가 필요합니다. |
블렌드 시간(Blend Time) | 상태 블렌딩 시 블렌딩 기간을 설정합니다. |
최대 동시 인스턴스 수(Maximum Number Of Concurrent Instances) | 상태에 대해 플랫폼별로 생성할 인스턴스 수입니다. |
커브 필요(Requires Curves) | 활성화하면 이 애니메이션 상태에서는 팔로워 컴포넌트에 대해 올바르게 작동하기 위해 커브 또는 모프 타깃이 필요합니다. |
확장성 세팅
애니메이션 공유 구성 에셋의 확장성 세팅(Scalability Setting) 프로퍼티 섹션을 사용하여 다수의 액터 전체에 걸쳐 애니메이션 공유가 작동하는 방식을 정의할 수 있습니다.

아래에서 확장성 세팅 프로퍼티 목록과 그 기능에 대한 설명을 참조할 수 있습니다.
프로퍼티 | 설명 |
---|---|
블렌드 트랜지션 사용(Use Blend Transitions) | 활성화하면 애니메이션이 한 상태에서 다른 상태로 트랜지션하기 위해 블렌드를 재생합니다. |
블렌드 중요도 값(Blend Significance Value) | 트랜지션 블렌딩 여부와 연결된 중요도 값을 설정할 수 있습니다. 값이 0이면 중요도를 전혀 고려하지 않으며, 1이면 가장 중요한 것으로 고려합니다. |
최대 동시 블렌드 수(Maximum Number Concurrent Blends) | 동시에 실행될 수 있는 블렌드 수를 설정할 수 있습니다. 이 제한을 넘어서는 각 애니메이션은 가장 가까운 애니메이션으로 스냅됩니다. |
틱 중요도 값(Tick Significance Value) | 시그니피컨스 매니저와 함께 사용될 값을 설정할 수 있습니다. 지정된 값을 넘어서는 경우 틱되지 않습니다. |
애니메이션 블루프린트 구성
현재 활성 포즈인 From Component
와 애니메이션 공유 시스템에 공급되는 포즈인 To Component
를 참조하여 애니메이션 상태 간 블렌딩을 처리할 애니메이션 블루프린트를 설정해야 합니다. 그러려면 애님 공유 트랜지션 인스턴스(Anim Sharing Transition Instance) 라고 하는 특별한 애니메이션 블루프린트 클래스가 필요합니다. 애니메이션 블루프린트를 생성하려면 콘텐츠 브라우저 로 이동하여 애니메이션 > 애니메이션 블루프린트 를 선택합니다.

캐릭터의 스켈레톤을 선택하고 AnimSharingTransitionInstance
를 애니메이션 블루프린트의 클래스로 정의한 다음, 생성(Create) 을 선택합니다.

에셋의 이름 을 지정하고 에셋을 엽니다.

공유 트랜지션 애니메이션 블루프린트의 AnimGraph에서 우클릭하고 From Component 트랜지션 변수를 검색합니다. 그런 다음, 변수를 생성하고 해당 출력을 Copy Pose From Mesh 노드에 연결합니다. Copy Pose From Mesh 노드의 출력을 생성하고 Blend Poses by bool 노드의 True Pose 입력 핀에 연결합니다.

그래프에서 우클릭하여 To Component 트랜지션 변수를 검색합니다. 그런 다음, 변수를 생성하고 해당 출력을 Copy Pose From Mesh 노드에 연결합니다. Copy Pose From Mesh 노드의 출력을 Blend Poses by bool 노드의 False Pose 입력 핀에 연결합니다.

그래프에서 우클릭하여 Blend Bool 트랜지션 변수를 검색하여 Blend Poses by Bool 노드의 Active Value 입력 핀에 연결합니다. 그런 다음, 그래프에서 우클릭하여 Blend Time 변수를 검색하고 생성하여 애니메이션 공유 구성 에셋의 블렌드 시간(Blend Time) 프로퍼티를 참조하고 True Blend Time 및 False Blend Time 핀에 연결합니다. 이어서 Blend Poses by Bool 노드의 출력을 Output Pose 노드에 연결합니다.

이제 공유 트랜지션 상태 애니메이션 블루프린트를 애니메이션 공유 구성 에셋에 추가합니다.

이제 여러 캐릭터에 걸쳐 애니메이션을 공유할 때 애니메이션 재생을 트랜지션할 수 있습니다.
애님 공유 애디티브 인스턴스
애디티브 애니메이션 사용 시, 공유된 애디티브 애니메이션을 처리할 애니메이션 블루프린트를 구성해야 합니다. 그러려면 AnimSharingAdditiveInstance
클래스라고 하는 특별한 애니메이션 블루프린트 클래스가 필요합니다.
애니메이션을 애디티브로 표시하려면 애니메이션 공유 구성 에셋에서 각 애디티브 애니메이션의 애니메이션 상태 배열에 대해 요청 시(On Demand) 및 애디티브(Additive) 프로퍼티를 활성화해야 합니다.

애디티브 애니메이션 공유 애니메이션 블루프린트를 생성하려면 콘텐츠 브라우저 로 이동하여 애니메이션 > 애니메이션 블루프린트 를 선택합니다.

캐릭터의 스켈레톤을 선택하고 AnimSharingAdditiveInstance
를 애니메이션 블루프린트의 클래스로 정의한 다음, 생성 을 선택합니다.

에셋의 이름 을 지정하고 에셋을 엽니다.

애디티브 애니메이션 블루프린트의 AnimGraph 에서 우클릭하고 Base Component 애디티브 변수를 생성합니다. Base Component 변수에서 Copy Pose From Mesh 노드를 생성하여 연결하고, 해당 출력을 Apply Space Additive 노드에 연결합니다.

AnimGraph에서 우클릭하고 Sequence Player 노드를 생성합니다. Sequence Player 노드를 선택하고 디테일(Details) 패널의 시퀀스(Sequence) 프로퍼티에서 핀으로 노출(Expose As Pin) 을 선택하여 시퀀스 프로퍼티를 그래프에 핀으로 노출합니다.

AnimGraph에서 우클릭하고 Additive Animation 애디티브 변수를 생성한 다음 Sequence Player 노드의 Sequence 핀에 연결합니다. 그런 다음 Sequence Player 노드의 출력을 Apply Mesh Space Additive 노드의 Additive 핀에 연결합니다. 마지막으로, Apply Mesh Space Additive 노드의 출력을 Output Pose 노드에 연결합니다.

이제 애디티브 애니메이션 블루프린트를 애니메이션 공유 구성 에셋에 추가할 수 있습니다.

이제 공유된 애니메이션을 애디티브 애니메이션으로 블렌딩할 수 있습니다.
애님 공유 상태 인스턴스
애님 공유 상태 인스턴스(Anim Sharing State Instance) 애니메이션 블루프린트 클래스를 사용하여 캐릭터 전반에 걸쳐 공유된 애니메이션을 실행할 수 있습니다. 애님 공유 상태 애니메이션 블루프린트를 사용하면 AnimBP 행동을 추가하여 기본적으로 다음 두 개의 프로퍼티를 노출할 수 있습니다.
-
플레이할 애니메이션(Animation to Play)
-
순열 시간 오프셋(Permutation Time Offset)
애님 공유 애니메이션 블루프린트를 생성하려면 콘텐츠 브라우저에서 + 추가를 클릭하고 애니메이션 > 애니메이션 블루프린트를 선택하여 새 애니메이션 블루프린트 에셋을 생성합니다.

스켈레톤 에셋을 선택하고, 드롭다운 메뉴에서 AnimSharingStateInstance
클래스를 선택한 다음, 생성 을 선택합니다.

애니메이션 블루프린트의 이름 을 지정하고 블루프린트를 엽니다.

AnimGraph에서 우클릭하여 Sequence Player 노드를 생성합니다. Sequence Player 노드의 디테일(Details) 패널에서 핀 타입 드롭다운 메뉴의 핀으로 노출(Expose as Pin) 을 선택하여 시퀀스(Sequence) 및 시작 위치(Start Position) 프로퍼티를 핀으로 그래프에 노출합니다. 그래프에서 우클릭하여 Animation to Play 애니메이션 공유 변수를 생성하고 Sequence Player 노드의 Sequence 핀에 연결합니다.

그래프에서 우클릭하여 Permutation Time Offset 애니메이션 공유 변수를 생성하고 Sequence Player 노드의 Start Position 핀에 연결합니다. 마지막으로, Sequence Player 노드의 출력을 Output Pose 노드에 연결합니다.

애니메이션 공유 인스턴스 그래프의 네이티브 구현은 현재 이 상태에 의해 구동되고 있는 모든 AActor(s)
를 반환하는 GetInstancedActors
를 노출합니다. 그러면 존재하는 모든 노티파이가 제대로 처리되고 고유 인스턴스로 전파됩니다.
이는 HandleNotify를 오버라이드하고 적절히 처리함으로써 달성됩니다.
애니메이션 공유 구성 에셋에서 애니메이션 재생 오프셋을 랜덤화하려는 각 애니메이션 상태의 블루프린트 프로퍼티에 애니메이션 공유 애니메이션 블루프린트를 할당합니다. 그런 다음 랜덤화된 인스턴스 수 프로퍼티의 값을 설정합니다.

애니메이션 공유 매니저
런타임 시 애니메이션 공유를 실행하려면 캐릭터 또는 레벨 블루프린트 내의 애니메이션 공유 구성 에셋을 가리키는 Animation Sharing Manager 노드를 생성해야 합니다. Animation Sharing Manager 노드를 생성한 다음에는 그래프의 드롭다운 메뉴를 사용하여 애니메이션 공유 구성 에셋을 정의합니다. 이 워크플로 예시에서는 Create Animation Sharing Manager 노드를 레벨 블루프린트에 추가합니다.

아래에서 Animation Sharing Manager 노드를 타깃으로 호출할 수 있는 추가 함수와 그 함수 기능에 대한 설명을 참조할 수 있습니다.
함수 | 설명 |
---|---|
Animation Sharing Enabled | 애니메이션 공유 활성화 여부를 반환합니다. |
Get Animation Sharing Manager | 애니메이션 공유 매니저를 반환합니다. 설정하지 않으면 null을 반환합니다. |
Register Actor | 지정된 공유 스켈레톤에 따라 애니메이션 공유 매니저에 액터를 등록합니다. |
이제 크라우드 캐릭터를 레벨에 추가하고 애니메이션 상태가 변경됨에 따라 캐릭터 애니메이션 재생을 관찰할 수 있습니다.
애니메이션 공유 디버깅
에디터에서 플레이 (Play in Editor, PIE) 시뮬레이션 중에 일부 유용한 뷰포트 디버그 렌더링을 활성화하여 Animation Sharing 플러그인 작동 방식과 애니메이션 선택 방식을 보여줄 수 있습니다.

아래에서는 언리얼 엔진에서 애니메이션 공유 시스템을 디버깅하는 데 사용할 수 있는 콘솔 명령 목록을 참조할 수 있습니다.
명령 | 설명 |
---|---|
a.Sharing.ToggleVisibility |
리더 포즈 컴포넌트(Leader Pose Components)의 비저빌리티를 토글합니다. 디버그 렌더는 레벨의 원점(0, 0, 0)에 있습니다. 캐릭터 공유 애니메이션은 활성 포즈 사용 중일 때는 녹색 으로, 블렌딩 중일 때는 파란색 으로 렌더링됩니다. 빨간색 포즈는 비활성 포즈입니다. 자홍색 선은 캐릭터가 공유하고 있는 활성 포즈를 가리킵니다. |
a.Sharing.ScalibilityPlatform |
플랫폼별 확장성 세팅을 검색할 때 어떤 플랫폼을 사용할지 제어합니다. |
a.Sharing.Enabled |
애니메이션 공유 시스템 활성화 여부를 토글합니다. 0 이면 시스템이 비활성화되고 1 이면 시스템이 활성화됩니다. |
a.Sharing.DebugStates |
디버그 렌더에 보이는 애니메이션 상태의 수를 토글합니다. 명령에 값을 추가하면 렌더링할 디버그 상태 수가 설정됩니다. |