[UE5] Deligate

HyeonjungYun·2025년 2월 21일

언리얼 기초

목록 보기
17/23

Deligate

Deligate 종류

DECLARE_DELEGATE : 기본 델리게이트
DECLARE_DYNAMIC_DELEGATE : 블루프린트와 연동 가능한 델리게이트
DECLARE_MULTICAST_DELEGATE : 여러 객체와 바인딩 가능한 브로드캐스트용 델리게이트
DECLARE_DYNAMIC_MULTICATS_DELEGATE : 블루프린트에서도 사용 가능한 멀티캐스트 델리게이트

기본 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("버튼이 눌렸습니다!"));
}

델리게이트를 통해 함수를 바인딩하여 델리게이트를 통해 바인딩된 함수를 실행시킬 수 있다.

멀티캐스트 Delegate 사용법

// 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()함수를 통해 바인딩된 함수들을 순차적으로 실행

다이나믹 Deligate 사용법

블루프린트용 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); 
}
profile
게임 프로그래머 공부

0개의 댓글