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
반응형
'Unreal' 카테고리의 다른 글
| [UE5/언리얼 엔진5] 언리얼엔진 문자열 변환 정리 - 정리 중... (0) | 2023.07.25 |
|---|---|
| [UE5/언리얼엔진5] 블루프린트에서 드롭다운 메뉴, 탭 선택 안됨, 목록 선택 불가능 (0) | 2023.07.14 |
| [UE5/언리얼 엔진5] 피직스 시뮬레이트 활성화 불가능, 오브젝트 콜리전 (0) | 2023.07.06 |
| [UE5/언리얼 엔진5] UTexture2D를 UImage로 변환하기 (0) | 2023.06.22 |
| [UE5/언리얼 엔진5] IK Retargeting 이후 타겟 애니메이션 이동, 캐릭터 흔들림, 애니메이션 오류, 루트모션 에러 (0) | 2023.06.03 |