代理:
分類:
單播代理:
通過宏進行構建,單播代理只能繫結一個通知物件,無法進行多個物件通知、
單播代理分為有返回值與無返回值兩種
代理可使用宣告宏
函數簽名 |
宣告宏 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
常用繫結函數:
注意:繫結中傳遞的物件型別必須和函數指標所屬類的型別相同否則繫結會報錯
呼叫執行:
構建步驟:
// Actor1.h // 標頭檔案下 DECLARE_DELEGATE(DelegateOne) DECLARE_DELEGATE_RetVal_OneParam(int32 ,DelegateTwo, int32) // 變數宣告 class AActor2* ac2; DelegateOne DegOne; DelegateTwo DegTwo; // Actor1.cpp // 這裡將程式碼寫在了BeginPlay中,方便測試 ac2 = GetWorld()->SpawnActor<AActor2>(AActor2::StaticClass()); // 繫結無參無返回值單播代理 DegOne.BindUObject(ac2, &AActor2::CallBackNone); DegOne.ExecuteIfBound(); // 繫結有參有返回值單播代理 DegTwo.BindUObject(ac2, &AActor2::CallBackRes); int32 num = 0; num = DegTwo.Execute(100); UKismetSystemLibrary::PrintString(this, FString::Printf(TEXT("%d"),num)); /////////////////////////////////////////////////////// // Actor2.h //宣告兩個被用來繫結的的函數 void CallBackNone(); int32 CallBackRes(int32 num); // Actor2.cpp void AActor2::CallBackNone() { UKismetSystemLibrary::PrintString(this, TEXT("無返回值無引數函數呼叫!")); } int32 AActor2::CallBackRes(int32 num) { UKismetSystemLibrary::PrintString(this, TEXT("有返回值有引數函數呼叫!")); return num; }
測試結果:
多播代理:
無法構建具有返回值的多播代理——多播代理無返回值
DECLARE_MULTICAST_DELEGATE[_Const, _RetVal, _etc.] (DelegateName)
函數 |
說明 |
---|---|
"Add()" |
將函數委託新增到該多播委託的呼叫列表中。 |
"AddStatic()" |
新增原始C++指標全域性函數委託。 |
"AddRaw()" |
新增原始C++指標委託。原始指標不使用任何型別的參照,因此如果從委託下面刪除了物件,則呼叫此函數可能不安全。呼叫Execute()時請小心! |
"AddSP()" |
新增基於共用指標的(快速、非執行緒安全)成員函數委託。共用指標委託保留對物件的弱參照。 |
"AddUObject()" |
新增基於UObject的成員函數委託。UObject委託保留對物件的弱參照。 |
"Remove()" |
從該多播委託的呼叫列表中刪除函數(效能為O(N))。請注意,委託的順序可能不會被保留! |
"RemoveAll()" |
從該多播委託的呼叫列表中刪除繫結到指定UserObject的所有函數。請注意,委託的順序可能不會被保留! |
廣博: 呼叫函數Broadcast,但是呼叫不保證執行順序的正確性
構建步驟:
多播代理執行使用的是 Broadcast() 進行執行函數
動態代理:
動態單播代理:
動態多播代理:
操作函數:
與單播多播區別:
構建:
// Actor1.h DECLARE_DYNAMIC_DELEGATE(FDelegateTree); // 注意分號 // 變數定義 class AActor2* ac2; FDelegateTree DegTree; // Actor1.cpp ac2 = GetWorld()->SpawnActor<AActor2>(AActor2::StaticClass()); DegTree.BindDynamic(ac2, &AActor2::CallBackNone); if (DegTree.IsBound()) { DegTree.ExecuteIfBound(); } ////////////////////////////////////////////////////////// // Actor2.h UFUNCTION() void CallBackNone(); // Actor2.cpp void AActor2::CallBackNone() { UKismetSystemLibrary::PrintString(this, TEXT("無返回值無引數函數呼叫!")); }
測試結果:
動態代理用於藍圖:
在構建動態代理提供藍圖使用時,需要在代理上增加標記宏UPROPERTY(BlueprintAssignable)