ONRECU
article thumbnail
Published 2023. 1. 1. 22:56
언리얼 Delegate, Event 개념 정리 UE5

Delegate와 Event 모두 특정 이벤트(함수 호출, 변수 값 변화 등) 발생 시 호출해 주는 역할을 하는데,

둘은 언리얼에서 분리되어 있는 개념이다.

어떻게 다른 것인지 알아본다.


Delegate

  • 기본적으로 C#의 델리게이트 형식으로 제공되는 언리얼 매크로이다.
  • 주의점 : Heap 메모리를 할당하기 때문에 가급적이면 참조 형태로 전달 (pass delegates by reference) 해야 한다.
  • 일반(Single), 다이내믹(Dynamic), 멀티캐스트(Multicast) 델리게이트가 존재한다. 각 델리게이트에 대한 선언 / 바인딩 / 실행 / 바인딩 해제의 경우 link 참고.

예시

1. 선언

  • AIPerceptionComponent 파일에는 두 개의 델리게이트가 선언되어 있다. 이 중 OnTargetPerceptionUpdated를 설명해 본다.
  • DECLARE_ 구문은 해당 델리게이트를 선언하는 것이다. 해당 리턴값(RetVal)을 가진 변수는 델리게이트로 역할을 하게 된다. 전해주는 값는 Actor, Stimulus 두 개의 파라미터다.

  • OnTargetPerceptionUpdated에 델리게이트에 해당하는 리턴값(FActorPerceptionUpdatedDelegate)을 할당하였다. 이제 AIPerceptionComponent는 해당 변수를 통해 Actor와 Stimulus 값을 Broadcast 해줄 수 있다.

2. 등록

  • 델리게이트를 실행(Broadcast)시키는 코드다.
  • AIPerception으로부터 새로운 stimuli가 업데이트 되었다면, 해당 stimuli의 종류와(StimulusStore) 업데이트 대상이 되는 액터(SourceActor)를 알려준다.

3. 바인딩

  • 엔진 코드에서는 위와 같이 OnTargetPerceptionUpdated에 대한 선언/등록까지 모두 해주었다.
  • 이제 이 델리게이트를 받아서 써야한다. 이제 받아서 써야 하는 UObject 클래스로 이동해 준다.
  • 이 때 사용하는 것이 Bind/AddDynamic/AddUObject 등과 같은 함수다.
  • (1) AIPerceptionComponent에 접근한 뒤, (2) OnTargetPerceptionUpdated 델리게이트를 불러내 (3) Broadcast되면 호출하고 싶은 UObject 내의 멤버 함수 주소를 연결해 준다. 
//AIPerceptionComponent에 접근해 델리게이트를 바인딩할 수 있다.
AAIPerceptionComponent* OwnerPerceptionComp;
OwnerPerceptionComp->OnTargetPerceptionUpdated.AddUObject(this, &ThisClass::OnTargetPerceptionUpdated);

...

typedef ThisClass::OnTargetPerceptionUpdated(AActor* SourceActor, FAIStimulus StimulusStore)
{
	//전달된 SourceActor, Stimulus 정보를 사용할 수 있다.
}
  • 위 코드는 임의로 클래스 명을 ThisClass라고 칭하였고, 바인딩 시 AddUObject를 사용하였다.
  • 해당 델리게이트가 Broadcast되면, 바인드 하려는 유저 오브젝트(this)의 해당 함수 주소(&ThisClass::OnTargetPerceptionUpdated) 가 호출된다.

Event

  • Multicast Delegate와 비슷하지만, 이벤트를 선언한 클래스에서만 실행이 가능하다는 한계점이 있다. 해당 클래스 바깥에서는 Broadcast(), IsBound(), Clear()과 같은 함수의 호출을 할 수 없다.
  • 일반적인 Delegate와 달리 전역적인 호출이 불가능해 좀 더 안전하게 이벤트를 실행/노출시킬 수 있다. 
  • 그런데 사용하다보면 해당 클래스 내에서만 필요한 이벤트라는게 극히 드물어서(이후 확장성에도 좋지 않음) 별로 사용하지는 않는다. 차이를 알아두면 좋기 때문에 좀 더 알기 위해서는 link 참고.

'UE5' 카테고리의 다른 글

UPROPERTY, UFUNCTION 개념 정리  (0) 2023.01.01
UObject 개념과 생성 / 삭제 시점  (0) 2022.12.23