[언리얼 엔진] 델리 게이트
- ⭐ Game Programming/Unreal Document
- 2021. 10. 18.
델리게이트
C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형
Delegate로 C++ 오브젝트 상의 멤버 함수 호출을 안전한 방식으로 한다. 델리게이트를 사용하여 임의 오브젝트 멤버 함수에 동적으로 바인딩 시킬 수 있고, 그 다음 오브젝트에서 함수를 호출할 수 있다.
델리게이트는 항상 참조 전달해야 한다. heap에 메모리를 할당 해야 하기 때문이다.
싱글 캐스트와 멀티 캐스트 모두 지원되며, 다이나믹 델리게이트도 가능하다.
델리게이트 선언
델리게이트의 선언은 매크로를 사용하여 선언할 수 있다.
- 값을 반환하는 함수
- 페이로드(Payload, 유상) 변수 4개 까지
- 함수 파라미터 8개 까지
- const 로 선언된 함수
- DECLARE_DELEGATE( DelegateName ) - void Function()
- DECLARE_DELEGATE_RetVal( RetValType, DelegateName ) - Function()
멀티캐스트, 다이내믹, 래핑된 델리게이트도 제공된다. 자세한건 각항목에서
델리게이트 바인딩
UObject나 공유 포인터 클래스 멤버에 델리게이트를 바인딩하는 경우, 델리게이트 시스템은 오브젝트에 대한 약한 레퍼런스를 유지하여, 델리게이트 치하에 오브젝트가 소멸된 경우 IsBound()나 ExecuteIfBound() 함수를 호출하여 처리할 수 있다.
- Bind() = 기존 델리게이트 오브젝트에 바인딩
- BindStatic() = raw C++ 포인터 글로벌 함수 델리게이트 바인딩
- BindRaw() = raw C++ 포인터 델리게이트에 바인딩. 어떤 레퍼런스도 사용하지 않아 만약 오브젝트가 델리게이트 치하에서 삭제된경우 호출이 안전하지 않다.
- BindSP() = 공유 포인터-기반 멤버 함수 델리게이트에 바인딩. 약한 레퍼런스를 유지한다. ExecuteIfBound()로 호출
- BindUObject() = UObject 기반 멤버 함수 델리게이트를 바인딩. 약한 레퍼런스를 유지. ExecuteIfBound()로 호출
- UnBind() = 바인딩 해제
페이로드 데이터
델리게이트에 바인딩 시, 페이로드 데이터를 같이 전달할 수 있다. 페이로드 데이터는 바인딩된 함수를 불러낼 때 직접 전해지는 임의의 변수이다. 바인딩 시간에 델리게이트 자체적으로 파라미터를 보관할수 있다. 다이내믹을 제외한 모든 델리게이트 유형은 페이로드 변수를 자동으로 지원한다.
MyDelegate.BindRaw( &MyFunction, true, 20 );
델리게이트 실행
델리게이트에 바인딩된 함수는 델리게이트의 Execute()함수를 호출하여 실행된다. 델리게이트 실행 전 바인딩 되었는지 확인하자. 코드의 안정성을 위함이다. 초기화되지 않은 상태로 접근이 가능한 반환값과 출력파라미터가 델리게이트에 있을수 있다. 델리게이트가 안전한지는 IsBound()를 통해 검사할 수 있다. 반환값이 없는 델리게이트는 ExecuteIfBound()를 호출할 수 있으나 출력 파라미터는 초기화 되지 않을수 있다.
- Execute()
- ExecuteIfBound()
- IsBound()