组播代表-C ++

时间:2019-03-21 02:18:40

标签: unreal-engine4

我想从C ++中的LeapMotion plugin处接收一个多播事件。他们在文档中提到以下内容:

> On Hand Grabbed Event called when a leap hand grab gesture is
> detected. Signature: const FLeapHandData&, Hand, see FLeapHandData
> 
> FLeapHandSignature OnHandGrabbed;

因此,在我的.cpp文件中,添加了以下内容:

ALeapMotionGesture::ALeapMotionGesture()
{
    PrimaryActorTick.bCanEverTick = true;
    Leap = CreateDefaultSubobject<ULeapComponent>(TEXT("Leap"));
}

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

    if (Leap != nullptr) {
        FScriptDelegate Delegate;
        Delegate.BindUFunction(this, FName("HandGrabbed"));
        Leap->OnHandGrabbed.Add(Delegate);
    }
}

void ALeapMotionGesture::HandGrabbed(const FLeapHandData& Hand) {
    UE_LOG(LogTemp, Warning, TEXT("Hand Grabbed"));
}

因为这是我第一次在Unreal / C ++中使用委托,所以我想知道如何使它工作?

它可以编译,但是我没有收到任何事件。

2 个答案:

答案 0 :(得分:1)

简短回答

替换:

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

    if (Leap != nullptr) {
        FScriptDelegate Delegate;
        Delegate.BindUFunction(this, FName("HandGrabbed"));
        Leap->OnHandGrabbed.Add(Delegate);
    }
}

具有:

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

    if (Leap != nullptr) {
        Leap->OnHandGrabbed.AddDynamic(this, &ALeapMotionGesture::HandGrabbed);
    }
}

长答案

ULeapComponent::OnHandGrabbedFLeapHandSignature,用DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam声明。

LeapMotion README说要咨询Multi-cast documentation,但是他们使用的是动态委托,因此您实际上需要阅读Dynamic Delegates documentation。在那里,您将看到应该使用AddDynamic帮助程序宏,该宏会为您生成函数名称字符串。

动态代表利用帮助程序宏来帮助您生成函数名称字符串。

来自Dynamic Delegates doc

  

动态代理绑定

     

BindDynamic(UserObject,FuncName)

     

用于在动态委托上调用BindDynamic()的Helper宏。   自动生成函数名称字符串。

     

AddDynamic(UserObject,FuncName)

     

Helper宏,用于在动态多播委托上调用AddDynamic()。   自动生成函数名称字符串。

     

RemoveDynamic(UserObject,FuncName)

     

用于在动态多播上调用RemoveDynamic()的Helper宏   代表。自动生成函数名称字符串。

旁注

动态委托被序列化,有时会导致意外的行为。例如,即使您的代码不再调用AddDynamic(因为序列化/保存的actor序列化了旧代码的结果),您也可以调用委托函数,或者即使反序列化过程已经为您做到了。为了安全起见,您可能应该在AddDynamic之前致电RemoveDynamic。这是FoliageComponent.cpp的一个片段:

AddDynamic

答案 1 :(得分:1)

在函数UFUNCTION()上添加HandGrabbed