라이라의 애니메이션

라이라의 애니메이션 시스템에 관한 개요입니다

라이라(Lyra) 의 캐릭터 애니메이션은 언리얼 엔진 5의 개선된 애니메이션 블루프린트(Animation Blueprint) 시스템을 사용하여 거의 전적으로 블루프린트(Blueprints) 에서 만들어졌습니다. 이 시스템 구성은 커스텀 C++ 함수 기능을 사용하여 유사한 결과를 달성한 파라곤(Paragon)과 포트나이트(Fortnite)에서 영향을 받았습니다.

에셋 개요

AnimBP_Mannequin_Base 애니메이션 블루프린트에는 애님 그래프(AnimGraph) 창이 있으며, 이 창에서 캐릭터 마네킹의 최종 출력 포즈에 기여하는 애니메이션 노드(Animation Nodes) 아키텍처를 살펴볼 수 있습니다. 이 애니메이션 블루프린트로 가려면 콘텐츠 드로어(Content Drawer) > Characters > Heroes > Animations > AnimBP_Mannequin_Base 를 클릭합니다.

마네킹 베이스 애니메이션 블루프린트의 애님 그래프와 블루프린트 스레드 세이프 업데이트 애니메이션(Blueprint Thread Safe Update Animation) 함수입니다.

AnimBP_Mannequin_Base는 라이라 게임의 샘플 무기와 게임플레이 어빌리티 전반에 걸쳐 사용되는 일반적인 기술을 지원하도록 구성되어 있습니다.

블루프린트 스레드 세이프 업데이트 애니메이션

캐릭터 클래스용 애니메이션을 개발할 때는 애니메이션을 최적의 퍼포먼스로 실행하기 위해 주의할 점이 몇 가지 있습니다. 라이라에서는 이벤트 그래프(Event Graph) 대신 멀티 스레드 애니메이션(Multi Threaded Animation)을 사용하여 애니메이션 값을 계산합니다.

애니메이션 빠른 경로(Animation Fast Path) 는 게임 스레드(Game Thread) 밖에서 값을 계산하도록 도와줍니다. 활성화하려면 에디터에서 편집(Edit) > 프로젝트 세팅(Project Settings) > 엔진(Engine) > 일반 세팅(General Settings) > 애님 블루프린트(Anim Blueprints) 로 이동한 후 멀티 스레드 애니메이션 업데이트 허용(Allow Multi Threaded Animation Update) 을 활성화하면 됩니다.

애니메이션 데이터를 수집하고 계산을 처리하는 함수를 보려면 AnimBP_Mannequin_Base클래스 디폴트(Class Defaults) 를 열고 내 블루프린트(My Blueprint) > 함수(Functions) 카테고리로 가서 BlueprintThreadSafeUpdateAnimation 함수를 클릭하면 됩니다.

스레드 세이프 함수를 사용할 때는 이벤트 그래프에서와 달리 게임 오브젝트에서 직접 데이터에 액세스할 수 없습니다. 예를 들어 캐릭터의 속력을 나타내는 게임플레이 float 값을 복사하려 한다면 스레드 세이프로 간주되지 않으므로, 이런 사례에 대응하려면 프로퍼티 액세스(Property Access)를 사용하는 편을 권장합니다.

애님 노드 함수

라이라에서는 애님 노드(Anim Node) 함수를 사용하여 스테이트별 로직을 생성합니다. 이러면 애니메이션 로직이 체계적으로 유지된다는 이점이 있습니다. 캐릭터가 유휴(Idle) 애니메이션 중일 때의 값을 계산해야 한다면, 그 로직을 유휴 스테이트에 넣으면 됩니다. 예시를 보려면 다음 단계에 따릅니다.

  1. AnimBP_Mannequin_Base > 애님 그래프 로 가서 LocomotionSM 스테이트 머신을 더블클릭하여 로코모션 스테이트를 표시하는 창을 엽니다.

    로코모션 스테이트 머신(Locomotion State Machine)은 애니메이션 스테이트 간의 트랜지션을 위한 스테이트 에일리어싱(State Aliases)을 포함합니다.

  2. Idle 스테이트를 더블클릭하고 애니메이션 포즈 출력(Output Animation Pose) 노드를 선택하면, 디테일(Details) 패널에 있는 함수(Functions) 에서 노드의 초기 값 설정을 제공하는 애님 노드 함수를 볼 수 있습니다.

    예시 이미지에서는 Idle 스테이트 머신을 열어 애니메이션 포즈 출력에 사용된 애님 노드 함수를 확인했습니다.

    함수

    설명

    초기 업데이트 시(On Initial Update)

    노드가 처음 업데이트되기 전에 호출됩니다.

    연관성이 생길 시(On Become Relevant)

    노드에 연관성이 생길 때 호출됩니다.

    업데이트 시(On Update)

    노드가 업데이트될 때 호출됩니다.

  3. 내 블루프린트(My Blueprint) > 함수(Functions) > 스테이트 노드 함수(State Node Functions) 로 가서 UpdateIdleState 함수를 더블클릭하여 Idle 스테이트 로코모션 노드의 최종 출력 포즈를 계산하는 데 사용되는 로직을 확인합니다.

    이전 엔진 버전에서는 레거시 스테이트 머신 이벤트가 애니메이션 업데이트 후에 발생했습니다.

스테이트 에일리어싱

프로젝트의 규모가 커지면 캐릭터가 다수의 애니메이션 스테이트로 트랜지션되어야 할 수 있습니다. 그러면 스테이트 머신에 다수의 트랜지션 라인이 생겨 그래프로 보기 어려워질 수 있습니다. 스테이트 에일리어싱은 트랜지션 로직을 단순화하는 동시에 스테이트 사이의 개별 트랜지션을 각각 제어할 수 있게 해줍니다. 라이라에서 스테이트 에일리어싱이 이용된 예시를 보려면 AnimBP_Mannequin_Base > Anim Graph > LocomotionSM 그래프로 가서 JumpSources 스테이트 노드를 선택합니다.

사용 가능한 스테이트 에일리어싱을 볼 수 있도록 하이라이트된 점프 소스(Jump Sources) 노드가 있는 로코모션 스테이트 머신 그래프입니다.

디테일 패널에서 Jump 스테이트로 직접 트랜지션될 수 있는 로코모션 스테이트를 볼 수 있습니다.

디테일-패널

라이라 캐릭터가 Idle 스테이트일 때 플레이어가 점프 액션을 사용하면, 캐릭터는 Jump 스테이트에 들어갑니다. 그 뒤에는 추락(Falling) 스테이트로 트랜지션된 후 다음 사이클에 진입하거나 Idle 스테이트로 돌아갑니다.

상단/하단 바디 레이어링

블렌드 노드(Blend Nodes)는 애니메이션을 블렌딩하는 데 사용됩니다. 라이라에 사용되는 로코모션 애니메이션은 대부분 풀 바디입니다. 즉, 애니메이션이 전체 스켈레톤에서 재생되고(jog_fwd 애니메이션 등), 플레이어가 언제든지 사용할 수 있는 다양한 상단 바디 액션과 결합됩니다(무기 발사 또는 재장전 애니메이션 등).

이 작업은 AnimBP_Mannequin_Base > AnimGraph 를 연 다음 상단 바디/하단 바디 분할(Upper/Lower Body Split) 코멘트로 가서 볼 수 있는 본 별로 레이어드 블렌딩(Layered Blend Per Bone) 노드를 사용하여 수행됩니다.

본 별로 레이어드 블렌딩 노드를 선택하면, 디테일 패널에서 블렌드와 관련된 개별 본의 가중치를 명시적으로 제어할 수 있는 블렌드 마스크(Blend Mask)를 볼 수 있습니다.

링크된 레이어 애니메이션 블루프린트

애니메이션 블루프린트 링크(Animation Blueprint Linking) 시스템은 애니메이션 그래프의 여러 하위 섹션이 동적으로 전환되게 합니다. 링크된 레이어 애니메이션 블루프린트(Linked Layer Animation Blueprints)를 통해 메인 애니메이션 블루프린트의 여러 곳을 오버라이드할 수 있습니다.

라이라에서 이는 플레이어가 들고 있는 무기에 따라 로코모션 행동, 애니메이션 에셋, 포즈 수정이 달라질 수 있음을 뜻합니다. 이 기능들을 분리된 상태로 유지하여 여러 사용자가 애니메이션을 동시에 작업할 수 있게 하거나, 핵심 기능을 공유하면서도 에셋 사이의 종속성을 줄일 수 있습니다.

애님 레이어 인터페이스

ALI_ItemAnimLayers 는 애니메이션 블루프린트에서 애니메이션을 오버라이드할 수 있는 곳을 지정하는 애님 레이어 인터페이스(Anim Layer Interface)입니다. 라이라에서 이 작업은 에임과 스켈레톤 제어를 위한 레이어뿐 아니라 로코모션 스테이트에 대해서도 수행됩니다.

아이템 애님 레이어 인터페이스의 일부인 *FullBody_Aiming** 애니메이션 레이어입니다.

ABP_ItemAnimLayersBase 는 모든 무기가 사용하는 베이스 링크된 레이어 애니메이션 블루프린트입니다. 이 블루프린트에 액세스하려면 Content > Characters > Heroes > Mannequin > Animations > LinkedLayers 로 갑니다.

메인 애니메이션 블루프린트에서 데이터 액세스하기

ABP_ItemAnimLayersBase 애니메이션 블루프린트에는 메인 애님 블루프린트 스레드 세이프 얻기(Get Main Anim BPThreadSafe) 라는 커스텀 함수가 있습니다. 메인 애니메이션 블루프린트(AnimBP_Mannequin_Base )에 대한 레퍼런스를 얻는 데 사용되는 함수입니다.

아이템 애님 레이어의 베이스 애니메이션 블루프린트에 나타난 메인 애님 블루프린트 스레드 세이프 얻기 함수

이렇게 하면 프로퍼티 액세스를 사용하여 모든 데이터에 액세스할 수 있으며, 가속(Acceleration) 또는 속도(Velocity) 와 같이 링크된 레이어가 사용할 수 있는 어떤 값이든 다시 계산할 필요가 없습니다.

애니메이션 선택을 위해 애님 노드 함수 사용하기

라이라에서 링크된 애니메이션 레이어(Linked Anim Layers) 는 애님 노드 함수와 함께 프로퍼티 액세스 를 사용하여, 애니메이션이 업데이트될 때(업데이트 시, On Update) 또는 연관성이 생길 때(연관성이 생길 시, On Become Relevant) 로직을 실행합니다.

아래 예시에서는 애니메이션에 연관성이 생길 때마다 방향성 시작 애니메이션을 선택합니다.

링크된 레이어 자손 애니메이션 블루프린트

라이라의 모든 무기에는 ABP_ItemAnimLayersBase 로부터 상속받는 자손 애니메이션 블루프린트가 있습니다. 애니메이터는 아래 있는 ABP_PistolAnimLayers 애니메이션 블루프린트 이미지에 보이는 것처럼 애니메이션을 삽입하고 무기별로 모든 변수를 편집할 수 있습니다.

디스턴스 매칭과 스트라이드 워핑

디스턴스 매칭(Distance Matching) 은 애니메이션 에셋과 게임플레이 간에 모션을 일치시키기 어려운 경우(시작, 중지, 착지 애니메이션과 같은 로코모션 애니메이션 에셋 등)에 애니메이션의 재생 속도를 조절합니다.

Stride Warping(스트라이드 워핑)은 캐릭터가 달리기(Jog) 스테이트에 들어갈 때처럼 재생 속도로 캐릭터의 보폭을 조절할 수 없는 경우에 보폭을 동적으로 조절하기 위해 사용됩니다.

stride-warp-motion

이 두 가지 기법을 결합하면, 한 기법을 다른 기법보다 우선하도록 동적으로 선택할 수 있습니다. start 스테이트에 먼저 디스턴스 매칭을 사용하여 포즈를 유지한 후, jog 스테이트에 가까워지면 스트라이드 워핑을 사용하여 블렌딩합니다.

시작-애님-업데이트

오리엔테이션 워핑

오리엔테이션 워핑(Orientation Warping)은 캐릭터 움직임의 루트 모션 각도와 함께 사용하며, 캐릭터의 바디 하단을 구부려 루트 모션 각도에 일치시킵니다. 라이라에서는 네 가지 기본 방향에 대하여 횡이동 애니메이션이 생성됩니다. 플레이어가 360도로 자유롭게 움직일 수 있으므로 오리엔테이션 워핑을 사용해 캐릭터의 포즈를 프로시저럴 방식으로 조절했습니다. 애니메이션의 범위가 제한되기 때문에 이 기법은 start 스테이트에서 사용됩니다.

orientation-warping

제자리 회전

제자리 회전 애니메이션 선택은 라이라의 베이스 링크된 애니메이션 블루프린트의 유휴(Idle) 스테이트 머신 안에서 이루어집니다. 회전 각도를 기초로 하는 다양한 애니메이션과 이를 트리거하기 전에 플레이어가 대기하는 시간은 자손 애니메이션 블루프린트의 무기별 애님 설정(Anim Set) 섹션에서 커스터마이징할 수 있습니다. 이를 위해 클래스 디폴트(Class Defaults) > 애님 설정 - 제자리 회전(Anim Set - Turn In Place) > 제자리 회전 트랜지션(Turn In Place Transitions)으로 이동합니다.

turn-in-place

라이라에서 캐릭터 액터는 컨트롤러의 요(Yaw)를 향합니다. 발의 미끄러짐을 최소화하기 위해 루트 본 회전(Rotate Root Bone) 노드는 회전의 반대 방향을 사용하며, 루트 요 오프셋(Root Yaw Offset)에 오프셋을 더합니다.

컨트롤러-요-반대-방향

이 추가 오프셋은 요 값을 풀 바디 에임(FullBody Aiming) 레이어의 에임 오프셋(Aim Offset)에 전달할 때 사용됩니다. 플레이어가 어떤 행동을 하고 있느냐에 따라 루트 요 오프셋 모드를 다음 표에 나오는 상태 중 하나로 변경할 수 있도록 해야 합니다.

오프셋 모드

설명

누적(Accumulate)

누적은 Idle 스테이트에서 액터의 회전을 완전히 역행합니다.

보류(Hold)

보류는 start 스테이트의 애니메이션이 시작될 때의 원래 오프셋을 유지합니다.

블렌드 아웃(Blend Out)

블렌드 아웃은 달리기 사이클에 들어갈 때 부드럽게 블렌딩하고 '컨트롤러 방향의' 디폴트 행동에 따릅니다.

이는 각각의 스테이트가 필요에 따라 호출할 수 있는 루트 요 오프셋 모드 요청(Request Root Yaw Offset Mode) 함수를 통해 이루어집니다.

루트-요-오프셋-모드-요청

캐릭터가 Idle 스테이트이고 오프셋 모드가 누적(Accumulate)으로 설정되었다면 애니메이션의 루트 회전을 루트 요 오프셋에 적용해야 합니다. 이 정보는 회전 요 애님 모디파이어(Turn Yaw Anim Modifier) 를 사용해 커브로 구워지며, 루트 모션이 활성화된 소스 애니메이션이 필요합니다.

요-애님-회전

추가 참고사항

게임플레이 태그 바인딩

라이라는 대부분의 플레이어 행동에 대해 게임플레이 어빌리티 시스템(Gameplay Ability System)을 사용합니다. 애니메이션 블루프린트의 이러한 이벤트에는 게임플레이 태그(Gameplay Tag) 바인딩을 사용해 응답할 수 있습니다. AnimBP_Mannequin_Base 블루프린트 안에서 게임플레이 태그로 이동하려면 클래스 디폴트(Class Defaults) > 디테일(Details) > 게임플레이 태그(Gameplay Tags) > 게임플레이 태그 프로퍼티 맵(Gameplay Tag Property Map) 으로 갑니다.

gameplay-tags

몽타주

몽타주가 블렌드 프로필(Blend Profiles)관성화(Inertialization)를 지원하도록 업데이트되었습니다.

5.0 버전에서는 현재 둘을 동시에 활성화할 수는 없습니다.

몽타주

노티파이

추가적인 애니메이션 노티파이(Animation Notify) 정보가 스테이트 머신 트랜지션에 노출되었습니다. 라이라에서는 이를 사용하여 특정 스테이트에서 트랜지션하는 정확한 타이밍을 제어합니다.

스테이트-머신-노티파이

디버깅

포즈 감시 매니저(Pose Watch Manager)를 사용하여 그래프의 특정 포인트에 포즈 감시를 추가함으로써 런타임 포즈를 검사하고 빠르게 탐색할 수 있습니다. 포즈 감시 매니저를 사용하려면 창(Window) > 포즈 감시 매니저(Pose Watch Manager) 로 가면 됩니다.

pose-watch-manager

디버깅에는 되감기 디버거(Rewind Debugger)애니메이션 생산성 팁과 트릭(Animation Productivity Tips And Tricks) 페이지에 있는 팁과 트릭을 활용할 수 있습니다.