본문 바로가기
게임 개발 학습/[Unreal] Udemy 강의

Gameplay Ability System - Top Down RPG / Section 11-10

by Just Move 2026. 10. 2.

Motion Warping

발사체의 방향은 맞췄지만, 캐릭터는 발사되는 방향을 바라보고 있지 않다. 따라서 이를 해결하기 위해 Motion Warping을 사용할 것이다. 이는 캐릭터의 Root Motion을 특정 Target에 맞춰 변형할 수 있는 기능으로, 캐릭터가 특정 Target을 바라보도록 회전시키는 것이 가능하다.

 

이러한 기능을 사용하기 위해서는 플러그인에서 활성화를 해주고, 이후 캐릭터 블루 프린트에서 직접 MotionWarping을 추가한다.

 

이제 파이어볼 공격 Motage를 수정해야 한다. 해당 Motage는 Root Motion이 활성화된 애니메이션이므로 Motion Warping에 사용할 수 있다. 그리고 어느 구간을 Montion Warping할 것 인지 지정해주어야한다.

 

먼저 Notify Track을 추가하여 Events와 Moption Warping Track 이렇게 2개를 추가해주었다. 그리고 Motion Warping Track에서 마우스 우클릭으로 Notify State에서 Motion Warping을 선택하여 구간을 할당해준다.

 

추가로 Warp Target Name도 작성해주자. 이는 나중에 Warp Target을 설정할 때 동일한 이름을 사용해야한다는 것을 알아두어야 한다. 현재 캐릭터의 방향만 회전시키는 것을 원하기에 Translation은 비활성화해주고, Rotation Type은 Facing으로 지정한 Target을 바라보도록 하였다.

 

그리고 Motion Warping 컴포넌트를 활용하여 Warp Target 위치를 업데이트 하기위한 커스텀 함수를 만들어 준다.

 

이제 실제 위치는 Gameplay Ability에서 할당해준다. 이전에 사용했던 Projectile Target Location이 대상이다. Avatar Actor를 통해서 플레이어 블루프린트에 캐스팅 후, 직전에 만든 커스텀 함수를 통해 위치를 할당해준다.

 

이제 캐릭터 방향 또한 일치되는 모습을 볼 수 있다.

 

근데 지금 구조로는 파이어볼 Gameplay Ability가 특정 캐릭터에 의존하게 되는 구조이다. 따라서 유연성이 떨어지는 문제가 존재한다. 만약 Enemy도 별개로 파이어볼을 사용하도록 한다면 또 Enemy로 캐스팅을 해야하고 이에 따라 커스텀 함수도 다시 구현해야하는 문제가 발생한다.

 

따라서 이를 해결 하기 위해서 Combat Interface를 사용할 것이다. Ability가 특정 캐릭터 클래스를 알 필요 없이, 해당 Actor가 Combat Interface를 구현하고 있는가만 확인하도록 하는 것이다. 이러면 Combat Interface를 구현하고 있기만 하면 캐릭터든, 적이든 기타 전투 캐릭터든 동일한 Ability를 모두 사용할 수 있다. 

 

이때 blueprintImplementabeEvent로 C++에서 선언만 하고 실제 구현은 Blueprint에서 할 것이다. 기존에 커스텀함수로 가서 기존 내용을 지우고, 방금 만든 함수로 대체해주자.

 

근데 생각해보니 Gameplay Ability에서 Cast to Combat Interface가 보이지 않는다. 따라서 Interface에 Blueprint Type을 추가해주고, 또 함수를 호출할 수 있도록 UpdateFacingTraget 함수에 BlueprintCallable을 추가해주자.

 

이제 기존 캐스팅 내용을 인터페이스로 대체해주자. 노드 자체가 줄거나 한 것은 아니지만, 이제 특정 캐릭터에 의존하는 것이 아니라 같은 인터페이스에 해당한다면 누구나 사용이 가능하도록 유연성이 확장된 상태이다.