Unreal Engine 有四种委托:
- Single
- Multicast
- Dynamic single
- Dynamic multicast(在蓝图中称作事件分发器)
| Single | Multicast | Dynamic Single | Dynamic Multicast | |
|---|---|---|---|---|
| 接受多少订阅 | 一个 | 多个 | 一个 | 多个 |
| 是否可在蓝图中使用 | 否 | 否 | 是 | 是 |
| 性能 | - | - | 也许慢一些 | 也许慢一些 |
设置并使用委托时遵循以下步骤。
- 定义委托签名
- 创建委托变量
- 订阅委托
- 执行委托
定义委托签名
非 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 委托
可调用这些函数绑定:
BindLambdaBindRawBindStaticBindSPBindUFunctionBindUObjectBindWeakLambdaBindThreadSafeSP
并未列出全部。
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);