Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

앞에서는 애니메이션 몽타주의 Montage_IsPlaying() 함수를 이용해 공격 모션 중인지 확인했다.

 

이번에는 델리게이트를 활용하여 게임 로직과 애니메이션의 처리를 분리해 더 효과적으로 공격 기능을 구현해보겠다.

 

델리게이트

특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 하는 보편적인 설계의 개념이다.
A 객체가 B 객체에 명령을 내릴 때, B 객체에 자신을 등록하고 B의 작업이 끝나면 A에게 다시 알린다.

 

언리얼에서는 C++에서만 사용할 수 있는 델리게이트와 C++과 BP에서 사용할 수 있는 델리게이트 두 종류가 있다.

  • BP 오브젝트에는 멤버 함수에 대한 정보를 저장하고 로딩하는 직렬화(Serialization) 매커니즘이 들어있기 때문에 C++ 전용 함수는 사용할 수 없어 UFUNCTION() 매크로를 지정해야 한다.
  • BP 객체와도 연동하는 델리게이트를 특히 다이나믹 델리게이트(Dynamic Delegate)라고 한다.

 

이미 언리얼 언리얼 엔진에서 제공하는 델리게이트 말고 사용자 정의 델리게이트도 만들 수 있다.

  • DECLARE_DYNAMIC_DELEGATE_000Params(FDynamicDelegate, Type1, Name1, Type2, Name2, ...)를 사용해 다이나믹 델리게이트를 선언하는 것은 Type1 Name1, Type2 Name2, ... 등 총 000개의 인자를 받는 받는 BP와 호환되는 FDynamicDelegate 타입의 다이나믹 델리게이트를 선언한다는 뜻이다.
  • DECLARE_DELEGATE_000Params(FDelegate, Type1 Name1, Type2 Name2, ...)를 사용해 델리게이트를 선언하는 것은 Type1 Name1, Type2 Name2, ... 등 총 000개의 인자를 받는 받는 FDelegate 타입의 델리게이트를 선언한다는 뜻이다.
  • 델리게이트 자료형 선언 형식에서 인자를 지정할 때 콤마(,) 구분에 미세한 차이가 있다.

 

 

PostInitializeComponents() 함수에서 애니메이션 몽타주의 재생이 끝났을 때 실행될 델리게이트를 등록한다.

 

 

애니메이션 몽타주는 재생이 끝나면 OnMontageEnded(UAnimMontage* Montage, bool bInterrupt) 델리게이트를 발동한다.

 

델리게이트로 등록하기 위해서는 이름은 달라도 상관 없지만 함수의 시그니처(매개변수의 개수와 타입)는 꼭 같아야 한다.

  • OnMontageEnded 델리게이트는 BP 함수와도 연동할 수 있도록 설계돼 있으므로 UFUNCTION() 매크로를 지정해줘야 한다.

 

애님 인스턴스는 앞으로도 자주 사용할 예정이므로 변수로 선언했다.

 

 

생성자에서 IsAttacking 변수의 기본값을 설정한다.

 

 

AnimInstance->OnMontageEnded.AddDynamic() 함수로 몽타주 재생이 끝났을 때 발동될 델리게이트를 등록한다.

  • OnMontageEnded()는 멀티캐스트 델리게이트(Multicast Delegate)로서 하나 이상의 델리게이트를 등록할 수 있고 재생이 끝났을 때 등록된 모든 함수들 발동하는 기능도 제공한다.
  • 결과적으로 BP에서 사용할 수 있는 다이나믹 멀티캐스트 델리게이트이다.

 

 

몽타주 재생이 끝나면 IsAttacking 변수는 델리게이트에 의해 false가 된다.

 

 

공격 함수에서는 몽타주를 재생하고 IsAttacking 변수를 true로 만든다.

 

 

이제 애님 인스턴스가 아니라 게임 로직에서 IsAttacking 변수와 델리게이트를 통해 공격 중인지 확인하므로 Montage_IsPlaying() 함수는 사용하지 않아도 된다.

 

'Unreal Engine > 이득우의 언리얼 C++ 게임 개발의 정석' 카테고리의 다른 글

콤보 공격 구현  (0) 2023.03.08
애니메이션 노티파이  (0) 2023.03.07
애니메이션 몽타주  (0) 2023.03.07
애니메이션 상태 머신  (0) 2023.03.06
애니메이션 리타겟  (0) 2023.03.06
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그