[UE5] Motion Warping - 모션 워핑
진행하고 있는 프로젝트에서 캐릭터가 공격하는 방향으로 이동하거나, 적을 타겟팅 하기 위한 방법을 알아보다가 찾게 된 Motion Warping(모션 워핑)에 대해 소개하려 한다.
모션 워핑은 캐릭터의 루트 모션을 타겟을 향해 조정하는 기능으로 Animation Montage에서 AnimNotify State를 설정하여 쉽게 세팅할 수 있다.
우선 Motion Warping(Beta) 플러그인을 설치한다.
에디터를 재시작하여 플러그인을 적용한 후 모션 워핑을 적용할 액터에 Motion Warping 컴포넌트를 추가할 수 있다.
코드에서 명칭은 UMotionWarpingComponent, 헤더는 #include "MotionWarpingComponent.h" 를 포함하면 된다.
// Header
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = MotionWarping, meta = (AllowPrivateAccess = "true"))
class UMotionWarpingComponent* MotionWarpingComponent;
// CPP
#include "MotionWarpingComponent.h"
// Constructor
MotionWarpingComponent = CreateDefaultSubobject<UMotionWarpingComponent>(TEXT("MotionWarping"));
이후 모션 워핑을 적용할 Animation Montage에서 Add Notify State를 클릭하면 아래와 같이 Motion Warping State를 확인할 수 있다.
Motion Warping State를 추가하고 캐릭터의 루트모션을 워핑시킬 구간을 설정한다.
공격을 시작하기 위해 발을 들어 올리는 시점에서 무기로 베기 공격을 완료한 시점까지 Motion Warping을 적용시켰다.
MotionWarping State를 클릭하여 Detail 탭을 확인해 보자.
Root Motion Modifier는 Skew Warp로 설정하여 루트모션의 Translation, Rotation을 수정할 수 있도록 하고, Warp Target Name은 워프 대상의 이름으로 우선 Forward로 입력하고 아래에서 C++ 코드를 설명할 때 다시 이야기하겠다.
Warp Translation을 체크하여 루트 모션의 Location이 변경 가능하도록 하였고 Z 축은 무시하도록 하였다.
Mode에서는 아래와 같이 시간에 따른 워핑을 그래프로 설정할 수 있다.
Warp Roation은 Rotation을 적용할지 여부로 체크하겠다.
이제 코드에서 워핑을 정의하자. 캐릭터 GetMotionWarpingComponent()로 위에서 캐릭터에 추가한 모션 워핑 컴포넌트를 가져와서 AddOrUpdateWarpTargetFromLocationAndRotation으로 Location과 Rotation을 설정해 보자.
Component를 기준으로 워핑 Transform을 설정할 수도 있고 Location만 넣을 수도 있는 다양한 함수가 준비되어 있다.
GetMotionWarpingComponent()->AddOrUpdateWarpTargetFromLocationAndRotation(
FName("Forward"), GetActorLocation() + GetActorForwardVector() * LightAttackWarpDistance,
GetActorRotation());
AnimInstance->Montage_Play(LightAttackMontages[AttackIndex]);
여기에서 위에서 말한 Warp Target Name을 FName 자료형으로 입력하여야 한다. 테스트를 위해 Forward를 입력하고
워핑 Location으로는 캐릭터의 현재 위치 + 캐릭터의 전방으로 1000 만큼을 주었고, Rotation은 현재 Rotation을 유지하도록 하였다.
현재 액터의 정보를 활용하기 때문에 해당하는 애니메이션 몽타주를 Play 하기 직전에 WarpTarget을 설정하였다.
만약 Target이 설정되어 있지 않거나 WarpTargetName이 일치하지 않으면 아래와 같이 모션 워핑이 적용되지 않는다.
이제 TargetName을 Forward로 설정한 뒤 공격 애니메이션을 보자. (총 4번의 콤보 공격 Montage에 모두 모션 워핑을 적용한 모습이다)
이번엔 레벨에 액터를 배치한 뒤 각 공격 Montage에 하나씩 액터의 Transform을 Target으로 주었다.
Physics를 적용한 액터를 모션 워핑의 Target으로 설정하면 공격을 받으면서 뒤로 밀리거나 공중에 뜬 액터를 따라가는 모션을 만들 수 있으며 레벨에 배치된 적 액터 배열을 가져와서 일정 거리 안에 있는 액터를 모두 공격하는 모션을 만들 수도 있는 활용도가 매우 높은 기능이라고 생각한다.
Reference
[0] https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-warping-in-unreal-engine