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는 언리얼 객체 간 통신 구조를 이해하기 위한 핵심 개념이다.
'내일배움캠프_언리얼9기' 카테고리의 다른 글
| 내일배움캠프 69일차 TIL 2026/07/30 (0) | 2026.07.30 |
|---|---|
| 내일배움캠프 68일차 TIL 2026/07/29 (0) | 2026.07.29 |
| 내일배움캠프 63일차 TIL 2026/07/22 (0) | 2026.07.22 |
| 내일배움캠프 61일차 TIL 2026/07/20 (0) | 2026.07.20 |
| 내일배움캠프 60일차 TIL 2026/07/16 (0) | 2026.07.16 |