【UE4】C++의 (Singlecast) Dynamic Delegate에 Blueprint에서 바인딩
Blueprint의 이벤트 디스패처는 Unreal C++에서 말하는 Dynamic Multicast 대리자인 것 같다.
하지만 언리얼 C++ 에서 제공하는 블루프린트용 유틸리티에는 멀티캐스트는 너무 과장된 국면이 비교적 많다.
이번에는 Multicast가 아닌 델리게이트를 Blueprint에서 바인딩하는 방법을 발견했으므로 메모를 남겨 둡니다.
자신을 위한 복습: Unreal C++ 델리게이트에 Blueprint 이벤트 바인딩
Unreal C++ 에서 제공한 대리자를 Blueprint 로 바인드할 수 있도록 하려면 DECLARE_DYNAMIC_MULTICAST_DELEGATE
매크로에서 대리자형을 선언하고 UPROPERTY(BlueprintAssignable)
를 지정한 대리자 변수를 준비해 준다.
다음은 Actor Component 로부터 파생한 Dynamic Delegate Component 로, 델리게이트의 동작 확인을 하는 예.
(예) DynamicDelegateComponent.h#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "DynamicDelegateComponent.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FBlueprintAssignableSignature);
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class STATEMACHINE01_API UDynamicDelegateComponent : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UDynamicDelegateComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
public: // [RINDERON] properties exposed to blueprint
UPROPERTY(BlueprintAssignable, Category = "Dynamic Delegate Component")
FBlueprintAssignableSignature OnEventDispatcherCalled;
};
(예) DynamicDelegateComponent.cpp (일부)// Called every frame
void UDynamicDelegateComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// [RINDERON]
OnEventDispatcherCalled.Broadcast();
}
그런 다음 Blueprint 측에서 액터에 Dynamic Delegate Component를 추가하고,
예를 들면 Event BeginPlay
로 다음과 같이 짜는다.
이것을 실행하면(자), UDynamicDelegateComponent::TickComponent()
내의 델리게이트의 Broadcast()
가 움직여, 매 프레임 Print String 가 불려 갑니다.
Singlecast로 충분하다면
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "DynamicDelegateComponent.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FBlueprintAssignableSignature);
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class STATEMACHINE01_API UDynamicDelegateComponent : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UDynamicDelegateComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
public: // [RINDERON] properties exposed to blueprint
UPROPERTY(BlueprintAssignable, Category = "Dynamic Delegate Component")
FBlueprintAssignableSignature OnEventDispatcherCalled;
};
// Called every frame
void UDynamicDelegateComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// [RINDERON]
OnEventDispatcherCalled.Broadcast();
}
이런 국면은 비교적 많았고, 이번에는 Unreal C++에서 준비한 Singlecast 델리게이트를 Blueprint로 바인딩할 수 없는지, 여러가지 시험해 보았다.
솔직히, 할 수 있다고는 생각하지 않았지만, 되어 버렸다.
(예) DynamicDelegateComponent.h (개)
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "DynamicDelegateComponent.generated.h"
DECLARE_DYNAMIC_DELEGATE(FBlueprintCanBindThisSignature);
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class STATEMACHINE01_API UDynamicDelegateComponent : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UDynamicDelegateComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
public: // [RINDERON] properties exposed to blueprint
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Dynamic Delegate Component")
FBlueprintCanBindThisSignature OnDelegateCalled;
};
(예) DynamicDelegateComponent.cpp (개/일부)
// Called every frame
void UDynamicDelegateComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// [RINDERON]
OnDelegateCalled.ExecuteIfBound();
}
포인트는 2개:
DECLARE_DYNAMIC_MULTICAST_DELEGATE
는 아니고, DECLARE_DYNAMIC_DELEGATE
로 선언을 한다. UPROPERTY(BlueprintAssignable)
대신 UPROPERTY(BlueprintReadWrite)
와 같이 일반적으로 Blueprint에 노출하는 속성처럼 처리합니다. Blueprint에서 바인딩하는 방법은 다음과 같습니다.
변수에 이벤트(함수)를 붙이는 그림이 기분 나쁜 것 같은 생각도 하는데, 원래 델리게이트란 그런 것이다.
실행 결과는 의도대로 :
주의
Dynamic(동적) 대리자 - UE4 공식 참조.
Reference
이 문제에 관하여(【UE4】C++의 (Singlecast) Dynamic Delegate에 Blueprint에서 바인딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Rinderon/items/947b3a918ef383e65271텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)