Ch05 Delegate

4 분 소요

Delegate

설명

공식문서

UE4 Delegate Guide

간략한 정리

this pointer 를 넣어서 Per-Instance 구현이 가능함

코드

void AEX_Actor_Object::BeginPlay()
{
	Super::BeginPlay();

	OnDelegateEx.BindUObject(this, &AEX_Actor_Object::PrintLog);
	
	static NativeCPP native_class;
	OnDelegateMultiEx.AddUFunction(this, "PrintLog");
	OnDelegateMultiEx.AddStatic(&NativeCPP::PrintStaticLog);
	OnDelegateMultiEx.AddRaw(&native_class, &NativeCPP::PrintLog);
	
	OnDelegateDynamicEx.BindUFunction(this, "PrintLog");
	
	OnDelegateMultiDynamicEx.AddDynamic(this, &AEX_Actor_Object::PrintLog);
	
	FTimerDelegate on_sec = FTimerDelegate::CreateLambda([&]() {
		PFCPP::Log("Delegate On");
		OnDelegateEx.ExecuteIfBound();
		PFCPP::Log("Delegate Dynamic On");
		OnDelegateDynamicEx.ExecuteIfBound();
		PFCPP::Log("Delegate Multi On");
		OnDelegateMultiEx.Broadcast();
		PFCPP::Log("Delegate MultiDynaimc On");
		OnDelegateMultiDynamicEx.Broadcast();
		});
	static FTimerHandle handle;
	GetWorld()->GetTimerManager().SetTimer(handle, on_sec, 1.f, false);
}

Dynamic

  • Non Dynamic
    • BindUObject, AddUFunction 로 Bind 시 this 의 weak reference 를 유지하므로 GC 로 삭제시 안정성있음
    • AddUFunction의 경우 UFUNCTION 매크로가 붙지 않으면 Bind 해도 호출안됨.
    • AddStatic, AddRaw 로 Bind 시 weak reference 는 추적되지 않으며 특히 후자는 GC 등의 메모리에 주의해야함.
    • AddRaw 의 경우 UCLASS 가 붙은 클래스의 메소드를 쓰면 컴파일에러남.
    • AddUFunction 외에는 Parameter Payload 를 지정할 수 있음.
    • 속도도 Dynamic 에 비해 더 빠름.
  • Dynamic
    • blueprint interface 에서 Bind, Unbind 가능함. (Dispatch 라고도 부름)
    • Multicast 가 있는지에 따라 AddDynamic 또는 BindUFunction 으로 추가가 한정됨.
    • Params 이 있는 경우 변수명도 지정해야함.

Multicast

  • Multicast
    • BlueprintAssignableBlueprintCallable 의 필요조건
    • Dynamic 이랑 함께 자주 쓰임
    • Dynamic 안붙으면 UPROPERTY 에 못넣음
    • ExcuteIfBound() 처럼 Binding 되었는지 확인할 필요없이 Broadcast() 하면 됨.

Event

외부에서 Bind 는 되지만 Broadcast 는 할 수 없는 delegate.

매크로의 첫번째 인자로 OwningType 을 받으며 보통 내부가 되는 클래스가 들어감. 그리고 GENERATE_BODY() 처럼 클래스 내부에서 정의됨.

기타

  • Create
    •   staticVariableDelegate.BindStatic(&Class::staticFunc);
         staticVariableDelegate = FMyDelegateType::CreateStatic(&Class::staticFunc);
      
    • 위와 같은데 SetTimer 처럼 Delegate 타입을 필요로 하는 경우 Create 사용
  • Payload
    • Delegate 타입에서 지정된 것보다 더 많은 파라미터를 가진 함수에 적용가능.
    • 초과한 파라미터에 대해서 최대 4개까지 값을 저장해서 ```Excute`` 시 자동으로 넣어줌.

댓글남기기