델리게이트

MoOrY·2023년 2월 20일
0

언리얼 엔진

목록 보기
9/41
post-thumbnail

출처:

델리게이트

C#에서 선보인 개념으로, 콜백함수를 등록하기 위한 함수 포인터를
간결한 문법과 안정성으로 사용하기 위해 고안되었다.

델리게이트의 가장 큰 특징은 는 이름 뜻대로, 집단의 의사를 대표한다는 점이다.
이는 델리게이트가 하나의 함수 뿐만 아니라,
동일한 리턴값과 인자를 가지는 여러개의 함수를 관리할 수 있다는 것을 의미한다.

이러한 특징은 C#의 주요 패턴인 발행/구독 패턴의 구현으로 이어지는데,
신문구독처럼, 신문을 받아보겠다는 구독 의사를 밝히고 등록하면,
신문이 발행될 때 마다 동일한 시간에 모든 구독자의 집으로 신문을 배달해 주듯이,
특정 이벤트가 발생하면, 델리게이트에 등록된 모든 함수가 한꺼번에 실행된다.

사용예 1)
플레이어는 미니언을 스폰하는데, 플레이어가 죽으면 모든 미니언도 같이 죽어야 한다.
그럼 플레이어가 죽는 이벤트를 델리게이트로 정의하고, 미니언을 스폰할 때 마다
각 미니언에게 이를 구독하게 설정하면, 플레이어가 죽을 때 명령 하나로
모든 미니언들에게 플레이어가 죽었다고 알려줄 수 있고, 이 알람을 받았을때 미니언들도 죽게 하면 된다.

사용예 2)
어떤 애니메이션이 동작중인지를 매번 체크하는 것보다,
애니메이션이 끝났다고 캐릭터에게 알려주는 방식이 더 낫다

언리얼 델리게이트

언리얼 델리게이트는 2가지로 나누어진다.

  • c++에서만 사용 가능한 델리게이트
  • c++, BP에서 모두 사용 가능한 델리게이트(다이나믹 델리게이트)

BP 오브젝트는 멤버 함수에 대한 정보를 저장하고 로딩하는 직렬화 매커니즘이 들어있기 때문에,
일반 C++언어가 관리하는 방법으로 멤버함수를 관리할 수 없다.

그래서 BP와 관련된 C++함수는 모두 UFUNCTION매크로를 사용해야 한다.
이렇게 BP객체와도 연동하는 델리게이트를 다이나믹 델리게이트라 한다.

싱글캐스트는 델리게이트변수.BindUFunction(this, FName("함수명")) 형식으로 바인드하며,
멀티캐스트는 델리게이트변수.AddUFunction(this, FName("함수명")) 형식으로 바인드한다.

언리얼 델리게이트 사용하기

언리얼에서 델리게이트를 사용하려면 먼저 매크로를 사용해 델리게이트를 선언해야 한다.
델리게이트는 모든 함수 유형을 대변할 수 없고,
우리가 지정한 함수의 리턴값과 인자 타입을 가지는 함수만 대표할 수 있다.

데리게이트를 바인딩 할때, 델리게이트에 등록할 함수의 종류에 따라 호출하는 함수가 달라진다.
언리얼 델리게이트 시스템에 등록 가능한 함수는 다음과 같다.

  • 전역 C++ 함수 : BindStatic API를 사용해 등록
  • 전역 C++ 람다 함수 : BindLambda API를 사용해 등록
  • C++클래스 멤버 함수 : BindRaw API를 사용해 등록
  • 공유포인터 클래스의 멤버 함수 (쓰레드 미지원) : BindSP API를 사용해 등록
  • 공유포인터 클래스의 멤버 함수 (쓰레드 지원) : BindThreadSafeSP API를 사용해 등록
  • UFUNCTION 멤버 함수 : BindUFunction API를 사용해 등록
  • 언리얼 오브젝트의 멤버함수 : BindUObject API를 사용해 등록

BindUFunction사용 예)

  • DECLARE_DELEGATE를 사용하여 델리게이트를 FCustom이란 이름으로 등록한다.
    (반드시 접두사로 F를 붙여야 한다.)
  • 해당 델리게이트를 사용할 변수를 MyDelegate로 선언한다.
  • 델리게이트를 실행하면 호출될 함수를 CallDelegate로 선언한다.
  • BeginPlay에서 MyDelegate에 CallDelegate를 등록한다.
  • ISBound()를 통해 등록이 완료되었는지 확인하고, 완료되었으면 Execute()를 통해 실행한다.
    (코드 안정성을 위해 델리게이트를 실행하기 전 반드시 IsBound로 확인하자.)

다이나믹 멀티캐스트 사용 예)

플레이어가 사망하면, 플레이어가 스폰한 미니언들 모두 죽는 기능 예제이다.

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

    만약 인자가 필요하다면 각 인자의 개수에 맞는 매크로를 사용한다.
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParams()
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams()

  • 스폰한 미니언들에게 콜백함수를 등록한다. 다이나믹이므로 AddDynamic을 사용한다.

  • 플레이어가 사망하면 델리게이트를 실행한다.
    다이나믹은 Excute()대신 Breadcast()를 사용한다.
profile
필기용 블로그입니다.

0개의 댓글