📌동적 멀티캐스트 델리게이트
동적 멀티캐스트 델리게이트 (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는 블루프린트에서도 이벤트 핸들링이 가능하므로, 코드와 블루프린트 간의 유연한 상호작용을 지원한다.
'내배캠 > Unreal Engine' 카테고리의 다른 글
온라인 게임과 네트워크 구성 (0) | 2025.03.11 |
---|---|
네트워크 개념 (0) | 2025.03.10 |
Particle과 Sound 효과 연출 (0) | 2025.02.07 |
Widget Component로 월드에 UI 배치하기 (0) | 2025.02.07 |
UI 애니메이션 효과 만들기 (0) | 2025.02.07 |