我想从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 ++中使用委托,所以我想知道如何使它工作?
它可以编译,但是我没有收到任何事件。
答案 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::OnHandGrabbed
是FLeapHandSignature
,用DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam
声明。
LeapMotion README说要咨询Multi-cast documentation,但是他们使用的是动态委托,因此您实际上需要阅读Dynamic Delegates documentation。在那里,您将看到应该使用AddDynamic
帮助程序宏,该宏会为您生成函数名称字符串。
动态代表利用帮助程序宏来帮助您生成函数名称字符串。
动态代理绑定
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