Unreal 5/문제해결

[Unreal 5] UE5.4 모션 매칭 (Motion Matching) 문제

트릭시 2024. 5. 24. 14:28

모션 매칭 기능을 사용해보기 위해서 좀 트라이를 하다가 직면했던 문제들과, 어떻게 해결하였는지 기록해 놓으려고 한다.

 

Use Case :

우선, 나는 필드에서는 자유로운 3인칭 시점으로 돌아다니면서

배틀에 진입하면 백 뷰 시점으로 움직일 수 있도록 하고 싶었다.

 

 

뭐 애초에 필드 움직임은 ABP로 UE5.1 에서 구현해놓았기 때문에 크게 문제는 안되었지만,

UE5.4로 업데이트하면서 모션 매칭이라는 기능을 사용하여 In Battle Movement 를 구현해 보기로 했다.

 

 

How To :

모션 매칭을 사용하려면, 우선 UE5.4 버전에서 아래와 같은 플러그인들을 활성화 해야 한다.

 

Pose Search : 적당한 Pose를 찾아주는 API 플러그인
Motion Trajectory : 모션 데이터를 사용하여 다음에 사용할 모션을 예측해주는 플러그인

 

그렇게 하면 에디터에서 Motion Matching 을 위한 BP를 생성할 수 있게 되는데,

 

 

Animation > Motion Matching > Pose Search Database, Pose Search Schema 가 우리에게 필요한 것들이다.

 

Pose Search Schema 의 경우, DB에서 사용할 스키마를 정의하는 블루프린트이며 이를 위해서는 모션 데이터 수집을 위해 어떤 스켈레톤을 사용할 것인지 선택을 해 주어야 한다.

 

 

자신이 사용할 Skeleton 을 사용하면 되며,

 

Pose Search Database 의 경우 어떤 스키마를 사용하여 데이터베이스를 구축할 것인지 선택하면 된다.

아래와 같이 방금 만든 스키마를 선택하면 된다.

 

 

 

그러면 이제 이렇게 비어있는 윈도우가 나타날 텐데, Asset List 에는 사용할 모션 데이터들을 넣어주면 되고

우측에는 왼쪽의 모션 데이터를 사용하여 캐릭터의 움직임을 보여 주는 Viewport 가 있다.

 

 

그렇게 원하는 모션을 집어넣으면 뷰포트에 자동으로 모션을 분석하여 경로와 모션 재생을 예측해 주고, 이것을 ABP에 적용할 수 있게 되는 것이다.

 

 

ABP에 적용하는 방법은 간단하다.

 

이런식으로 만들어 주면 되는데,

Motion Matching 에 사용되는 Database 는 우리가 방금 만들었던 Database 로,

Pose History 에는 캐릭터의 궤도 데이터를 갖는 컴포넌트의 데이터를 설정하면 되는데

 

 

이것 또한 이렇게 캐릭터 BP에 CharacterTrajectory 라는 컴포넌트를 추가해서, ABP가 사용할 수 있도록 하면 된다.

 

 

그러고는 ABP의 이벤트 그래프에서 초기화 할 때 이 BP를 가져오고,

Update Animation 마다 Character Trajectory 컴포넌트 정보를 가져와서 업데이트해주면 된다.

 

 

마지막으로, Pose History 에서 사용할 Trajectory 를 방금 설정한 멤버 변수로 설정하면 된다.

 

 

필자는 45도 애니메이션은 없이 했기 때문에 8방향 움직임은 매끄럽진 않지만 4방향만 보면 꽤나 괜찮다.

모션 매칭은 모션의 수가 많을수록 더 정확해지기 때문에 되도록 많은 모션을 넣어야 한다.

 

 

뛰는것은 좀 문제가 있긴 하다. 모션의 수가 적은 경우에는 그냥 ABP를 사용해서 하는 것이 나은 것 같다.

 

Issues :

 

 

문제는, 우선 위와 같이 모션을 넣었음에도 불구하고 뷰표트에 표시가 안된다는 점이다.

필자의 경우,

 

1. MMD 캐릭터를 사용해서

2. MMD 캐릭터의 Rig을 조절하고

3. 커스텀 애니메이션을 마켓플레이스에서 다운받아

4. 해당 스켈레톤에 맞게 MMD 캐릭터를 Retarget 해서

5. Retarget 된 Animation Sequence 를 소스로 사용하고 있었다.

 

따라서 리타겟이 잘 되었다면, 원본에 이상이 없는 한 문제가 없어야 할 것 같았는데 아무리 해도 리타겟된 모션이 표시가 안되더라..

 

 

시도해 본 방법 1 : 

 

우선은 Motion Matching 을 사용할 때에는 '이동이 포함된' 애니메이션 시퀀스의 경우, 당연하게도 Root Motion 옵션을 반드시 켜 주어야 한다. 그래야 움직임이 예측이 되니깐.

 

그런데 하나 하나 어느 세월에 다 수정하고 앉아있을까?

 

이를 위해서 애니메이션 애셋을 모두 선택하고 우클릭 > Assert Actions > Edit Selection in Property Matrix 를 클릭하면

애니메이션의 속성들을 한번에 조절할 수 있는 윈도우가 생성된다.

 

 

이 윈도우 내에서 애니메이션 애셋들을 모두 선택하고 우측과 같이 Enable Root Motion, Force Root Lock 을 둘 다 켜주면 된다.

 

Enable Root Motion : 해당 애니메이션 시퀀스의 루트 모션을 On 한다.

Force Root Lock : Root 본을 강제적으로 잠궈, 루트 모션이 가능하도록 도움을 준다.

 

 

그런데도 여전히 뷰포트에 나타날 생각을 하지 않고 있다...

이것 때문에 오만가지를 다 건드려보며 또 며칠을 허비했지만 해결이 안되었다.

 

 

 

시도해 본 방법 2 :

 

결국 이 모든게 다 안된다면? 결과적으로 그냥 리타겟 문제라고밖에 생각할 수가 없었다.

그래서 혹시나 하여 스키마 자체를 원본 (내 캐릭터가 아닌) Skeleton 으로 생성하고, Preview Mesh 를 내 캐릭터로 바꿔 보았다.

 

 

그렇게 하니, 캐릭터 매칭은 잘 된다는 것을 확인했다. 그러나 Schema의 뼈대가 이 캐릭터가 아니기 때문에 ABP에 사용할 수는 없다.

 

 

시도해 본 방법 3 (해결편) :

 

그렇다면 리타겟이 문제가 되는것도 아니고, (리타겟한 애니메이션이 프리뷰 메쉬로 잘 적용이 되므로)

DB 문제도 아니므로 Schema 가 문제렷다..

 

 

아니나 다를까, Schema 쪽이 결국 문제였다.

foot_l, foot_r 이 본을 따라간게 아니라 그냥 기본으로 저렇게 맞춰져 있어서 이상하다고 생각을 못했는데,

실제로 발쪽의 Bone 이름이 저게 아니었기 때문에 제대로 바꿔줘야 했다.

 

 

이런식으로 원래 본으로 설정을 하니..

 

 

그제서야 잘 돌아간다...!!

 

 

혹시나 나와 동일한 현상을 겪는다면, 이 방법을 한번 따라가보길 바란다..