Unreal Engine 有四种委托:

  • Single
  • Multicast
  • Dynamic single
  • Dynamic multicast(在蓝图中称作事件分发器)
SingleMulticastDynamic SingleDynamic Multicast
接受多少订阅一个多个一个多个
是否可在蓝图中使用
性能--也许慢一些也许慢一些

设置并使用委托时遵循以下步骤。

  1. 定义委托签名
  2. 创建委托变量
  3. 订阅委托
  4. 执行委托

定义委托签名

非 Dynamic 委托:

DECLARE_DELEGATE(FOnScoreChangedSignature);
// void OnScoreChanged();
 
DECLARE_DELEGATE_OneParam(FOnScoreChangedWithScoreSignature, int32 /* NewScore */);
// void OnScoreChangedWithScore(int32 NewScore);
 
DECLARE_DELEGATE_TwoParams(FOnScoreChangedWithOwnerSignature, int32 /* NewScore */, class APlayerState* /* OwningPlayer */);
// void OnScoreChangedWithOwner(int32 NewScore, class APlayerState* OwningPlayer);

Dynamic 委托:

DECLARE_DYNAMIC_DELEGATE(FOnScoreChangedSignature);
// void OnScoreChanged();
 
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnScoreChangedSignature, int32, NewScore);
// void OnScoreChanged(int32 NewScore);
 
DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnScoreChangedSignature, int32, NewScore, class APlayerState*, OwningPlayer);
// void OnScoreChanged(int32 NewScore, APlayerState* OwningPlayer);

非 Multicast 委托允许添加返回值:

DECLARE_DELEGATE_RetVal_TwoParams(bool, FOnDogSucceededWoofing, class ADog* /* Dog */, FString /* WoofWord */);
// bool OnDogWoof(ADog* Dog, FString WoofWord);
 
DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(bool, FOnDogSucceededWoofing, class ADog*, Dog, FString, WoofWord);
// bool OnDogWoof(ADog* Dog, FString WoofWord);

Multicast 委托:

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnScoreChangedSignature, int32, NewScore);

创建委托变量

#pragma once
 
#include "GameFramework/PlayerState.h"
#include "BUIPlayerState.generated.h"
 
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnScoreChangedSignature, int32, NewScore);
 
UCLASS()
class ABUIPlayerState : public APlayerState
{
	GENERATED_BODY()
 
public:
	UPROPERTY(BlueprintAssignable) // 暴露给蓝图。
	FOnScoreChangedSignature OnScoreChangedDelegate;
};

订阅委托

非 Dynamic 的 Single 委托

可调用这些函数绑定:

  • BindLambda
  • BindRaw
  • BindStatic
  • BindSP
  • BindUFunction
  • BindUObject
  • BindWeakLambda
  • BindThreadSafeSP

并未列出全部。

DECLARE_DELEGATE_OneParam(FOnScoreChangedSignature, int32 /* NewScore */);
 
// BindUObject 要求目标是 UObject。
OnScoreChangedDelegate.BindUObject(this, &ThisClass::OnScoreChanged);
 
// 如果目标不是 UObject,用 BindRaw。
OnScoreChangedDelegate.BindRaw(SomeSlateThing, &SSlomeSlateThing::OnScoreChangedRaw);
 
// 简单的匿名函数用 BindLambda。
OnScoreChangedDelegate.BindLambda([[int32 NewScore]]
{
	// ……
});

非 Dynamic 的 Multicast 委托

提供的绑定函数与 Single 委托类似,但 Bind 调整为 Add

Dynamic Single 委托

DECLARE_DYNAMIC_DELEGATE_OneParam(FOnScoreChangedSignature, int32, NewScore);
 
// ThisClass::OnScoreChanged(int32 NewScore) 是用 UFUNCTION 标记的函数。
OnScoreChangedDelegate.BindDynamic(this, &ThisClass::OnScoreChanged);

Dynamic Multicast 委托

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnScoreChangedSignature, int32, NewScore);
 
// ThisClass::OnScoreChanged(int32 NewScore) 是用 UFUNCTION 标记的函数。
// 对应 UFUNCTION 此前未绑定时,AddUniqueDynamic 才会为其绑定。
OnScoreChangedDelegate.AddUniqueDynamic(this, &ThisClass::OnScoreChanged);

参考