日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UE4 代理 BindRaw和BindUObject

發布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。