게임 개발/Unreal Engine

[UE5] 모션 워핑으로 회전과 대시 구현

지노윈 2022. 3. 14. 23:22
반응형

모션 워핑

Motion Warping은 UE5의 실험 단계 기능으로 제공되고 있으며 루트 모션을 동적으로 타킷 정렬 할 수 있게 해줍니다. 쉽게 말해서, 캐릭터를 원하는 타이밍 구간에 원하는 위치와 방향으로 캐릭터를 이동시킬 수 있습니다.

캐릭터의 루트를 직접 이동시키는 방법이 아니며 루트 모션 애니메이션을 보간하여 캐릭터를 이동시키는 방식입니다.

 

모션 워핑 플러그인을 활성화해야 합니다. 언리얼 에디터 메뉴 바의 편집(Edit) > 플러그인(Plugins) 에서 내장 플러그인(Built-In) > 애니메이션(Animation) > 모션 워핑(Motion Warping) 으로 이동합니다. 플러그인을 활성화하고 에디터를 재시작합니다. (현재는 아직 실험단계 기능으로 제공 되고 있습니다.) 자세한 내요은 아래 링크를 참고해 주세요.

https://docs.unrealengine.com/5.0/ko/AnimationFeatures/MotionWarping/

 

모션 워핑

모션 워핑으로 캐릭터 애니메이션을 특정 지점에 동기화하세요.

docs.unrealengine.com

구현에서 핵심이 되는 코드는 다음의 코드 입니다.

이동 입력이 없는 경우에는 모션 워핑을 하지 않고 입력이 있는 경우에는 이동 입력 벡터 방향으로 회전과 이동을 하 하도록 합니다.

const FVector MovementInputVector = GetLastMovementInputVector();
if (MovementInputVector.IsZero())
{
	MotionWarpComp->RemoveWarpTarget(TEXT("Warp"));
	return;
}

const FVector PlayerLoc = GetActorLocation();
const FVector TargetLoc = (MovementInputVector.GetSafeNormal() * FowardDistance) + PlayerLoc;
const FRotator TargetRotator = UKismetMathLibrary::MakeRotFromX(MovementInputVector);

MotionWarpComp->AddOrUpdateWarpTargetFromLocationAndRotation(TEXT("Warp"), TargetLoc, TargetRotator);

애님 그래프에서 Montion Warping 노티파이 스테이트를 추가합니다.

어색하지 않게 하려면 발의 위치에 따라서 회전을 시키는 구간과 이동을 시키는 구간을 각각 설정해야 겠습니다.

Warp Target Name이 위 소스 코드에서와 동일하게 "Warp"로 설정 하였다는 것을 주목해 주세요.

다음 Motion Warping 설정은  Warp Translation을 비활성화 하여 회전만 하도록 하였습니다.

이번 Motion Warping 설정은  Warp Rotation을 비활성화 하여 이동만 하도록 하였습니다.

회전과 대시에 해당하는 MotionWarping을 설정하였습니다. 두 발이 모두 지면에 있을 때, Warp Translation이나 Warp Rotation 구간으로 설정하면 미끄러져 보이니 애니메이션 마다 적절한 구간을 설정해야 겠습니다.

 

참고
https://www.youtube.com/watch?v=nxzfJcwyj1Y&t=856s