언리얼 C++ 프로그래밍

[언리얼 C++] 멀티캐스트 델리게이트

언린이 2021. 7. 1. 16:24

언리얼 엔진에서 멀티캐스트 델리게이트는 여러 함수를 바인딩시켜 바인딩된 모든 함수들을 동시에 실행시킬 수 있는 델리게이트입니다.

 

멀티캐스트 델리게이트는 싱글캐스트 델리게이트의 기능 대부분을 가지고 있습니다.

- 오브젝트로의 약참조만 가지고 있습니다.

- 구조체와 함께 사용이 가능합니다.

- 쉽게 복사할 수 있습니다.

- 로드/세이브가 가능하며 원격으로 트리거됩니다.

 

하지만 멀티캐스트 델리게이트는 보통의 델리게이트와 다른 점이 있습니다.

멀티캐스트 델리게이트의 함수 시그너처에서는 반환값을 사용할 수 없습니다. 그러므로 멀티캐스트 델리게이트에 바인딩시킬 함수들은 모두 void로 선언되어져야 합니다.

 

 

1. 멀티캐스트 델리게이트 선언하기

DECLARE_MULTICAST_DELEGATE(FMultiDele) // 멀티캐스트 델리게이트 선언

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDynamicMultiDele) // 다이내믹 멀티캐스트 델리게이트 선언

위의 예제 코드의 매크로를 사용하여 멀티캐스트 델리게이트를 선언할 수 있습니다.

다이내믹 멀티캐스트 델리게이트는 다이내믹 델리게이트의 성질 또한 가지는 델리게이트입니다. 이에 대해 자세히 알고 싶으시다면, [언리얼 C++] 다이내믹 델리게이트 (tistory.com) 글을 참고하시기 바랍니다.

 

 

2. 멀티캐스트 델리게이트 바인딩하기

함수 설명
Add() 멀티캐스트 델리게이트의 실행 목록에 함수 델리게이트를 추가합니다.
AddStatic() raw C++ 포인터 글로벌 함수 델리게이트를 추가합니다.
AddRaw() raw C++ 포인터 델리게이트를 추가합니다.
raw 포인터는 어떠한 레퍼런스도 사용하지 않기에, 오브젝트가 자신의 델리게이트 하에서 삭제된 경우 호출시 안전하지 않을 수 있습니다.
AddSP() 공유 포인터 기반 (빠르지만 스레드 안전성은 떨어지는) 멤버 함수 델리게이트를 추가합니다. 공유 포인터 델리게이트는 자신의 오브젝트에 대한 약 레퍼런스를 유지합니다.
AddUObject() UObject 기반 멤버 함수 델리게이트를 추가합니다. UObject 델리게이트는 자신의 오브젝트에 대한 약 레퍼런스를 유지합니다.
Remove() 멀티캐스트 델리게이트의 실행 목록에서 함수를 제거합니다. 참고로 델리게이트 순서는 유지되지 않을 수 있습니다!
RemoveAll() 지정된 UserObject에 바인딩된 멀티캐스트 델리게이트의 실행 목록의 모든 함수를 제거합니다.

위의 함수들은 언리얼 엔진에서 제공하는 멀티캐스트 델리게이트 바인딩 함수입니다.

해당 함수들을 사용하여 멀티캐스트 델리게이트에 여러 함수들을 바인딩할 수 있습니다.

RemoveAll() 함수는 제공된 포인터에 바인딩된 모든 함수들을 제거합니다. 하지만 오브젝트 포인터에 바인딩되지 않은 raw 델리게이트는 이 함수로 제거되지 않습니다.

 

DECLARE_MULTICAST_DELEGATE(FMultiDele)

UCLASS()
class TestProject_API ASampleActor : public AActor
{
	GENERATED_BODY()
    
public :
	FMultiDele OnAttackStartDelegate;
};

액터 클래스를 상속받은 클래스에서 공격을 시작했을때 호출될 멀티캐스트 델리게이트를 선언해주었습니다.

 

USampleAnim::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();
    
    ASampleActor* pActor = Cast<ASampleActor>(TryGetPawnOwner());
    
    pActor->OnAttackStartDelegate.AddUObject(this, &USampleAnim::PlayerAttackStart);
    pActor->OnAttackStartDelegate.AddUObject(this, &USampleAnim::PlayerAttackMotion);
    pActor->OnAttackStartDelegate.AddUObject(this, &USampleAnim::PlayerUpdateStat);
}

그리고 AddUObject() 함수를 사용하여 선언해준 델리게이트에 여러 함수들을 바인딩해주었습니다.

이제 해당 델리게이트의 실행 함수를 호출하면 바인딩된 모든 함수들이 실행될 것입니다.

 

 

3. 멀티캐스트 델리게이트 실행하기

함수 설명
Broadcast() 델리게이트를 만료되었을 수도 있는 것을 제외하고, 바인딩된 모든 오브젝트에 뿌립니다.

멀티캐스트 델리게이트는 Broadcast() 함수를 호출하여 바인딩된 모든 함수들을 동시에 실행시킬 수 있습니다.

Broadcast() 함수를 사용한 호출은 멀티캐스트 델리게이트에 바인딩된 함수가 존재하지 않더라도 항상 안전합니다.

그리고 Broadcast() 함수 호출시 바인딩된 함수들의 실행 순서는 정의되지 않습니다. 런타임에 함수가 바인딩된 순서대로 실행되지 않을 수가 있으니 유의하셔야 합니다.

 

pActor->OnAttackStartDelegate.Broadcast();

위 예제 코드처럼 멀티캐스트 델리게이트의 Broadcast() 함수를 호출만 해주면 바인딩된 모든 함수들이 실행될 것입니다.

 

 

이렇게 멀티캐스트 델리게이트를 사용하는 방법에 대해 알아보았습니다.

멀티캐스트 델리게이트의 함수 시그너처에는 반환값을 사용할 수 없다는 단점이 있지만, 하나의 델리게이트로 여러 함수들을 동시에 실행시킬 수 있다는 장점이 있기 때문에 효율적으로 사용한다면 쉽고 간편하게 여러가지 기능들을 구현할 수 있을 것입니다.