UE4 代理 BindRaw和BindUObject
代理允許您在C++對象上以通用的但類型安全的方式調用成員函數。通過使用代理,可以將其動態地綁定到任何對象的成員函數上,然后在該對象上調用函數,即時調用者不知道該對象的類型也沒關系。
任何時候都應該通過引用傳遞代理。
聲明代理
通過使用以下提供的任何一個宏都可以聲明代理。所使用的宏由要綁定到該代理上的函數的簽名決定。系統預定義了各種通用函數簽名的組合、可以根據這些組合聲明代理類型、給返回值及參數填入需要的任何類型的類型名稱。現在支持使用以下任何條件組合的代理簽名:
-
返回一個值的函數
-
多達4個"負載" 變量
-
多達8個函數參數
-
聲明為 'const'的函數
| void Function() | DECLARE_DELEGATE( DelegateName ) |
| void Function( <Param1> ) | DECLARE_DELEGATE_OneParam( DelegateName, Param1Type ) |
| void Function( <Param1>, <Param2> ) | DECLARE_DELEGATE_TwoParams( DelegateName, Param1Type, Param2Type ) |
| void Function( <Param1>, <Param2>, ... ) | DECLARE_DELEGATE_<Num>Params( DelegateName, Param1Type, Param2Type, ... ) |
| <RetVal> Function() | DECLARE_DELEGATE_RetVal( RetValType, DelegateName ) |
| <RetVal> Function( <Param1> ) | DECLARE_DELEGATE_RetVal_OneParam( RetValType, DelegateName, Param1Type ) |
| <RetVal> Function( <Param1>, <Param2> ) | DECLARE_DELEGATE_RetVal_TwoParams( RetValType, DelegateName, Param1Type, Param2Type ) |
| <RetVal> Function( <Param1>, <Param2>, ... ) | DECLARE_DELEGATE_RetVal_<Num>Params( RetValType, DelegateName, Param1Type, Param2Type, ... ) |
綁定代理
代理系統理解某些對象類型,且當使用這些對象時會啟用附加功能。如果您把一個代理綁定到一個UObject或共享的指針類上,代理系統可以保持一個到該對象的弱引用,以便當該對象在該代理的底層被銷毀了時,您可以通過調用?IsBound()?或?ExecuteIfBound()?函數處理這些情況。注意,所支持的各種對象類型有特定的綁定語法。
| Bind() | 綁定到一個現有的代理對象上。 |
| BindRaw() | 綁定到一個原始的C++指針全局函數代理上。原始指針不使用任何引用,所以如果從代理的底層刪除了該對象,那么調用它可能是不安全的。因此,當調用Execute()時一定要小心! |
| BindSP() | 綁定一個基于共享指針的成員函數代理。共享指針代理保持到您的對象的弱引用。您可以使用?ExecuteIfBound()?來調用它們。 |
| BindUObject() | 綁定一個基于UObject的成員函數代理。UObject 代理保持到您的對象的弱引用。您可以使用?ExecuteIfBound()?來調用它們。 |
| UnBind() | 解除綁定該代理。 |
例如我在項目中遇到的:
GM->SPState->UpdateStateWidget.BindRaw(GameHUDWidget->PlayerStateWidget.Get(), &SSIAiPlayerStateWidget::UpdateStateWidget);
PlayerStateWidget繼承自SWidget
ShortcutWidget->RegisterShortCutContainer.BindUObject(GM->SPState,&ASIAiPlayerState::RegisterShortCutContainer);
SPState為APlayerState子類,最終繼承自UObject,所以使用BindUObject。
?
執行代理
綁定到代理上的函數可以通過調用代理的?Execute()?函數進行執行。在執行這些函數之前必須檢查是否已經“綁定”了代理。這是為了使得代碼更加安全,因為可能代理有時會具有未初始化且后續要訪問的返回值及輸出參數。執行一個未綁定的代理實際上有時會擾亂內存。可以調用?IsBound()?來判斷執行該代理是否安全。同時,對于沒有返回值的代理,您可以調用?ExecuteIfBound()?函數,但是一定要注意那些可能未初始化的輸出參數。
| Execute() | ? |
| ExecuteIfBound() | ? |
| IsBound() |
轉載于:https://www.cnblogs.com/lixiao24/p/9236229.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的UE4 代理 BindRaw和BindUObject的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html-edm(邮件营销)编写规则
- 下一篇: STM32F10x 使用SysTick的