delegate

¾ð¸®¾ó µ¨¸®°ÔÀÌÆ®¿¡ ´ëÇؼ­ ¾Ë¾Æ º¸ÀÚ.

¸®ÅÏ°ªÀÌ ¾ø´Â µ¨¸®°ÔÀÌÆ®

DECLARE_DELEGATE(DelegateName) 
void Function()

DECLARE_DELEGATE_OneParam(DelegateName, Param1Type)
void Function(<Param1>)


DECLARE_DELEGATE_TwoParams(DelegateName, Param1Type, Param2Type)
void Function(<Param1>, <Param2>)

DECLARE_DELEGATE_<Num>Params(DelegateName, Param1Type, Param2Type, ...)
void Function(<Param1>, <Param2>, ...)

¸®ÅÏ°ªÀÌ ÀÖ´Â µ¨¸®°ÔÀÌÆ®

DECLARE_DELEGATE_RetVal(RetValType, DelegateName)
< RetVal > Function()

DECLARE_DELEGATE_RetVal_OneParam(RetValType, DelegateName, Param1Type)
< RetVal > Function(<Param1>)

DECLARE_DELEGATE_RetVal_TwoParams(RetValType, DelegateName, Param1Type, Param2Type)
< RetVal > Function(<Param1>, <Param2>)

DECLARE_DELEGATE_RetVal_<Num>Params(RetValType, DelegateName, Param1Type, Param2Type, ...)
< RetVal > Function(<Param1>, <Param2>, ...)

³×ÀÌƼºê ±â´ÉÀ» ¹ÙÀεù ÇÒ¶§ »ç¿ë

DECLARE_DELEGATE
DECLARE_MULTICAST_DELEGATE

ºí·çÇÁ¸°Æ® ±â´ÉÀ» ¹ÙÀεù ÇÒ¶§ »ç¿ë



ÆĶó¹ÌÅÍ ¾ø°í ¸®ÅÏ°ª ¾ø´Â ±âº» µ¨¸®°ÔÀÌÆ®

µ¨¸®°ÔÀÌÆ® »ç¿ëÀº ´ÙÀ½ 4´Ü°è·Î »ç¿ë ÇÒ¼ö ÀÖ´Ù.

1. µ¨¸®°ÔÀÌÆ® ¼±¾ð
DECLARE_DELEGATE(VoidSimple);

2. µ¨¸®°ÔÀÌÆ® Á¤ÀÇ
VoidSimple VoidDeleFunc;

3. ¹ÙÀεù
VoidDeleFunc.BindUFunction(this, FName("CallTest"));

4. ½ÇÇà
VoidDeleFunc.Execute();

5. ¹ÙÀεù ¿©ºÎ °Ë»ç
VoidDeleFunc.IsBound()

¹ÙÀεùÇÒ ÇÔ¼ö¿¡ "UFUNCTION()"À» ÁöÁ¤ ÇÏÁö ¾ÊÀ¸¸é ÇÔ¼ö°¡ Á¦´ë·Î ºÒ·ÁÁöÁö ¾Ê´Â´Ù.
²À "UFUNCTION()"À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

//Çì´õ ÆÄÀÏ
DECLARE_DELEGATE(VoidSimple);

UCLASS()
class UMyGameInstance : public UGameInstance
{
public:
    VoidSimple VoidDeleFunc;  

private:
    UFUNCTION()
    void CallTest()
}

//CPP ÆÄÀÏ
void UMyGameInstance::TestDelegate()
{
    VoidDeleFunc.BindUFunction(this, FName("CallTest"));
    if (VoidDeleFunc.IsBound())
        VoidDeleFunc.Execute();   
}

void UMyGameInstance::CallTest()
{
    UE_LOG(LogTemp, Warning, TEXT("UMyGameInstance::CallTest-------------------"));
}

ÆĶó¹ÌÅÍ ¾ø°í ¸®ÅÏ°ª ¾ø´Â ¸ÖƼ ±âº» µ¨¸®°ÔÀÌÆ®

¸ÖƼ ±âº» µ¨¸®°ÔÀÌÆ® »ç¿ëÀº ´ÙÀ½ 4´Ü°è·Î »ç¿ë ÇÒ¼ö ÀÖ´Ù.
¸ÖƼ µ¨¸®°ÔÀÌÆ®´Â ¿©·¯°³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÇÇàÇÏ¸é ¿©·¯°³ÀÇ ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù.

1. µ¨¸®°ÔÀÌÆ® ¼±¾ð
DECLARE_MULTICAST_DELEGATE(MultiVoidSimple);

2. µ¨¸®°ÔÀÌÆ® Á¤ÀÇ
MultiVoidSimple MultiVoidDeleFunc;

3. ¹ÙÀεù
MultiVoidDeleFunc.AddUFunction(this, FName("CallTest"));

4. ½ÇÇà
MultiVoidDeleFunc.Broadcast();

5. ¹ÙÀεù ¿©ºÎ °Ë»ç
MultiVoidDeleFunc.IsBound()

¹ÙÀεùÇÒ ÇÔ¼ö¿¡ "UFUNCTION()"À» ÁöÁ¤ ÇÏÁö ¾ÊÀ¸¸é ÇÔ¼ö°¡ Á¦´ë·Î ºÒ·ÁÁöÁö ¾Ê´Â´Ù.
²À "UFUNCTION()"À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
//Çì´õ ÆÄÀÏ
DECLARE_MULTICAST_DELEGATE(MultiVoidSimple);

UCLASS()
class UMyGameInstance : public UGameInstance
{
public:
    MultiVoidSimple MultiVoidDeleFunc; 

private:
    UFUNCTION()
    void CallTest()
}

//CPP ÆÄÀÏ
void UMyGameInstance::TestDelegate()
{
    MultiVoidDeleFunc.AddUFunction(this, FName("CallTest"));
    if (MultiVoidDeleFunc.IsBound())
        MultiVoidDeleFunc.Broadcast(); 
}

void UMyGameInstance::CallTest()
{
    UE_LOG(LogTemp, Warning, TEXT("UMyGameInstance::CallTest-------------------"));
}


ÆĶó¹ÌÅÍ ¾ø°í ¸®ÅÏ°ª ¾ø´Â µ¿Àû ±âº» µ¨¸®°ÔÀÌÆ®

µ¿Àû µ¨¸®°ÔÀÌÆ®´Â ºí·çÇÁ¸°Æ®ÀÇ ±â´É¿¡ »ç¿ë ÇÒ¼ö ÀÖ´Ù.
µ¿Àû ±âº» µ¨¸®°ÔÀÌÆ® »ç¿ëÀº ´ÙÀ½ 4´Ü°è·Î »ç¿ë ÇÒ¼ö ÀÖ´Ù.
µ¿Àû µ¨¸®°ÔÀÌÆ®´Â ¿©·¯°³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÇÇàÇÏ¸é ¿©·¯°³ÀÇ ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù.

1. µ¨¸®°ÔÀÌÆ® ¼±¾ð
DECLARE_DYNAMIC_DELEGATE(FVoidSimple);

µ¿Àû µ¨¸®°ÔÀÌÆ®´Â µ¨¸®°ÔÀÌÆ® ¼±¾ð½Ã "F"¸¦ ²À ºÙ¿©¾ß ÇÑ´Ù.

2. µ¨¸®°ÔÀÌÆ® Á¤ÀÇ
FVoidSimple VoidDeleFunc;

3. ¹ÙÀεù
VoidDeleFunc.BindDynamic(this, &UMyGameInstance::CallTest);

4. ½ÇÇà
VoidDeleFunc.ExecuteIfBound();

ExecuteIfBound ÇÔ¼ö´Â ¹ÙÀεù µÇ¾î ÀÖÀ¸¸é ½ÇÇàÇÏ°í, ¹ÙÀεù ¾ÈµÇ¾î ÀÖÀ¸¸é ½ÇÇàÇÏÁö ¾Ê´Â´Ù.
IsBound·Î °Ë»çÇÏ°í Execute()°Í°ú °°Àº ±â´ÉÀ» ÇÑ´Ù.
¹Ýȯ°ªÀÌ ¾ø´Â µ¨¸®°ÔÀÌÆ®¿¡ »ç¿ë ÇÒ¼ö ÀÖ´Ù.

5. ¹ÙÀεù ¿©ºÎ °Ë»ç
VoidDeleFunc.IsBound()

¹ÙÀεùÇÒ ÇÔ¼ö¿¡ "UFUNCTION()"À» ÁöÁ¤ ÇÏÁö ¾ÊÀ¸¸é ÇÔ¼ö°¡ Á¦´ë·Î ºÒ·ÁÁöÁö ¾Ê´Â´Ù.
²À "UFUNCTION()"À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
//Çì´õ ÆÄÀÏ
DECLARE_DYNAMIC_DELEGATE(FVoidSimple);

UCLASS()
class UMyGameInstance : public UGameInstance
{
public:
    FVoidSimple VoidDeleFunc;

private:
    UFUNCTION()
    void CallTest()
}

//CPP ÆÄÀÏ
void UMyGameInstance::TestDelegate()
{
    VoidDeleFunc.BindDynamic(this, &UMyGameInstance::CallTest);
    VoidDeleFunc.ExecuteIfBound();
}

void UMyGameInstance::CallTest()
{
    UE_LOG(LogTemp, Warning, TEXT("UMyGameInstance::CallTest-------------------"));
}


ÆĶó¹ÌÅÍ ¾ø°í ¸®ÅÏ°ª ¾ø´Â µ¿Àû ¸ÖƼ ±âº» µ¨¸®°ÔÀÌÆ®

µ¿Àû µ¨¸®°ÔÀÌÆ®´Â ºí·çÇÁ¸°Æ®ÀÇ ±â´É¿¡ »ç¿ë ÇÒ¼ö ÀÖ´Ù.
µ¿Àû ¸ÖƼ ±âº» µ¨¸®°ÔÀÌÆ® »ç¿ëÀº ´ÙÀ½ 4´Ü°è·Î »ç¿ë ÇÒ¼ö ÀÖ´Ù.
µ¿Àû ¸ÖƼ µ¨¸®°ÔÀÌÆ®´Â ¿©·¯°³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í ½ÇÇàÇÏ¸é ¿©·¯°³ÀÇ ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù.

1. µ¨¸®°ÔÀÌÆ® ¼±¾ð
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMultiVoidSimple);

µ¿Àû µ¨¸®°ÔÀÌÆ®´Â µ¨¸®°ÔÀÌÆ® ¼±¾ð½Ã "F"¸¦ ²À ºÙ¿©¾ß ÇÑ´Ù.

2. µ¨¸®°ÔÀÌÆ® Á¤ÀÇ
FMultiVoidSimple dynaMultiVoidDeleFunc;

3. ¹ÙÀεù
MultiVoidDeleFunc.AddDynamic(this, &UMyGameInstance::CallTest);

4. ½ÇÇà
MultiVoidDeleFunc.Broadcast();

5. ¹ÙÀεù ¿©ºÎ °Ë»ç
MultiVoidDeleFunc.IsBound()

¹ÙÀεùÇÒ ÇÔ¼ö¿¡ "UFUNCTION()"À» ÁöÁ¤ ÇÏÁö ¾ÊÀ¸¸é ÇÔ¼ö°¡ Á¦´ë·Î ºÒ·ÁÁöÁö ¾Ê´Â´Ù.
²À "UFUNCTION()"À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.
//Çì´õ ÆÄÀÏ
DECLARE_MULTICAST_DELEGATE(FMultiVoidSimple);

UCLASS()
class UMyGameInstance : public UGameInstance
{
public:
    FMultiVoidSimple MultiVoidDeleFunc; 

private:
    UFUNCTION()
    void CallTest()
}

//CPP ÆÄÀÏ
void UMyGameInstance::TestDelegate()
{
    MultiVoidDeleFunc.AddDynamic(this, &UMyGameInstance::CallTest);
    if (MultiVoidDeleFunc.IsBound())
        MultiVoidDeleFunc.Broadcast();
}

void UMyGameInstance::CallTest()
{
    UE_LOG(LogTemp, Warning, TEXT("UMyGameInstance::CallTest-------------------"));
}

ÂüÁ¶)
¾ð¸®¾ó µ¨¸®°ÔÀÌÆ® ¹®¼­
¾ð¸®¾ó µ¨¸®°ÔÀÌÆ® ¹®¼­2