내배캠/Unreal Engine

동적 멀티캐스트 델리게이트 (Dynamic Multicast Delegate)

동그래님 2025. 2. 11. 21:24

 

 

📌동적 멀티캐스트 델리게이트

동적 멀티캐스트 델리게이트 (DECLARE_DYNAMIC_MULTICAST_DELEGATE)는 언리얼 엔진에서 여러 개의 함수를 이벤트에 바인딩하고, 한 번에 호출할 수 있는 기능이다.
블루프린트와의 상호작용 및 동적 바인딩이 가능하다.

🔹사용 상황

  • 게임이 진행되는 동안 3번의 웨이브가 있었고, 웨이브 전환 시점에 모든 아이템 효과(버프, 디버프)를 자동으로 정리해야 하는 기능을 구현해야 했다. 각각의 아이템이 웨이브가 전환됨을 감지하고 동작해야 했다.
  • 모든 아이템이 일일이 웨이브 전환 상태를 폴링하는 것은 비효율적이므로, 동적 멀티캐스트 델리게이트를 통해 이벤트를 브로드캐스트하여 관련된 모든 아이템에게 동시에 명령을 전달하는 방식으로 설계를 하기위해 사용했다.

 

🔎사용 예시

✅GameState.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameState.h"
#include "SZ_GameState.generated.h"

// 델리게이트 선언
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWaveEndDelegate);

UCLASS()
class STRIKEZONE_API ASZ_GameState : public AGameState
{
	GENERATED_BODY()

public:
	ASZ_GameState();
	
    // 델리게이트 변수 선언
	FOnWaveEndDelegate OnWaveEnd;
};
  • 헤더파일에서 DECLARE_DYNAMIC_MULTICAST_DELEGATE를 사용해, 새로운 델리게이트 타입인 FOnWaveEndDelegate를 선언.
  • FOnWaveEndDelegate 타입의 OnWaveEnd라는 변수를 만들어서 여러 함수들을 바인딩할 수 있는 상태로 준비.

 

✅GameState.cpp

void ASZ_GameState::EndWave()
{
	// Wave 종료 델리게이트 브로드캐스트
	OnWaveEnd.Broadcast();

	GetWorldTimerManager().ClearTimer(WaveTimerHandle);

	if (UGameInstance* GameInstance = GetGameInstance())
	{
		USZ_GameInstance* SZ_GameInstance = Cast<USZ_GameInstance>(GameInstance);
		if (SZ_GameInstance)
		{
			SZ_GameInstance->CurrentWave++;

			// 월드 상의 아이템 정리
			CleanupSpawnedItems();

			StartWave();
		}
	}
}
  • Wave가 끝나는 시점에 호출되는 EndWave()함수
  • OnwaveEnd.BroadCast(): 브로드캐스트로 모든 함수를 호출
  • OnWaveEnd 델리게이트에 바인딩 되어있는 다른 클래스의 함수들이 모두 호출된다.

 

✅SlipItem.cpp

void ASlipItem::BeginPlay()
{
	Super::BeginPlay();

	// GameState의 Wave 종료 델리게이트 구독
	if (ASZ_GameState* GameState = GetWorld()->GetGameState<ASZ_GameState>())
	{
		GameState->OnWaveEnd.AddDynamic(this, &ASlipItem::OnWaveEnd);
	}
}

void ASlipItem::OnWaveEnd()
{
	ResetMovementSettings();
}

void ASlipItem::ResetMovementSettings()
{
	if (PlayerCharacter)
	{
		PlayerCharacter->SetOriginMovementSettings();
		DestroyItem();
	}
}
  • GameState의 OnWaveEnd 델리게이트에 AddDynamic으로 동적 바인딩
  • OnWaveEnd() 함수는 UFUNCTION으로 선언되어있어야만 리플렉션 시스템을 통해 정상적으로 바인딩될 수 있다.

 

📍함수 호출 흐름

GameState의 EndWave() 호출 → OnWaveEnd.Broadcast() 바인딩된 함수들 호출 → ASlipItem::OnWaveEnd() 호출

 

 

🔔 정리

  • 효율적인 이벤트 전파:
    Wave가 종료되었을 때, 모든 아이템을 하나하나 순회하면서 상태를 변경하는 대신, 브로드캐스트 한 번으로 모든 아이템에게 자동으로 이벤트를 전파할 수 있다.
  • 확장성:
    새로운 아이템이나 기능이 추가되더라도 동적으로 바인딩하여 간단히 확장할 수 있다.
  • 블루프린트 연동 가능:
    DECLARE_DYNAMIC_MULTICAST_DELEGATE는 블루프린트에서도 이벤트 핸들링이 가능하므로, 코드와 블루프린트 간의 유연한 상호작용을 지원한다.