DECLARE_DELEGATE : 기본 델리게이트
DECLARE_DYNAMIC_DELEGATE : 블루프린트와 연동 가능한 델리게이트
DECLARE_MULTICAST_DELEGATE : 여러 객체와 바인딩 가능한 브로드캐스트용 델리게이트
DECLARE_DYNAMIC_MULTICATS_DELEGATE : 블루프린트에서도 사용 가능한 멀티캐스트 델리게이트
// MyActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
DECLARE_DELEGATE(FOnSimpleEvent);
UCLASS()
class YOURGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
// 델리게이트 인스턴스
FOnSimpleEvent OnButtonPressed;
// 함수 선언
void HandleButtonPress();
};
#include "MyActor.h"
AMyActor::AMyActor()
{
// 델리게이트 바인딩
OnButtonPressed.BindUObject(this, &AMyActor::HandleButtonPress);
// 델리게이트 호출
OnButtonPressed.ExecuteIfBound();
}
void AMyActor::HandleButtonPress()
{
UE_LOG(LogTemp, Log, TEXT("버튼이 눌렸습니다!"));
}
델리게이트를 통해 함수를 바인딩하여 델리게이트를 통해 바인딩된 함수를 실행시킬 수 있다.
// MyGameMode.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyGameMode.generated.h"
DECLARE_MULTICAST_DELEGATE(FOnGameStart);
UCLASS()
class YOURGAME_API AMyGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
AMyGameMode();
// 멀티캐스트 델리게이트 인스턴스
FOnGameStart OnGameStart;
// 게임 시작 함수
void StartGame();
};
델리게이트 선언
// 리스너 클래스에서 바인딩
void AMyListener::BeginPlay()
{
Super::BeginPlay();
// GameMode 가져오기
AMyGameMode* GameMode = Cast<AMyGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
if (GameMode)
{
GameMode->OnGameStart.AddUObject(this, &AMyListener::HandleGameStart);
}
}
void AMyListener::HandleGameStart()
{
UE_LOG(LogTemp, Log, TEXT("리스너가 게임 시작을 감지했습니다!"));
}
다른 클래스에서 델리게이트에 함수 바인딩
// MyGameMode.cpp
#include "MyGameMode.h"
AMyGameMode::AMyGameMode()
{
// 예: 게임 시작 시 호출
StartGame();
}
void AMyGameMode::StartGame()
{
UE_LOG(LogTemp, Log, TEXT("게임 시작!"));
// 모든 리스너에 브로드캐스트
OnGameStart.Broadcast();
}
StartGame함수에서 델리게이트 Broadcast()함수를 통해 바인딩된 함수들을 순차적으로 실행
블루프린트용 Dynamic Delegate
// MyWidget.h
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonClicked);
UCLASS()
class YOURGAME_API UMyWidget : public UUserWidget
{
GENERATED_BODY()
public:
// 블루프린트에서 바인딩 가능
UPROPERTY(BlueprintAssignable, Category = "UI")
FOnButtonClicked OnButtonClicked;
UFUNCTION(BlueprintCallable, Category = "UI")
void ButtonClicked();
};
// MyWidget.cpp
void UMyWidget::ButtonClicked()
{
UE_LOG(LogTemp, Log, TEXT("버튼 클릭됨!"));
OnButtonClicked.Broadcast(); // 블루프린트에 이벤트 브로드캐스트
}
C++ 코드 내에서 바인딩하지 않고 블루프린트 상에서 바인딩해주는 것도 가능하다.
// 인자 1개를 가지는 델리게이트 선언
DECLARE_DELEGATE_OneParam(FOnScoreUpdated, int32);
// 인자 2개를 가지는 델리게이트 선언
DECLARE_DELEGATE_TwoParams(FOnPlayerHealthChanged, int32, float);
// 델리게이트 바인딩
OnButtonPressed.BindUObject(this, &AMyActor::HandleButtonPress);
OnScoreChanged.BindUObject(this, &AMyActor::UpdateScore);
// 델리게이트 호출
OnButtonPressed.ExecuteIfBound();
OnScoreChanged.ExecuteIfBound(100);
델리게이트 선언 시에 OneParam, TwoParam을 붙여서 인자가 존재하는 함수를 바인딩하고 실행시킬 수 있다.
DECLARE_DELEGATE_RetVal : 반환값이 있는 델리게이트
DECLARE_DELEGATE_RetVal_OneParam : 반환값 + 인자 1개
// 반환값만 있는 델리게이트 (bool 반환)
DECLARE_DELEGATE_RetVal(bool(반환값), FOnCheckGameOver);
// 인자 1개와 반환값이 있는 델리게이트
DECLARE_DELEGATE_RetVal_OneParam(int32(반환값), FOnCalculateScore, int32(인자));
// 델리게이트 바인딩
OnCheckGameOver.BindUObject(this, &AMyActor::CheckIfGameOver);
OnCalculateScore.BindUObject(this, &AMyActor::CalculateFinalScore);
if (OnCheckGameOver.IsBound())
{
bool bIsGameOver = OnCheckGameOver.Execute();
}
// 점수 계산
if (OnCalculateScore.IsBound())
{
int32 FinalScore = OnCalculateScore.Execute(100);
}