애니메이션 재생중 특정 시점이 되었을 때 코드에 알람(노티파이)을 주는 개념

애니메이션, 몽타주 둘다 설정 가능하다. 유니티에도 거의 동일한 기능이 있다.

 

 

노티파이 설정

 

// MyAnimInstance.h
class TESTUNREALENGINE_API UMyAnimInstance : public UAnimInstance
{
	GENERATED_BODY()

private:
	UFUNCTION()
	void AnimNotify_AttackHit();
}

// -------

// MyAnimInstance.cpp
void UMyAnimInstance::AnimNotify_AttackHit()
{
	UE_LOG(LogTemp, Log, TEXT("AnimNotify_AttackHit"));
}

 

코드에서도 추가해 주는데 메소드명을 막 짓는것이 아니라 AnimNotify_"노티파이명" 으로 지정해 주어야 한다.

 

 

 

실행 후 공격 시 애니메이션의 노티파이 때마다 한 번씩 호출되는 것을 확인할 수 있다.

 

 

 

 

 

 

지금까지는 한번의 공격으로 평타 세번이 연속해서 나갔지만 각각의 모션을 끊어서 재생하고 싶다면 몽타주 섹션으로 구분하고 링크를 끊어주면 된다. 최상단이 몽타주 섹션이고 우클릭으로 추가할 수 있다.

 

// MyAnimInstance.h
class TESTUNREALENGINE_API UMyAnimInstance : public UAnimInstance
{
// .. 생략
public:
	void JumpToSection(int32 SectionIndex);

	FName GetAttackMontageName(int32 SectionIndex);
};

// ----------

// MyAnimInstance.cpp
void UMyAnimInstance::JumpToSection(int32 SectionIndex)
{
	FName Name = GetAttackMontageName(SectionIndex); // 섹션 이름 변환
	Montage_JumpToSection(Name, AttackMontage); // 해당 섹션 재생
}

FName UMyAnimInstance::GetAttackMontageName(int32 SectionIndex)
{
	// 언리얼에서 사용하는 이름 타입이라고 생각됨
	return FName(*FString::Printf(TEXT("Attack%d"), SectionIndex));
}

// ---------

// MyCharacter.h

// ---------

// MyCharacter.cpp
void AMyCharacter::Attack()
{
	if (IsAttacking)
		return;

	AnimInstance->PlayAttackMontage();

	AnimInstance->JumpToSection(AttackIndex); // 공격시마다 0, 1, 2, 0.. 을 넘겨줌
	AttackIndex = (AttackIndex + 1) % 3;

	IsAttacking = true;
}

 

구분된 섹션을 코드로 제어할 수 있다.

+ Recent posts