내일배움캠프_언리얼9기

내일배움캠프 67일차 TIL 2026/07/28

begin-play 2026. 7. 28. 22:56

TIL - Unreal Engine Delegate 정리

1. Delegate란?

Delegate는 특정 이벤트가 발생했을 때 등록된 함수를 대신 호출해주는 이벤트 시스템이다.

쉽게 말하면,

"어떤 일이 발생했다는 사실을 다른 객체들에게 알리는 방법"

이다.

Delegate를 사용하는 가장 큰 목적은 객체 간 결합도를 낮추는 것이다.


2. Delegate가 필요한 이유

직접 호출 방식의 문제

예를 들어 플레이어의 체력이 감소했을 때,

기존 방식:

HealthComponent
        |
        ├── UI 업데이트
        ├── 피격 사운드 재생
        ├── 퀘스트 진행
        └── 업적 체크

HealthComponent가 모든 시스템을 알고 있어야 한다.

문제점:

  • 코드 의존성이 증가한다.
  • 새로운 기능 추가 시 기존 코드를 수정해야 한다.
  • 유지보수가 어려워진다.

Delegate 방식

HealthComponent

        ↓

OnHealthChanged Delegate

        ↓

UI
Sound
Quest
Achievement

HealthComponent는

"체력이 변경되었다"

라는 사실만 알리고,

누가 반응하는지는 알 필요가 없다.


3. Delegate 기본 구조

Delegate는 크게 세 단계로 동작한다.

1. Delegate 선언

        ↓

2. 함수 등록(Bind / Add)

        ↓

3. 이벤트 발생 시 호출(Execute / Broadcast)

4. Single Delegate

하나의 함수만 등록 가능한 Delegate.

선언

DECLARE_DELEGATE(FOnAttack)

의미:

  • FOnAttack이라는 Delegate 타입 생성
  • 하나의 함수만 저장 가능

함수 등록

AttackDelegate.BindUObject(
    this,
    &AMyCharacter::Attack
);

Bind의 의미:

"나중에 이 함수를 호출하도록 기억해 둔다."


함수 실행

AttackDelegate.Execute();

Execute 호출 시 등록된 함수가 실행된다.


등록 여부 확인

if(AttackDelegate.IsBound())
{
    AttackDelegate.Execute();
}

IsBound()

  • true : 등록된 함수 존재
  • false : 등록된 함수 없음

5. Multicast Delegate

여러 개의 함수를 등록할 수 있는 Delegate.

게임에서는 가장 많이 사용하는 형태이다.

선언

DECLARE_MULTICAST_DELEGATE(FOnHealthChanged)

함수 등록

Single Delegate는 Bind를 사용하지만,

Multicast는 Add를 사용한다.

HealthChanged.AddUObject(
    UI,
    &UPlayerHUD::UpdateHP
);

여러 개 등록 가능:

HealthChanged

↓

UpdateHP()

↓

PlaySound()

↓

UpdateQuest()

호출

Multicast는 Execute가 아니라 Broadcast를 사용한다.

HealthChanged.Broadcast();

Broadcast:

등록된 모든 함수를 실행한다.


6. Delegate에 데이터 전달하기

실제 게임에서는 이벤트 발생 사실뿐 아니라 데이터도 함께 전달한다.

예)

체력 변경 이벤트

체력이 변경되었습니다.

보다

현재 체력 : 75
최대 체력 : 100

을 전달하는 것이 더 유용하다.


매개변수 1개

DECLARE_MULTICAST_DELEGATE_OneParam(
    FOnHealthChanged,
    float
)

사용:

HealthChanged.Broadcast(CurrentHP);

매개변수 2개

DECLARE_MULTICAST_DELEGATE_TwoParams(
    FOnHealthChanged,
    float,
    float
)

사용:

HealthChanged.Broadcast(CurrentHP, MaxHP);

실무에서는 구조체 전달을 많이 사용

매개변수가 많아지면 관리가 어려워진다.

그래서 구조체를 사용한다.

예:

FHealthChangedData
{
    CurrentHP;
    MaxHP;
    Damage;
    Instigator;
}

Delegate:

DECLARE_MULTICAST_DELEGATE_OneParam(
    FOnHealthChanged,
    FHealthChangedData
)

장점:

  • 코드 가독성 증가
  • 데이터 추가가 쉬움
  • 유지보수 편리

7. Delegate 종류

Single Delegate

함수 1개 등록

사용:

BindUObject()
Execute()

Multicast Delegate

함수 여러 개 등록

사용:

AddUObject()
Broadcast()

Dynamic Delegate

Reflection 사용

특징:

  • Blueprint 사용 가능
  • UFUNCTION 필요

Dynamic Multicast Delegate

가장 많이 사용하는 형태 중 하나.

특징:

  • 여러 함수 등록 가능
  • Blueprint 연결 가능

사용:

AddDynamic()

8. Bind / Add 종류

BindUObject()

UObject 함수 등록.

특징:

  • C++ 객체 연결
  • GC와 연동 가능
  • 가장 일반적인 방식

BindRaw()

일반 C++ 객체 연결.

주의:

  • GC 관리 대상 아님
  • 객체 삭제 후 Delegate 호출 시 문제 발생 가능

BindLambda()

이름 없는 Lambda 함수 등록.

간단한 일회성 처리에 사용.


AddUObject()

Multicast Delegate에서 UObject 함수 추가.


AddDynamic()

Blueprint와 연결 가능한 Multicast Delegate 등록.

조건:

UFUNCTION()

필요.


9. Delegate 실무 사용 구조

대표적인 HealthComponent 예제:

HealthComponent

├── CurrentHP
├── MaxHP
└── OnHealthChanged Delegate

흐름:

데미지 받음

↓

CurrentHP 변경

↓

OnHealthChanged.Broadcast()

↓

UI 체력바 업데이트

↓

피격 사운드 실행

↓

이펙트 실행

HealthComponent는

UI, Sound, Effect의 존재를 모른다.


10. Delegate 사용 판단 기준

Delegate를 사용하는 상황:

이벤트 전달

예)

  • 체력 변경
  • 몬스터 사망
  • 레벨업
  • 무기 변경
  • 스킬 종료
  • 버튼 클릭

Delegate를 사용하지 않는 상황:

명령 실행

예)

  • Attack()
  • Jump()
  • Move()
  • CalculateDamage()

정리하면:

"누군가에게 알려야 하는 것" → Delegate
"내가 직접 실행해야 하는 것" → 일반 함수 호출


11. Delegate 사용 시 주의사항

1) 중복 등록

문제:

AddDynamic()
AddDynamic()
AddDynamic()

결과:

하나의 이벤트가 여러 번 실행됨.

해결:

AddUniqueDynamic()

2) Delegate 해제

객체가 삭제될 때 등록 해제가 필요할 수 있다.

사용:

RemoveDynamic()

3) BindRaw 주의

UObject가 아니라면 생명주기를 직접 관리해야 한다.


4) Delegate 남발 금지

모든 함수 호출을 Delegate로 만들면 구조가 복잡해진다.

이벤트 전달이 필요한 경우 사용한다.


12. Delegate 핵심 정리

Delegate란:

객체 간 직접 참조 없이 이벤트를 전달하기 위한 시스템

핵심 흐름:

상태 변경

↓

Broadcast()

↓

등록된 함수 실행

↓

필요한 객체들이 반응

핵심 장점:

  • 낮은 결합도
  • 높은 재사용성
  • 쉬운 확장성
  • 유지보수 편리

Unreal에서 Delegate가 많이 사용되는 곳

  • UI 업데이트
  • Gameplay Ability System(GAS)
  • Lyra Framework
  • Animation Notify
  • Input Event
  • Actor 상태 변경 이벤트

Delegate는 언리얼 객체 간 통신 구조를 이해하기 위한 핵심 개념이다.