Unreal - 모션매칭(Motion Matching) - 스키마 데이터 관리하기 (점프,달리기)

2025. 8. 15. 22:49·Unreal 프로젝트 다이어리/두번째 프로젝트

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
'Unreal 프로젝트 다이어리/두번째 프로젝트' 카테고리의 다른 글
  • Unreal - Layered Per Bone (상 하체 애니메이션 분리)
  • Unreal - Foot IK
  • Unreal - 모션매칭(Motion Matching) - 기본이동 구현하기
  • Unreal - 캐릭터 기본 인풋 설정하기
lucodev
lucodev
커피와 노트북 그리고 개발
  • lucodev
    루코 개발테이블
    lucodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (209) N
      • Unreal 프로젝트 다이어리 (106) N
        • 첫번째 프로젝트 (73)
        • 두번째 프로젝트 (33) N
      • Unreal 팁 (8)
      • Unreal 디버깅 (8)
      • C++ 프로그래머스 (52)
        • Stack,Queue (7)
        • Hash (4)
        • Heap (2)
        • Sort (5)
        • Exhaustive search (5)
        • Greedy (2)
        • BFS , DFS (7)
        • Graph (2)
        • Dynamic Programming (1)
        • C++ Math (2)
        • 기타 문제 (14)
      • C++ 백준 (4)
      • C++ 팁 (1)
      • 개인 코테 & 스타디 <비공개> (29)
        • 코드 개인보관함 (9)
        • 코딩테스트+@ (11)
        • 알고리즘 스타디 (6)
        • 알고리즘 스타디 과제 (3)
        • 비공개 (0)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 링크

  • 공지사항

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 태그

    unreal inventory
    unreal 파쿠르
    언리얼 시퀀스
    언리얼
    언리얼 behavior tree
    언리얼 파쿠르
    언리얼 프로그래스바
    Unreal Parkour
    언리얼 motionmatching
    언리얼 ui
    언리얼 비헤이비어트리
    언리얼 parkour
    언리얼 컷씬
    unreal 모션매칭
    언리얼 모션매칭
    unreal 인벤토리
    언리얼 인벤토리
    언리얼 behaviortree
    언리얼 상호작용
    unreal 시퀀스
  • hELLO· Designed By정상우.v4.10.3
lucodev
Unreal - 모션매칭(Motion Matching) - 스키마 데이터 관리하기 (점프,달리기)
상단으로

티스토리툴바