본문 바로가기

Memorize: RECALL

자연스러운 무기 교체 (1)

서론

 Memorize: RECALL의 가장 큰 특징 중 하나는 무기 교체 시스템이다. 공격, 회피, 피격 상태가 아니라면 언제든지 무기를 교체할 수 있으며 이를 통해 콤보를 이어나가는 것 역시 가능하다.

 그런데 무기 교체 후 Mesh와 Animation이 즉시 바뀌면 부자연스럽다. 그렇기에 Mesh와 Animation의 교체를 부드럽게 해주는 작업이 필요하다.

 

Pose Snapshot을 이용한 애니메이션 블렌딩

Anim Instance의 무기 교체 인식

 우선 문제가 되는 것은 Anim Instance에서 어떻게 무기 교체를 인식할 것인가였다. 여기서 나는 3가지의 방법을 생각해보았다.

  1. Weapon Component에서 Anim Instance의 함수를 직접 호출한다.
    • Editor Time에는 Anim Instance 객체가 자주 변경되기에 변경된 Animation Data가 손실되는 경우가 발생했다.
    • 특히 에디터에서 무기를 변경 후에는 정상적으로 작동하나, 블루프린트 컴파일 후에는 Anim Instnace 객체가 변경되어 캐릭터가 기본 A 포즈로 있는 것을 확인할 수 있었다.
  2. Weapon Component에 무기 교체 Delegate를 두고 Anim Instance에서 이를 활용한다.
    • 서술한 것처럼, Anim Instance 객체는 Editor Time에는 자주 변경되기에, 무기 교체 후에 Anim Instance가 교체되어 Animation Data가 손실되는 경우가 있었다.
    • 또한 게임 실행 후에도 Anim Instance의 생성보다 Weapon Component의 무기 교체가 먼저 일어나서 Bind를 해도 호출되지 않았다.
  3. Anim Instance에서 매 프레임 Animation Data를 얻어와 교체되었는지 확인한다.
    • 일단 서술된 문제들은 모두 해결할 수 있었다.
    • 그러나 매 프레임 Data의 변경을 확인해야하고, Animation Data를 Weapon Component에서 변수로 저장해야 하고, 리플리케이션까지 해줘야 한다는 성능적인 문제가 존재한다.

 성능적인 문제는 추후 프로파일링을 통해 문제가 있는지 확인하면 되기에 3번 해결안을 택하였다. Anim Instance는 매 프레임마다 Weapon Component에 저장된 Animation Data를 얻어와 무기 교체 여부를 확인하였다. 그리고 큰 성능 상의 이슈나, 버그는 발견되지 않았다.

 

애니메이션 블렌딩

 다음 문제는 애니메이션이 교체되는 사이를 자연스럽게 하는 것이었다. 나는 현재 포즈에서 무기 교체 후 포즈까지를 블렌드하면 될 것이라고 생각하였다. 그래서 'UE4 Get Cur Pose'라는 검색어로 구글링을 해보았고, Pose Snapshot에 대한 문서를 볼 수 있었다. 이를 통해서 무기를 교체했을 때의 포즈를 얻어올 수 있었다.

Anim Instance의 Animation Data 확인과 Pose Snapshot

 

 이제 Anim Graph에서 Snapshot된 포즈를 이용해 블렌딩만 하면 자연스러운 애니메이션 교체가 가능했다. 그러나 한 가지 간과한 것이 있었다. 이동 중에 다리까지 전부 블렌딩되면 걷는 모션이 부자연스러워진다는 것이다. 이를 해결하고자 공중에 있을 때는 전체 본을, 걷고 있을 때는 상체만을 블렌딩하게끔 Anim Graph를 구성했다. 이를 통해 자연스러운 애니메이션 블렌딩이 가능했다.

Pose를 이용해 블렌딩을 하는 Anim Graph

 

애니메이션 블렌딩 결과