Unreal Engine - Delegate

LeemHyungJun·2024년 1월 25일
0

Unreal Engine

목록 보기
1/2

참고 자료
델리게이트: https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Delegates/#%EB%8D%B8%EB%A6%AC%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%84%A0%EC%96%B8%ED%95%98%EA%B8%B0
다이나믹 델리게이트 : https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Delegates/Dynamic/
멀티캐스트 델리게이트 : https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Delegates/Multicast/

델리게이트 (Delegate)

1. 델리게이트란

  • C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형
  • 특징
    • heap에 메모리 할당된다.
    • 가급적 참조 전달 하기
  • Delegate로..
    • C++ 오브젝트 상의 멤버 함수 호출을 안전하게
    • 임의 오브젝트의 멤버 함수에 동적으로 바인딩 & 오브젝트에서 함수 호출 가능 (호출하는 곳에서 오브젝트의 유형 몰라도 된다

2. 델리게이트 선언하기

  • 선언 매크로를 사용하여 선언한다.

3. 델리게이트 바인딩하기

  • UObject나 shared pointer 클래스 멤버에 바인딩 하는 경우 weak reference 유지
    -> 오브젝트가 소멸된 경우 IsBound() 함수를 통해 처리 가능

4. 델리게이트 실행하기

  • 함수
    • Execute()
      • 델리게이트에 바인딩 된 함수를 실행
      • 바인딩 되어있는지 체크하고 실행해야 한다!
        -> 초기화되지 않은 상태로 접근 가능한 반환값과 출력 파라메터가 델리게이터에 있을수 있기 때문
    • ExecuteIfBound()
      • 반환값이 없는 델리게이트 안전 체크
    • IsBound()
      • 델리게이트를 실행해도 안전한지 체크

5. Dynamic Delegate

  • Serialize 가능하며, 함수를 이름으로 찾을 수 있지만, 일반 델리게이트 보다는 느리다.
  • 선언
  • 바인딩
  • 실행 : 일반 델리게이트와 같다.

6. Multicast Delegate

  • 여러 함수에 바인딩 시켜 실행시킬 수 있는 델리게이트
  • 선언 : MULTICAST만 붙이면 된다.
  • 바인딩
  • 실행
    • 여러 함수 델리게이트를 attach 한 다음 Broadcast() 함수를 통해 모두를 동시에 실행한다.
    • 아무것도 바인딩 되어있지 않아도 문제없다.
      -> 델리게이트를 사용하여 출력 변수를 초기화 시킬 때는 위험할 수 있다.
    • Broadcast() 호출 시 함수의 실행 순서는 정의되지 않는다.

7. 사용 예시

  • 커스텀 델리게이트
  • 선언
    • FOnCreteSessionComplete 델리게이트 정의
  • 바인딩
  • 사용 (멀티캐스트 델리게이트 이므로 Broadcast() 함수 사용)

(참고) Serialization

언리얼 오브젝트 처리 (UObject 시스템) : https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/

  • serialization란 언리얼 오브젝트를 한번에 안전하게 전달하는 것
  • 다이나믹 델리게이트에서는 동적으로 메소드를 바인딩하기 때문에 serialization 특성이 필요하다.
  • 다이나믹 델리게이트는 serialize 특징 덕분에 블루프린트에서 사용 가능하다??

0개의 댓글