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