카테고리 없음
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);
};