게임 개발/Unreal Engine

[UE5] Lyra 분석 - AnimBP Tour

지노윈 2022. 5. 17. 21:49
반응형

ABP_Mannequin_Base

이 AnimBP의 Event Graph에 어떠한 로직도 없습니다.

로직은 게임 쓰레드에서 프로세싱 됩니다. 매틱마다, 각각의 AnimBP를 위한 Event Graph는 순차적으로 하나씩 실행되어져야 합니다. 이러한 것은 퍼포먼스 병목이 될 수 있습니다.

이 프로젝트를 위해서, 우리는 새로운 BlueprintThreadsafeUpdateAnimation 함수를 대신에 사용했습니다. BlueprintThreadsafeUpdateAnimation에서 로직은 여러 AnimBP를 동시에, Game Thread의 오버헤드 없이 병렬로 실행 할 수 있습니다.

ABP_Mannequin_Base::BlueprintThreadSafeUpdateAnimation

이 함수는 게임 데이터를 모으고 이 데이터로 애니메이션을 선택하고 처리하는 유용한 정보로 처리하는 역할을 합니다.

Threadsafe 함수의 주의 사항은 이벤트 그래프에서와 같이 게임 개체의 데이터에 직접 액세스할 수 없다는 것입니다. 

이는 다른 스레드가 동시에 실행 중일 수 있고 해당 데이터를 변경할 수 있기 때문입니다.

대신에 Property Access 시스템을 사용하여 데이터에 액세스합니다. Property Access 시스템은 데이터가 안전할 때 자동으로 데이터를 복사합니다.

 

다음은 Pawn 소유자의 위치에 액세스하는 예입니다(컨텍스트 메뉴에서 "Property Access" 검색).


 

ABP_Mannequin_Base > Anim Graph

이 Anim Graph는 애니메이션을 직접 참조하지 않습니다. 대신 그래프의 특정 지점에서 포즈를 재생하기 위해 몽타주 및 연결된 애니메이션 레이어에 대한 진입점을 제공합니다.

이 그래프의 주요 목적은 진입점을 함께 블렌드하는 것입니다(예: 상체 포즈와 하체 포즈 혼합).

이 접근 방식을 사용하면 필요할 때만 애니메이션을 로드할 수 있습니다. 예를 들어, 무기는 필요한 몽타주 및 연결된 애니메이션 레이어에 대한 참조를 보유하므로 데이터는 무기가 로드될 때만 로드됩니다.

예를 들어 B_WeaponInstance_Shotgun은 몽타주 및 연결된 애니메이션 레이어에 대한 참조를 보유합니다. 해당 데이터는 B_WeaponInstance_Shotgun이 로드될 때만 로드됩니다.

B_WeaponInstance_Base는 무기의 애니메이션 레이어를 연결하는 역할을 합니다.

 

ABP_Mannequin_Base > Anim Graph > LocomotionSM

이 State Machine은 높은 수준의 캐릭터 State들 간의 전환을 처리합니다.
각 State의 동작은 대부분 ABP_ItemAnimLayersBase의 레이어에서 처리됩니다.

 

ABP_ItemAnimLayersBase > Event Graph

AnimBP_Mannequin_Base와 마찬가지로 이 AnimBP는 BlueprintThreadSafeUpdateAnimation에서 로직을 수행합니다.

또한 이 AnimBP는 Property Access 및 GetMainAnimBPThreadSafe 함수를 사용하여 AnimBP_Mannequin_Base의 데이터에 액세스할 수 있습니다. 예는 아래에 있습니다.

 

이 AnimBP는 소총 및 권총과 같은 일반적인 무기 유형에 대한 논리를 처리하도록 작성되었습니다.

커스텀 로직이 필요한 경우(예: 활과 같은 무기의 경우) ALI_ItemAnimLayers 인터페이스를 구현하는 다른 AnimBP를 작성할 수 있습니다.

애니메이션 애셋을 직접 참조하는 대신, 이 AnimBP에는 하위 애니메이션 블루프린트로 재정의할 수 있는 변수 세트가 있습니다.

이 변수는 My Blueprint 탭의 "Anim Set - X" 카테고리에서 찾을 수 있습니다.

이를 통해 하나의 AnimBP에서 각 무기에 대한 애니메이션 콘텐츠를 참조(로드)하지 않고도 여러 무기에 대해 동일한 로직을 재사용할 수 있습니다.

각 "Anim Set" 변수에 대한 값을 제공하는 자식 애니메이션 블루프린트의 예로 ABP_RifleAnimLayers를 참고하세요.

 

ABP_ItemAnimLayersBase > FullBody_IdleState

이 AnimBP는 AnimBP_Mannequin_Base의 각 상태에 대한 레이어를 구현합니다.

레이어는 단일 애니메이션을 재생하거나 State Machine과 같은 복잡한 로직을 포함할 수 있습니다.

 

ABP_ItemAnimLayersBase > FullBody_StartState

이것은 애님 노드 함수의 사용 사례입니다.

애님 노드 함수는 애니메이션 노드에서 실행할 수 있습니다. 노드가 활성 상태일 때만 실행되므로 로직을 특정 노드 또는 상태로 로컬라이즈 로직을 허용합니다.

이 경우 애님 노드 함수는 노드가 관련이 있을 때 재생할 애니메이션을 선택합니다. 또 다른 Anim Node Function은 애니메이션의 재생 속도를 관리합니다.

 

ABP_ItemAnimLayersBase > Update Start Anim

이것은 Distance Matching을 사용하여 시작 애니메이션이 이동한 거리가 폰 소유자가 이동한 거리와 일치하도록 하는 예입니다.

이렇게 하면 애니메이션과 모션 모델을 동기화하여 발이 미끄러지는 것을 방지할 수 있습니다.

이것은 시작 애니메이션의 재생 속도를 효과적으로 제어합니다. 애니메이션이 너무 느리거나 너무 빠르게 재생되지 않도록 유효 재생 속도를 고정합니다.

유효 재생 속도가 고정되어 있으면 여전히 약간의 미끄러짐이 나타납니다. 

이 문제를 해결하기 위해 나중에 Stride Warping을 사용하여 나머지 차이를 수정하기 위해 포즈를 조정합니다.

Distance Matching 함수를 사용하려면 애니메이션 Animation Locomotion Library plugin이 필요합니다.