카테고리 없음

UE4 C++ Delegate 비교(Single cast,Multi cast, Event,Dynamic)

Arq.Dev5igner 2024. 6. 1. 21:40

 

싱글 케스트
Single cast
가장 기본적인 Delegate로 함수 1개를 바인딩
멀티 케스트
Multi cast
싱글 케스트와 동일하지만 여러 함수를 바인딩.
이벤트
Event
멀티 케스트와 동일하지만 전역으로 설정할 수 없어 외부 클래스에서 추가 델리게이트 선언이 불가능
다이나믹
Dynamic
다이나믹은 싱글과, 멀티 두개다 존재.
다이나믹 델리게이트는 직렬화(Serialize)화 되어 블루프린트에서 사용 가능.

 

싱글  케스트(Single cast) 와 멀티 케스트(Multi cast)

멀티케스트는 싱글케스트와 달리 함수를 여러개 바인드 할 수 있다.

또한 Unbind 대신 Clear을 쓰며 Execute 대신 Broadcast를 쓴다.

멀티캐스트를 이용하여 함수를 사용하는 부분에서는  BindUFunction 대신 AddUFunction 를 쓴다.

//! ABoom.h

//! SingleCast
DECLARE_DELEGATE(FDele_Single); 
DECLARE_DELEGATE_OneParam(FDele_Single_OneParam, int32);

//! MultiCast
DECLARE_MULTICAST_DELEGATE(FDele_Multi);
DECLARE_MULTICAST_DELEGATE_OneParam(FDele_Multi_OneParam, int32);

UCLASS()
class DELEGATETEST_API ABoom : public AActor
{
	GENERATED_BODY()
public :
	//! SingleCast
    FDele_Single Dele_Single;
    FDele_Single_OneParam Dele_Single_OnePara;

	//! MultiCast
	FDele_Multi Dele_Multi;
	FDele_Multi_OneParam Dele_Multi_OneParam;
};



//! ABoom.cpp
void ABoom::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason);
	
    //! 델리게이트 해제    
    Dele_Single.Unbind();
    Dele_Single_OnePara.Unbind();
    
	Dele_Multi.Clear();
	Dele_Multi_OneParam.Clear();
}

void ABoom::Tick_Boom(float DeltaTime)
{
		//! Delegate호출하는 부분
        if(Dele_Single.IsBound()==true) Dele_Single.Execute();
        if(Dele_Single_OnePara.IsBound() == true) Dele_Single_OnePara.Execute(123);
        
		if(Dele_Multi.IsBound() == true) Dele_Multi.Broadcast();
		if(Dele_Multi_OneParam.IsBound() == true) Dele_Multi_OneParam.Broadcast(456);
}

//! ATestPlayer.h
UCLASS()
class DELEGATETEST_API ATestPlayer : public AActor
{
	GENERATED_BODY()
public:	
	//! Delegate에 의해 호출될 함수
	UFUNCTION()	void CallDeleFunc_Single();
	UFUNCTION()	void CallDeleFunc_Single_OneParam(int32 nValue);
};

//! ATestPlayer.cpp
void ATestPlayer::BeginPlay()
{
	Super::BeginPlay();
    
//Delegate가 세팅된 ABoom 클래스에 ATestPlayer클래스의 함수를 등록하는 과정

		//! SingleCast
		m_pBoom->Fuc_DeleSingle.BindUFunction(this, FName("CallDeleFunc_Single"));
		m_pBoom->Fuc_DeleSingle_OneParam.BindUFunction(this, FName("CallDeleFunc_Single_OneParam"));

		//! MultiCast
		m_pBoom->Dele_Multi.AddUFunction(this, FName("CallDeleFunc_Multi_1"));
		m_pBoom->Dele_Multi.AddUFunction(this, FName("CallDeleFunc_Multi_2"));
        m_pBoom->Dele_Multi_OneParam.AddUFunction(this, FName("CallDeleFunc_Multi_OneParam_1"));
		m_pBoom->Dele_Multi_OneParam.AddUFunction(this, FName("CallDeleFunc_Multi_OneParam_2"));

 

 

 

 

 

이벤트(Event)

이벤트는 멀티 케스트와 유사하지만 전역으로 설정할 수 없어 외부 클래스에서 추가 델리게이트 선언이 불가능.

캡슐화 개념으로 사용. 따라서 전역에 작성했던 이전 Delegate와 달리 Event는 클래스 내부에 작성하고 인자값으로 주인클래스의 클래스를 입력.

이외에는 이전 멀티케스트와 사용법이 동일.

//! ABoom.h

UCLASS()
class DELEGATETEST_API ABoom : public AActor
{
	GENERATED_BODY()
public :
	//! Event
	DECLARE_EVENT(ABoom, FDele_Event);
	DECLARE_EVENT_OneParam(ABoom, FDele_Event_OneParam, int32);
    
public :
	FDele_Event Fuc_DeleEvent;
	FDele_Event_OneParam Fuc_DeleEvent_OneParam;

 

 

 

 

다이나믹(Dynamic)

다이나믹 델리게이트는 직렬화(Serialize)화 되어 블루프린트에서 사용 가능.

이전 델리게이트와 비슷하지만 변수 작성부분에서 BlueprintAssignable 등 UPROPERTY 메크로를 작성.

다만 다이나믹 델리게이트는 AddDynamic 메크로함수로 바인드를 한다.

//! ABoom.h

//Dynamic
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDele_Dynamic);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDele_Dynamic_OneParam, int32, SomeParameter);

UCLASS()
class DELEGATETEST_API ABoom : public AActor
{
	GENERATED_BODY()
public :
	UPROPERTY(BlueprintAssignable, VisibleAnywhere, BlueprintCallable, Category = "Event")
		FDele_Dynamic Fuc_Dynamic;

	UPROPERTY(BlueprintAssignable, VisibleAnywhere, BlueprintCallable, Category = "Event")
		FDele_Dynamic_OneParam Fuc_Dynamic_OneParam;
};


void ATestPlayer::BeginPlay()
{
	Super::BeginPlay();
    
	m_pBoom->Fuc_Dynamic.AddDynamic(this, &ATestPlayer::CallDeleFunc_Dynamic);
	m_pBoom->Fuc_Dynamic_OneParam.AddDynamic(this, &ATestPlayer::CallDeleFunc_Dynamic_OneParam);
  };