728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. 애니메이션 노티파이란?
  2. 애니메이션 노티파이 생성
  3. C++코드 작성

 

애니메이션 노티파이란?

 

애니메이션 노티파이 : Notify, 노티파이는 애니메이션 시퀀스에서 이벤트를 구성하고 받아 외부 동작을 수행하는 알림 시스템입니다.

 

애니메이션 프로그래머는 Animation Notification (애니메이션 노티파이), 또는 AnimNotify (애님 노티파이), 줄여서 그냥 Notify (노티파이)를 통해 애니메이션 시퀀스 도중의 특정 지점에 이벤트가 발생하도록 구성할 수 있습니다. 노티파이는 걷기나 달리기 도중의 발소리 같은 이펙트 추가 및 애니메이션 도중 파티클 시스템을 스폰시키는 데 주로 사용됩니다. 하지만 커스텀 노티파이 유형으로 시스템을 확장시켜 어떤 유형의 게임 요구에도 맞출 수 있기에 다른 식으로도 얼마든지 사용할 수 있습니다.

 

애니메이션 노티파이 | 언리얼 엔진 문서 (unrealengine.com)

 

애니메이션 노티파이

Notify, 노티파이는 애니메이션 시퀀스에서 이벤트를 구성하고 받아 외부 동작을 수행하는 알림 시스템입니다.

docs.unrealengine.com

 

예를 들어 플레이어가 걸어 다닐 때 랜덤으로 사운드를 작동시키는 것이 아니라 발걸음 애니메이션에 맞춰서 사운드를 작동시키면 더 자연스러울 것 같고, 칼을 휘두를 때 사운드 및 이펙트를 적절한 시점에 작동하는 게 자연스러운데 이때 트리거처럼 알람을 주는 개념인 노티파이를 사용한다.

 

애니메이션 노티파이 생성

 

노티파이를 생성하고 한번 사용해 보겠습니다.

 

노티파이 아래 라인에 마우스 우클릭을 하고 노티파이 추가 -> 새 노티파이를 클릭해서 노티파이를 생성해 줍니다.

 

 

노티파이 추가 -> 새 노티파이 클릭

이름은 AttackHit로 지어주겠습니다.

Ctrl +C , V를 해서 총 3개를 생성해 줍니다.

3개 생성하는 이유는 공격 애니메이션이 지금 3개이기 때문입니다.

 

그리고 칼이 적에게 적중하는 타이밍에 맞게 이벤트가 일어날 수 있도록 적당히 배치해 주었습니다.

 

애니메이션 타이밍을 보고 적당하게 노티파이를 배치

 

참고로 노티파이는 몽타주에만 있는 것이 아니라 애니메이션에도 노티파이가 있습니다.

 

애니메이션 섹션 나누기

 

지금 문제점은 애니메이션이 섹션이 하나라서 마우스 클릭을 하면 3개의 애니메이션을 한 번에 이어서 작동시킨다는 문제가 있습니다.

 

이것을 마우스 클릭할 때마다 1타, 2타, 3타 이런 식으로 작동할 수 있게 3개의 섹션으로 나누어주겠습니다.

 

섹션을 추가하는 방법은 몽타주 라인에 우클릭을 하면 새 몽타주 섹션이 뜹니다.

각각 이름은 Attack0, 1, 2으로 해주었고 세 개의 섹션이 링크가 이어져있어 여전히 애니메이션을 한 번에 실행시킵니다.

 

오른쪽에 몽타주 섹션창에서 섹션과 섹션사이 화살표를 좌클릭하고 모두 링크제거를 해줍니다.

 

2개의 섹션을 추가하고 애니메이션이 전환되는사이에 배치 그리고 섹션 제거

링크를 제거하면 3개의 섹션이 분리됩니다.

 

3개의 섹션이 링크 제거가 되어 분리된 모습

 

C++코드 작성

 

노티파이가 정상적으로 작동하는지 로그를 찍어서 확인해보겠습니다.

 

MyAnimInstance.h

private:
	UFUNCTION()
	void AnimNotify_AttackHit();​

AnimNotify_AttackHit라는 함수를 선언했는데 노티파이 함수의 이름은 마음대로 지어도 되는 것이 아니라 아까 생성한 노티파이 이름을 그대로 사용해야 합니다.

 

MyAnimInstance.cpp

void UMyAnimInstance::AnimNotify_AttackHit()
{
	UE_LOG(LogTemp, Log, TEXT("Animation_AttackHit"));
}

 

언리얼 에디터로 돌아와 컴파일 후 실행해서 공격을 해보면 노티파이를 배치한 타이밍에 맞춰서 Log가 찍히는것을 확인할 수 있습니다.

 

이제 공격할 때마다 1타 2타 3타 구분을 하기위해 변수 하나를 선언해주고 공격할때마다 1씩 증가하도록 해주겠습니다.

 

MyCharacter.h

private:
	UPROPERTY()
	int32 AttackIndex = 0;

 

MyCharacter.cpp

void AMyCharacter::Attack()
{
....
	AttackIndex = (AttackIndex + 1) % 3; //3이되면 3%3 = 0으로 다시 0,1,2 루프
....
}

 

그리고 Index만 증가시키는 것은 의미 없고 Section의 정보도 받아와서 이를 수정해야 합니다.

 

MyAnimInstance.h

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));
}

 

GetAttackMontageName 함수는 SectionIndex로 0, 1, 2를 받으면 "Attack0", "Attack1", "Attack2"를 반환합니다.

 

JumpToSection 함수는 Index를 GetAttackMontageName에 전달해서 FName으로 섹션의 이름을 받은 뒤, 해당 섹션으로 이동합니다.

 

JumpToSection이라는 함수는 구현했으니 이제 

 

 

 

이제 아까 추가한 AttackIndex 코드 위에서 JumpToSection 함수를 호출해 줍니다.

 

MyCharacter.cpp

void AMyCharacter::Attack()
{
....
	AnimInstance->JumpToSection(AttackIndex);
	AttackIndex = (AttackIndex + 1) % 3; //3이되면 3%3 = 0으로 다시 0,1,2 루프
....
}

 

이제 컴파일 후 게임 실행하면

 

이전에는 한번 클릭하면 1,2,3타 동시에 나갔음

 1, 2, 3타 분리되어 나가는 것을 볼 수 있습니다.

 

아직 노티파이를 이용해서 이펙트나 사운드는 적용하지않았지만
로그를 이용해서 작동하는것을 확인할 수 있었습니다.

여기까지 노티파이를 사용한 애니메이션 이었습니다.

728x90

+ Recent posts