1편과 이어집니다
2025.08.09 - [Unreal5 프로젝트 다이어리2] - Unreal - 모션매칭(Motion Matching) - 기본이동 구현하기
Unreal - 모션매칭(Motion Matching) - 기본이동 구현하기
Motion Trajectory플러그인을 설치해줍니다 설치후 포즈 서치 스키마와 포즈 서치 데이터베이스를 만들어줍니다 사용할 리타게팅한 애니메이션을 프로퍼티매트릭스 선택 편집 클릭해줍니다 사용할
lucodev.tistory.com
모션매칭의 포즈 서치 스키마를 데이터별로 원하는 조건에 원하는 스키마로 변경할수있습니다
shitft를 눌렀을때 달리기 스페이스바를 누르면 점프 하는 스키마로변경되도록 해보겠습니다
캐릭터한테 trajectoryComponent를 달아주겠습니다
build.cs 에 모듈을 먼저 설치합니다
"MotionTrajectory"
.h에 trajectoryComponent를 선언해준뒤 생성자에서 캐릭터한테 컴포넌트를 달아줍니다
UPROPERTY(EditAnywhere, Category = "MotionMaching")
class UCharacterTrajectoryComponent* characterTrajectory;
characterTrajectory = CreateDefaultSubobject<UCharacterTrajectoryComponent>(TEXT("CharacterTrajectory"));
캐릭터 인스턴스에서 캐릭터의 trajectoryComponent 복사할 동일 trajectoryComponent를 다시 선언해줍니다
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MotionMatching")
class UCharacterTrajectoryComponent* characterTrajectory;
애님 인스턴스에서 사용할 NativeInitializeAnimation이나 ThreadSafeUpdateAnimation을 override와 선언해줍니다
public:
virtual void NativeInitializeAnimation() override;
virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds);
애님인스턴스에서 캐릭터의 trajectory를 복사해줍니다
void UMainCharacterAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
APawn* myPawn = TryGetPawnOwner();
if (myPawn)
{
AMainCharacter* mainCharacter = Cast<AMainCharacter>(myPawn);
if (mainCharacter)
{
characterTrajectory = mainCharacter->characterTrajectory;
}
}
}
Pose History에 복사한 trajectory를 바인딩해줍니다

모션매칭의 함수에서 업데이트시 함수를 추가해주겠습니다

모션매칭의 결과 데이터베이스를 Interrupt on DataBase Change로 변경해주고 해당 노드와 같이
바인드해줍니다

선택기 테이블을 사용하기위해 Chooser 플러그인을 설치해줍니다

기타 -> 선택기 테이블을 선택하여 나의

선택기 테이블을 만들고 나의 애님블루프린트와 연동
출력오브젝트 타입을 PoseSearchDatabase로 설정해줍니다

캐릭터의 walkSpeed와 jump의 분기로 스키마값을 변동해보겠습니다
WalkSpeed의 경우
캐릭터의 .h에 먼저 필요한 변수와 함수를 선언
//dash
UFUNCTION()
void WalkSpeedCheck();
UPROPERTY(EditAnywhere, Category="MotionMatching")
float runSpeed = 600.0f;
UPROPERTY(EditAnywhere, Category = "MotionMatching")
float walkSpeed = 200.0f;
UPROPERTY()
bool bIsRun;
tick함수에서 돌아갈 WalkSpeedCheck함수를 구성해줍니다
void AMainCharacter::WalkSpeedCheck()
{
if (bIsRun)
{
GetCharacterMovement()->MaxWalkSpeed = runSpeed;
}
else
{
GetCharacterMovement()->MaxWalkSpeed = walkSpeed;
}
}
애님인스턴스에서 캐릭터의 bIsRun 이름의 bool 변수값을 복사해줍니다
void UMainCharacterAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
APawn* myPawn = TryGetPawnOwner();
if (myPawn)
{
AMainCharacter* mainCharacter = Cast<AMainCharacter>(myPawn);
if (mainCharacter)
{
bIsRun = mainCharacter->bIsRun;
characterTrajectory = mainCharacter->characterTrajectory;
}
}
}
선택기 테이블에서 Walk 애니메이션 데이터만 들어있는 포즈 서치 데이터 스키마를 넣어주고
Run 애니메이션 데이터만 들어있는 포즈서치 데이터 스키마를 추가해준뒤
복사한 애님인스턴스의 bIsRun변수로 조건을 나누어줍니다

선택기 테이블의 조건에 따라 shift를 누르게되면 변수가 바뀌며 사용하고있는 스키마 데이터가 변경되는것을 확인할수있습니다

위와같이 캐릭터에서 스키마 조건을 변경할 조건을 만든뒤
애님인스턴스에서 그 변경할 조건의 변수값을 복사
선택기 테이블에서 애님인스턴스에서 복사되어있는값으로 선택기테이블에서 조건으로 포즈 서치 데이터를 나누어주시면됩니다
이와 같은 방법으로 점프도 구현하여주었습니다
점프또한 분기를 나누어서 점프시작, 점프중, 가벼운착지, 무거운 착지 분기로 나누어서
enumclass로 구현하였습니다

enum으로 분류하였습니다
UENUM(BlueprintType)
enum class EJumpState : uint8
{
jumpStart UMETA(DisplayName = "JumpStart"),
inTheAir UMETA(DisplayName = "InTheAir"),
landingLight UMETA(DisplayName = "LandingLight"),
landingHeavy UMETA(DisplayName = "LandingHeavy"),
notJump UMETA(DisplayName = "NotJump")
};
--기록용--
(비공개)
점프 시작(JumpStart), 점프 중(JumpingInAir), 가벼운 착지(LandingLight), 무거운 착지(LandingHeavy) 조건체크함수
단차 체크함수
2025.08.15 - [코드 개인보관함] - 모션매칭 JumpEnum 함수
모션매칭 JumpEnum 함수
lucodev.tistory.com
--
무거운 착지

가벼운 착지

좌우 점프 움직임

'Unreal 프로젝트 다이어리 > 두번째 프로젝트' 카테고리의 다른 글
| Unreal - 무기 Draw (0) | 2025.08.19 |
|---|---|
| Unreal - Layered Per Bone (상 하체 애니메이션 분리) (0) | 2025.08.17 |
| Unreal - Foot IK (0) | 2025.08.17 |
| Unreal - 모션매칭(Motion Matching) - 기본이동 구현하기 (0) | 2025.08.09 |
| Unreal - 캐릭터 기본 인풋 설정하기 (0) | 2025.08.08 |
