[UE] 시퀀서 관련 이슈
시퀀서는 언리얼의 시네마틱 도구로 트랙 단위로 객체를 조정할 수 있는 일종의 비주얼 스크립팅 시스템입니다.
여러 요소들을 함께 볼 수 있기에 전체적인 비주얼을 확인하는데 용이하고, 오프라인 렌더링을 지원하기 때문에 트레일러 같이 고퀄리티 시네마틱에 많이 사용됩니다.
이외에도 카메라 컷신이나 VFX가 많이 들어가는 스킬 등 시네마틱이 아닌 인게임 플레이에 사용하기도 합니다.
그러나 모든 시스템이 그렇듯 완벽한 것은 아니기에 실제 작업에서 많은 이슈들이 있습니다.
이 글에서는 특히 인게임 플레이와의 연동에서 경험한 이슈들에 대해 소개할까 합니다.
1. 루트 모션 지원 미흡
루트 모션이란, 애니메이션에 있는 루트 본의 움직임으로 애니메이터가 리소스 제작 시 같이 들어갑니다.
루트 모션의 움직임은 리소스 제작시 캐릭터의 움직임에 따라 만들어지기에 사실적인 움직임을 시뮬레이션하는데 유용합니다.
시퀀서에서도 루트 모션을 지원하기는 하는데 다소 불편한 점이 있습니다.
1-1) 프리뷰
루트 모션이 활성화된 애니메이션의 경우 시퀀서 프리뷰 상에서 Animation Mode가 Custom Mode일 때만 움직입니다.
위 스샷처럼 Aniamtion Blueprint일 경우 제자리에서 재생되는 걸 볼 수 있습니다.
Custom 모드로 한다면 움직임을 볼 수 있지만 그럴 경우 인게임에서도 Custom 모드가 되어 Animation Blueprint에 있는 IK 같은 기능들을 사용할 수 없습니다.
이 때문에 사용되는 캐릭터의 Animation Mode 기본값을 Custom으로 바꾸거나 시퀀서에서만 사용하는 캐릭터를 따로 만들어야 합니다.
1-2) 트랜스폼 베이크
루트 모션 정보를 트랜스폼에 직접 사용하고 싶은 경우가 있습니다.
시퀀서에는 애니메이션으로부터 트랜스폼을 구우는 기능이 있긴 하지만 2가지 문제가 있습니다.
첫 번째 문제는 월드 공간 기준으로만 구워진다는 것입니다.
시퀀서가 재생되는 환경이 모두 애니메이션을 기준으로 조정되지 않는 이상 그대로 사용하기에는 무리가 있습니다.
사실 이 문제는 Override Instance 옵션으로 해소가 가능하긴 하지만 시퀀서 작업이 절대 좌표를 기준으로 이루어지거나 복수의 애니메이션을 사용한다면 두 번째 문제로 인해 불가능합니다.
두번째 문제는 여러 애니메이션을 이어서 붙이는 것이 어렵다는 것입니다.
서로 다른 애니메이션 두 개가 처음 시작을 원점에서 한다면 구워질 때도 각각은 원점에서부터 구워집니다.
콤보 공격 같은 경우 첫 번째 모션이 끝난 지점부터 두 번째 모션이 시작되어야 하는데 이 경우 그게 불가능합니다.
두번째 모션의 트랜스폼에 Offset을 줘야 하지만 Offset을 줄 방법이 사실상 없습니다.
트랜스폼 트랙의 블랜드 타입을 Additive는 월드 공간을 기준으로 작동하기에 사용할 수 없고, 베이크 된 키프레임에 일일이 Offset을 더해주는 건 비현실적입니다.
이 때문에 루트 모션을 추출하는 전용 로직을 짜거나 모든 모션을 하나로 합친 다음 구워야 합니다.
2. 태그 바인딩
태그 바인딩은 인게임 객체를 시퀀서에 묶는 기능입니다.
시퀀서를 인게임 플레이에 활용하기 위한 필수 기능이지만 모듈러 캐릭터를 바인딩할 때 불편한 점이 있습니다.
모듈러 캐릭터는 스켈레탈 매쉬 컴포넌트가 여러 개 있는데 문제는 제대로 작동을 하기 위해서는 각각 컴포넌트에 따로 태그를 달아줘야 합니다.
스켈레탈 매쉬 컴포넌트가 하나일 때는 액터에다가 만 태그를 달아줘도 알아서 바인딩이 되었지만 같은 종류의 컴포넌트가 여러 개 있다면 메인 스케레탈 매쉬만 바인딩되고 다른 컴포넌트들은 바인딩되지 않습니다.
이 때문에 바디 애니메이션은 재생되지만 매인 메쉬의 하위 컴포넌트인 얼굴 매쉬 컴포넌트는 바인딩되지 않아 표정 애니메이션이 재생되지 않는 경우가 발생합니다.
애초에 태그를 달아주는 것도 손이 많이 가는 일인데 이것 때문에 작업량이 더욱 증가합니다.
Dynamic Possession 기능으로 어느 정도 해소 가능하지만 클래스가 다른 객체끼리 바인딩해야 할 경우 태그를 사용해야만 합니다.
3. 재생 도중 블랜드 아웃 기능 부재
일부 상황에서는 시퀀서를 중간에 끝내고 싶을 때가 있습니다.
문제는 시퀀서에는 중간에 블랜드아웃하는 기능을 지원하지 않기에 중간에 끊게 되면 카메라 블랜딩이나 애니메이션 블랜딩이 전혀 없이 종료되어 어색한 상황이 연출됩니다.
그나마 애니메이션은 엔진 소스를 수정하거나 다른 우회 방법이 있지만 카메라 블랜딩은 대부분 중간에 빠져나오면 어떻게 블랜딩 시켜도 어색한 경우가 많아서 만약에 중간에 끊고 싶다면 최소한 카메라 연출이 끝난 이후가 안전합니다.
4. 스킵 시 트리거 호출
시퀀서에서 재생위치를 변경시킬 때 이전 위치와 새로운 위치 사이의 트리거 호출 여부를 선택할 수 있습니다.
불편한 점은 이걸 트리거 단위로 선택할 수 없다는 것입니다.
일부 트리거는 무시해도 되지만 어떤 것들은 이후 게임 플레이를 위해 필수적으로 호출되어야 하는 것인 경우가 있습니다.
필수 트리거 호출 시점을 스킵 이후로 하거나 스킵 이후 한번 더 호출하는 방법이 있지만 그만큼 작업 과정이 복잡해지고 실수가 발생할 가능성이 있습니다.
개인적으로 이 문제는 엔진 소스를 수정하는 것이 비용이 가장 적은 해결방법이라고 생각합니다.
5. 레벨 틱과의 충돌
시퀀서 평가는 레벨 틱이 돌기 전에 실행됩니다.
이 때문에 시퀀서로 인해 위치가 변경된 이후 레벨 틱에서 실행되는 로직에서 덮어씌워질 가능성이 있습니다.
대표적으로 UCharacterMovementComponent에서 높이 보정 로직이 돌아서 프리뷰와 인게임뷰가 다른 경우가 발생합니다.
올바른 작동을 위해서는 레벨틱에서 위치가 변경될 로직들을 꺼주거나 시퀀서에서의 위치를 저장해 놨다가 레벨틱이 끝난 이후 다시 적용해주어야 합니다.
위의 항목 외에도 바인딩이 소실되거나 갑자기 트랙이 비정상적으로 작동하는 등 자잘한 버그들이 많습니다.
그럼에도 시퀀서는 여전히 강력하기에 (고쳐서) 사용할 가치가 있는 도구는 분명합니다.