[UE5] Delegate

GamzaTori·2024년 10월 23일

UE5 C++

목록 보기
17/27

Delegate

  • C++에서 함수 포인터와 비슷한 개념으로 특정 이벤트나 동작이 발생했을 때 해당 이벤트에 반응하도록 함수를 연결하는 기능
  • 이를 통해 객체간의 느슨한 결합을 유지하면서도 이벤트 기반의 시스템을 쉽게 구현할 수 있습니다
  1. Single Cast Delgate

    • 하나의 함수만 바인딩할 수 있다
  2. Multi Cast Delegate

    • 여러 개의 함수를 동시에 바인딩할 수 있음
    • 이벤트가 발생할 때 여러 함수가 호출됨
  3. Dynamic Delegate

    • 런타임에서 바인딩과 해제가 가능
    • 주로 블루프린트와의 상호작용이나 런타임에서 함수 바인딩을 제어할 때 사용
    • UFUNCTION 매크로가 필수

Single Cast Delegate 예시

// 1. Delegate 정의 (Single-cast)
DECLARE_DELEGATE(FMyDelegate);

// 2. Delegate 선언
FMyDelegate MyDelegate;

// 3. Delegate에 바인딩할 함수 정의
void MyFunction()
{
    UE_LOG(LogTemp, Warning, TEXT("Delegate Function Called!"));
}

// 4. Delegate에 함수 바인딩
MyDelegate.BindStatic(&MyFunction);

// 멤버 함수의 경우 BindUObject 사용
MyDelegate.BindUObject(this, &ThisClass::MyFunc);

// 5. Delegate 호출
if (MyDelegate.IsBound())  // Delegate가 바인딩되었는지 확인
{
    MyDelegate.Execute();
}

Multi Cast Delegate 예시

// 1. Multi-cast Delegate 정의
DECLARE_MULTICAST_DELEGATE(FMyMultiCastDelegate);

// 2. Multi-cast Delegate 선언
FMyMultiCastDelegate MyMultiCastDelegate;

// 3. Delegate에 바인딩할 함수 정의
void MyMultiCastFunction1()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 1 Called!"));
}

void MyMultiCastFunction2()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 2 Called!"));
}

// 4. Delegate에 함수 바인딩
MyMultiCastDelegate.AddStatic(&MyMultiCastFunction1);
MyMultiCastDelegate.AddStatic(&MyMultiCastFunction2);

// 5. Delegate 호출
MyMultiCastDelegate.Broadcast();

Dynamic Delegate 예시

// 1. Dynamic Delegate 정의
DECLARE_DYNAMIC_DELEGATE(FMyDynamicDelegate);

// 2. 클래스에 Delegate 선언
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    FMyDynamicDelegate MyDynamicDelegate;

    // 함수 선언, Dynamic Delegate와 연결될 함수는 UFUNCTION으로 선언해야 합니다.
    UFUNCTION()
    void OnMyDynamicEvent();
};

// 3. Delegate에 바인딩할 함수 정의
void AMyActor::OnMyDynamicEvent()
{
    UE_LOG(LogTemp, Warning, TEXT("Dynamic Delegate Function Called!"));
}

// 4. Delegate에 함수 바인딩
void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    // Delegate에 동적으로 함수 바인딩
    MyDynamicDelegate.BindDynamic(this, &AMyActor::OnMyDynamicEvent);

    // Delegate 호출
    if (MyDynamicDelegate.IsBound())
    {
        MyDynamicDelegate.Execute();
    }
}

Dynamic Multi Cast Delegate 예시

// 1. Dynamic Multi-cast Delegate 정의
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMyDynamicMultiCastDelegate);

// 2. 클래스에 Delegate 선언
class AMyActor : public AActor
{
    GENERATED_BODY()

public:
    // Dynamic Multi-cast Delegate 선언
    UPROPERTY(BlueprintAssignable)  // 블루프린트에서도 바인딩할 수 있도록 설정
    FMyDynamicMultiCastDelegate MyDynamicMultiCastDelegate;

    // 바인딩할 함수 선언
    UFUNCTION()
    void OnMyDynamicEvent1();

    UFUNCTION()
    void OnMyDynamicEvent2();
};

// 3. Delegate에 바인딩할 함수 정의
void AMyActor::OnMyDynamicEvent1()
{
    UE_LOG(LogTemp, Warning, TEXT("Dynamic Multi-cast Delegate Function 1 Called!"));
}

void AMyActor::OnMyDynamicEvent2()
{
    UE_LOG(LogTemp, Warning, TEXT("Dynamic Multi-cast Delegate Function 2 Called!"));
}

// 4. Delegate에 함수 바인딩
void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    // Delegate에 동적으로 함수 바인딩
    MyDynamicMultiCastDelegate.AddDynamic(this, &AMyActor::OnMyDynamicEvent1);
    MyDynamicMultiCastDelegate.AddDynamic(this, &AMyActor::OnMyDynamicEvent2);

    // Delegate 호출
    MyDynamicMultiCastDelegate.Broadcast();
}
profile
게임 개발 공부중입니다.

0개의 댓글