안녕하세요, 에픽게임즈 애니메이션 게임플레이 프로그래머 호세 빌라로엘(Jose Villarroel)입니다. 새로운 무료 샘플 프로젝트 라이라 스타터 게임의 애니메이션 시스템은 현재 언리얼 엔진 5 버전을 사용하여 게임을 제작하는 방법을 선보입니다. 이를 활용하여 여러분의 프로젝트를 확장할 수도 있습니다. 프로젝트는 여기에서 다운로드하세요. 이 블로그 게시물에서는 포트나이트와 파라곤에서 영감을 받은 스트레이핑 캐릭터를 매트릭스 어웨이큰스: 언리얼 엔진 5 익스피어리언스에서처럼 정면을 바라보는 캐릭터로 변경할 때 필요한 지식과 사용할 툴을 자세히 알아봅니다.
스트레이핑 애니메이션
정면을 바라보는 애니메이션
지속적으로 수정 중인 부분 각각에 대해 자세히 알아보고 앞으로 다룰 애니메이션 블루프린트에 더 익숙해지고 싶다면 라이라의 애니메이션 문서를 참고하세요.
애니메이션 대체하기
새로운 로코모션 스타일을 구현하려면 여러 가지 애니메이션이 필요합니다. 여러분이 직접 만들어도 좋지만, 저는 편의상 새로운 도시 샘플의 로코모션 애니메이션 세트를 이주하겠습니다.
참고: 디폴트 이주 세팅에는 애니메이션 노티파이에 사용되는 소리처럼 불필요한 추가 에셋이 많습니다. 체크 해제해도 좋지만, 레퍼런스를 수동으로 대체해야 합니다.
도시 샘플의 플레이어 캐릭터에는 방향성 시작 등 정면을 바라보는 세트에 없는 요소가 상당수 포함됩니다.
도시 샘플의 애니메이션 에셋은 다른 스켈레톤 에셋의 부모가 되므로 한 스켈레톤을 다른 스켈레톤으로 리타기팅하는 것과 비슷한 작업을 해야 합니다. 다행히 동일한 부분적 계층구조가 있습니다(혹시 없다면 IK 릭 리타기팅을 대신 사용하면 됩니다). 따라서 UE5에서 새로 선보이는 호환 스켈레톤(Compatible Skeletons)을 사용할 수 있습니다. SK_Mannequin을 열어서 호환 스켈레톤에 SK_Base를 추가하겠습니다.
다음으로 정면을 바라보는 버전의 애님그래프 차이를 위해 링크된 레이어 애니메이션 블루프린트 베이스를 새로 만들겠습니다. ABP_ItemAnimLayersBase를 복제하겠습니다. 이름은 ABP_ForwardFacing으로 지정합니다. 간단한 진행을 위해 클래스 디폴트(Class Defaults)의 애니메이션 에셋 레퍼런스를 ABP_UnarmedAnimLayers의 비무장 세트로 채워 넣고, (클래스 디폴트 아래) ABP_ForwardFacing의 AnimSet - Starts/Stops/Jog를 City Sample의 세트로 대체하겠습니다.
라이라는 디스턴스 매칭을 사용하므로, 디스턴스 커브를 모든 새로운 조그 사이클, 시작, 중지에도 추가합니다. 디스턴스 커브 애니메이션 모디파이어를 각 애니메이션에 추가하면 됩니다. 콘텐츠 브라우저(Content Browser) > 우클릭 > 애니메이션 모디파이어(Animation Modifiers) > 모디파이어 추가(Add Modifiers)로 이동하여 모든 애니메이션 시퀀스를 선택하면 대량으로 추가할 수 있습니다.
디스턴스 커브 모디파이어와 생성된 디스턴스 커브.
캐릭터 블루프린트 응용하기
라이라의 슈팅 게임 모드에서 캐릭터는 항상 플레이어가 에임 중인 곳을 봅니다. 정면을 바라보는 캐릭터에게는 그 점이 이상적이지 않으므로, B_Hero_ShooterMannequin을 살펴보고 캐릭터 무브먼트 세팅을 약간 변경하겠습니다. 이제 캐릭터 무브먼트 컴포넌트에서 무브먼트 방향으로 회전 조정(Orient Rotation To Movement)을 활성화하고 캐릭터 디폴트(Character Defaults)에서 컨트롤러 회전 요 사용(Use Controller Rotation Yaw)을 비활성화하겠습니다.
이제 정면을 바라보는 새로운 애니메이션 블루프린트를 링크해야 하지만, 이 블루프린트가 특정 인벤토리 아이템과 연결되지 않았으므로 약간의 조정을 거쳐서 디폴트 비헤이비어를 오버라이드해야 합니다. 인벤토리 아이템이 추가되지 않도록 방지하고 기본적으로 레이어를 링크하겠습니다.
B_Hero_ShooterMannequin > 이벤트 그래프(Event Graph). 변경이 필요한 부분은 녹색으로 하이라이트했습니다.
더 보기 쉽게 ABP_Mannequin_Base에 디버그 시각화를 추가하겠습니다.
액터의 정면에 검은색 화살표를 그리고 메시의 루트 본 정면에 빨간색 화살표를 그립니다.
이제 플레이를 누르고 어떻게 보이는지 확인해 보겠습니다.
방향성 시작 애니메이션이 어색해 보입니다. 캐릭터 회전이 너무 빨라서 발이 심하게 미끄러지네요. 가끔 스내핑도 일어나고, 애니메이션 재생 속도가 너무 빠릅니다. 그러니 재생 속도, 스내핑, 회전 속도라는 세 가지 문제를 각각 해결해야 합니다.
재생 속도부터 고쳐 보겠습니다. 달리기 시작 애니메이션에 디스턴스 매칭(Distance Matching)을 사용하겠습니다. 재생 속도는 디스플레이스먼트와 비례하며, 이 캐릭터는 정말 빠르게 움직입니다. 라이라에서는 재생 속도와 스트라이드 워핑(Stride Warping)을 함께 사용하므로, 애니메이션과 게임플레이의 차이를 고려하여 캐릭터의 포즈를 다이내믹하게 조정할 수 있습니다. 발 미끄러짐을 어느 정도 허용하기도 합니다. 디스턴스 매칭이 너무 심하면 재생 속도가 매우 빨라질 수 있으며, 스트라이드 워핑이 너무 심하면 캐릭터의 포즈가 너무 스트레치될 수 있기 때문입니다. 미세조정할 수 있기는 하지만 재생 속도/스트라이드 워프 조절의 업계 표준은 최대 15~20% 범위에서 가감하는 것입니다. 그 범위를 초과하는 값을 사용하면 시각적인 퀄리티가 심각하게 떨어지므로 차라리 발 미끄러짐을 허용하는 것이 나을 때가 많습니다. 대신 최고 퀄리티를 사용하고 캐릭터 무브먼트 컴포넌트의 속도와 가속을 좀 더 처리하기 용이한 수준으로 줄여보겠습니다. 이제 어떻게 보이는지 확인해 보겠습니다.
애니메이션 디버깅
재생 속도가 확실히 나아 보이며 스내핑도 거의 사라졌습니다. 대신 시작 애니메이션이 거의 재생되지 않는 것 같습니다. 이제 이 문제를 해결해 보겠습니다. 새로운 되감기 디버거(Rewind Debugger)를 사용해 보면 좋을 것 같습니다.
되감기 디버거를 사용하여 ABP_Mannequin_Base로 이동했습니다. 전진과 후진을 반복해 보니 스테이트 머신의 Start 스테이트의 트랜지션이 너무 이르다는 점을 알 수 있습니다. 자세히 살펴보니 속도 방향의 변화, 캐릭터 방향, 루트 요 오프셋(Root Yaw Offset) 차이에 따라 트랜지션 룰이 중단될 수 있었습니다(라이라의 애니메이션 문서의 '제자리 회전' 섹션을 참고하세요).
캐릭터가 정면을 바라볼 때 무언가를 비활성하고자 할 경우 이 블루프린트 로직을 사용하겠습니다.
스트레이핑 캐릭터에는 적합하지만 정면을 바라보는 캐릭터에는 그렇게까지 적합하지 않습니다. 프로퍼티 액세스(Property Access)를 사용하면 캐릭터 무브먼트 컴포넌트에서 이런 트랜지션을 막기 위해 필요한 관련 프로퍼티를 알기 쉽습니다. 이 기회에 기타 불필요한 요소도 제거해 보겠습니다.
정면을 바라보기 시작하는 동안에는 애디티브 린(lean)이 없어도 됩니다. 에임 오프셋(Aim Offset)도 비슷하게 비활성화됩니다.
ABP_Mannequin_Base > LocomotionSM > Start
오리엔테이션 워핑(Orientation Warping)은 바디 하단의 오리엔테이션을 조절하여 애니메이션 이동 방향과 캐릭터 이동 방향 간의 차이를 보완합니다. 정면을 바라보는 캐릭터의 경우 캐릭터가 이동하는 방향을 바라보게 해야 하므로 Start에 오리엔테이션 워핑이 필요하지 않습니다.
ABP_ForwardFacing > 애니메이션 레이어(Animation Layers) > Full Body Start State
또한 좌측으로 회전할지, 우측으로 회전할지에 따라 다른 180° 스타트를 추가로 선택할 수 있어야 합니다.
이동하며 회전
마지막으로 회전 속도 문제를 해결하겠습니다. 캐릭터의 회전 속도와 애니메이션에 바람직한 회전 속도 간에 상당한 차이가 있는 문제를 해결하려 합니다. 가장 간단한 방법은 캐릭터 무브먼트 컴포넌트의 회전 속도를 줄이는 것이지만, 최선의 퀄리티를 내는 해결책은 아닙니다.
다행히 바로 이 문제의 해결책이 라이라의 제자리 회전에 빌드되어 있습니다(라이라의 애니메이션 문서의 '제자리 회전 섹션'을 참고하세요). 루트 요 오프셋으로 캐릭터의 회전에 대응함으로써 애니메이션의 회전 속도를 더 정확히 따라가는 것입니다.
가장 중요한 차이점은 작성된 애니메이션과 정확히 같은 회전을 구현하지 않고, 애니메이션을 플레이어가 원하는 방향에 맞게 조정하려 한다는 점입니다. 즉, 플레이어가 60° 회전 중인데 선택한 애니메이션이 45° 스타트인 경우, 60° 회전을 모두 커버하도록 워프하면서 동시에 애니메이션에 작성된 비례 속도에 맞춥니다.
일단 제자리 회전 애니메이션 모디파이어(Turn in Place Animation Modifier)를 적용해야 합니다. 생성된 커브의 이름을 RemainingTurnYawSt 및 TurnYawWeightSt로 지정하겠습니다.
참고: 적절히 리매핑하려면 두 커브가 두 스켈레톤 에셋에 모두 존재해야 하므로 두 커브를 SK_Mannequin에 수동으로 추가합니다.
애니메이션 모디파이어로 생성된 커브는 제자리 회전 프로세스 턴 요 커브(Process Turn Yaw Curve)에 사용됩니다.
ABP_Mannequin_Base > 함수(Functions) > 제자리 회전(Turn In Place)
이 함수를 복제하고 기존 애님 노드 함수(Anim Node Functions)(UE5의 새로운 함수)를 조정하여 새롭게 필요한 부분을 해결하겠습니다. 일단 루트 요 오프셋(Root Yaw Offset) 델타의 스케일을 조절하겠습니다.
시작 애니메이션의 회전 부분 동안에는 루트 요 오프셋을 제어해야 하지만, 회전이 완료되면 이 오프셋을 블렌딩하여 없애야 합니다. 이를 위해 새로운 시작을 트리거할 때마다 리셋해야 하는 회전 종료 도달(Reached End of Turn)을 추가합니다.
ABP_Mannequin_Base > Start 스테이트 구성(Set Up Start State)은 Start 스테이트가 연관성을 얻을 때마다 실행되는 애님 노드 함수입니다.
라이라 애니메이션 블루프린트에는 루트 요 오프셋 모드(Root Yaw Offset Mode)를 통한 캐릭터의 회전 대비 메시의 회전이 행동하는 방식을 제어하는 모드가 내장되어 있습니다. 이제 ABP_Mannequin_Base > 시작 베이스 업데이트(Update Start Base) 애님 노드 함수(Anim Node Function)를 업데이트하여 회전 종료에 도달했는지 여부에 따라 모드를 변경하겠습니다.
이제 결과를 보겠습니다.
멀티플레이어에서도 사용할 수 있습니다.
툴세트 응용하기
라이라의 스트레이핑 애니메이션 구성은 정면을 바라보는 로코모션을 지원하도록 제작되지 않았습니다. 이러한 미세조정 덕분에 이제 두 가지 모드가 모두 지원됩니다. 코드를 한 줄도 작성하지 않고도 해낼 수 있었죠. 이 블로그에서 이야기한 새로운 툴을 사용하면 에임 중일 때 스트레이핑 세트를 사용하고, 월드를 탐색하는 중에는 정면을 바라보는 게임을 제작할 수 있습니다.
변경은 유지되며, 링크된 애님 레이어(Linked Anim Layers), 애님 노드 함수, 프로퍼티 액세스를 사용하면 이전보다 훨씬 효과적으로 애니메이션 블루프린트 로직을 재사용하고, 대체하고, 구분할 수 있습니다. 포즈 워핑(Pose Warping)과 디스턴스 매칭을 사용하면 게임플레이에 필요한 애니메이션을 조정할 수 있습니다. 되감기 디버거를 사용하면 컨텍스트 내에서 최소한의 구성으로 애니메이션을 디버깅할 수 있습니다.
이 기능들은 애니메이터와 디자이너에게 강력한 기능을 지원하기 위해 빌드된 언리얼 엔진 5의 새로운 기능 중 일부에 불과합니다. 리타기팅을 사용하면 여러분의 캐릭터, 메타휴먼, 파라곤 주인공까지도 라이라로 리타기팅할 수 있으며, 그 반대도 가능합니다. 라이라의 새로운 실험단계 기능인 모션 매칭(Motion Matching)을 사용하여 직접 시도해 보세요.
5.0 버전이 출시되었으니, 언리얼 엔진 5의 애니메이션을 개선할 수 있도록 언제든 피드백을 보내주세요. 포럼에 와서 의견을 공유해 주시고, 여러분의 차기 작품도 보여주시기 바랍니다!
지금 언리얼 엔진을 다운로드하세요!
세계에서 가장 개방적이고 진보된 창작 툴을 받아보세요.
모든 기능과 무료 소스 코드 액세스를 제공하는 언리얼 엔진은 제작에 바로 사용할 수 있습니다.