Unreal

[UE5/언리얼엔진5] 애니메이션 몽타주 랜덤 재생 / How to Play Animation Montage Randomly C++

건전한 건전지 2023. 7. 10. 23:55
728x90
반응형

오늘은 애니메이션 몽타주를 C++로 랜덤하게 플레이 하는 방법을 알아보자.
 

애니메이션 몽타주 생성

애니메이션 몽타주를 생성하고 몽타주 섹션의 이름을 순서대로 작성해주자.

 

C++ 코드 작성

 
해당 애니메이션 몽타주의 섹션 개수를 가져오기 위해 CompositeSections.Num()을 사용해야한다.

-- EnemyCharacter.cpp --

void AEnemyCharacter::PlayAnimation(UAnimMontage* AnimMontage)
{
	if(UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance())
	{
		int32 JumpSection = FMath::RandRange(1, AnimMontage->CompositeSections.Num());
		FName SectionName = FName(*FString::Printf(TEXT("%d"), JumpSection));
		AnimInstance->Montage_Play(AnimMontage);
		AnimInstance->Montage_JumpToSection(SectionName);
	}
}
int32 JumpSection = FMath::RandRange(1, AnimMontage->CompositeSections.Num());

현재 플레이 할 AnimMontage의 Section 개수를 가져와서 1~MAX사이의 랜덤 값을 뽑아준다.
위에서 설정할 애니메이션 중 N번째 항목으로 점프하기 위함이다.

FName SectionName = FName(*FString::Printf(TEXT("%d"), JumpSection));

Montage_JumpToSection() 함수는 FName을 인자로 필요로 하기 때문에 정수를 FName으로 변환해주자.
 
 

-- EnemyCharacter.h --

UPROPERTY(EditAnywhere, Category = Custom, meta = (AllowPrivateAccess = "true"))
UAnimMontage* DeathAnimMontage;

UPROPERTY(EditAnywhere, Category = Custom, meta = (AllowPrivateAccess = "true"))
UAnimMontage* HitAnimMontage;

 
위처럼 헤더파일에 애니메이션 몽타주별로 선언해놓고 어떤 행동을 실행할 때 PlayAnimation에 해당 애니메이션 몽타주를 인자로 넘겨주어 사용하면 된다.
 
 
 
ex) 

 공격을 받았을 때 피가 0 이하이면 사망하는 부분을 작성한 코드
if(Health <= 0.f && !bIsDead)
	{
		SetState(EEnemyState::Dead);
		PlayAnimation(DeathAnimMontage);
		bIsDead = true;
		StopMovement();
		GetWorldTimerManager().SetTimer(DestroyTimer, this, &AEnemyCharacter::TempFunc, 1.4f);
	}

 
 
핵심 코드는 이 한 줄이다.
AnimMontage->CompositeSections.Num()

728x90
반응형