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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

[UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()

發(fā)布時(shí)間:2023/12/10 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder() 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

相關(guān)內(nèi)容:

C++實(shí)現(xiàn)動(dòng)態(tài)加載的問(wèn)題:LoadClass<T>()和LoadObject<T>()?

http://aigo.iteye.com/blog/2281558
C++實(shí)現(xiàn)動(dòng)態(tài)加載UObject:StaticLoadObject();以Texture和Material為例

http://aigo.iteye.com/blog/2268056

?

這里說(shuō)的靜態(tài)加載指的是必須在構(gòu)造函數(shù)中完成的加載方式,動(dòng)態(tài)加載值得是可以在Runtime期間加載的方式,UE4源碼里面,前者其實(shí)是對(duì)后者的一層封裝,即FObjectFinder()是對(duì)LoadObject()的封裝。But,FClassFinder()不是對(duì)LoadClass()的封裝,FClassFinder()內(nèi)部調(diào)用的是LoadObject()。

?

?

如果要獲取某個(gè)藍(lán)圖BP的類型class,可以通過(guò)ConstructorHelpers::FClassFinder()來(lái)獲取,例如:

Cpp代碼?

?

  • static?ConstructorHelpers::FClassFinder<AActor>?UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));??
  • TSubclassOf<AActor>?UnitSelectorClass?=?UnitSelector.Class;??
  • ?
    但是在啟動(dòng)游戲時(shí)會(huì)報(bào)錯(cuò)提示找不到文件,例如:

    ?

    Default property warnings and errors:

    Error: COD Constructor (MyGameMode): Failed to find /Game/MyProject/MyBlueprint.MyBlueprint

    ?

    解決辦法有兩種(這是UE4的一個(gè)坑,浪費(fèi)了我很長(zhǎng)時(shí)間。。。):

    A,在copy reference出來(lái)的文件路徑后面加_C,例如:Blueprint'/Game/Blueprints/MyBlueprint.MyBlueprint_C'
    ?

    Cpp代碼?

    ?

  • static?ConstructorHelpers::FClassFinder<AActor>?UnitSelector(TEXT("Blueprint'/Game/Blueprints/MyBlueprint.MyBlueprint_C'"));??
  • TSubclassOf<AActor>?UnitSelectorClass?=?UnitSelector.Class;??
  • ???

    B,去掉路徑前綴:/Game/Blueprints/MyBlueprint

    ?

    Cpp代碼?

    ?

  • static?ConstructorHelpers::FClassFinder<AActor>?UnitSelector(TEXT("/Game/Blueprints/MyBlueprint"));??
  • TSubclassOf<AActor>?UnitSelectorClass?=?UnitSelector.Class;??
  • ?

    另外注意:FClassFinder<T>的模版名稱,不能直接寫UBlueprint,例如:FClassFinder<UBlueprint>是錯(cuò)誤的。創(chuàng)建藍(lán)圖時(shí)選擇的是什么父類,則寫對(duì)應(yīng)的父類名,假如是Actor,那么要寫成:FClassFinder<AActor>,否則無(wú)法加載成功。

    ?

    ?

    使用TSubclassOf<T>時(shí)模板名必須相同

    另外,?FClassFinder<T>()函數(shù)中的模版名必須和TSubclassOf<T>變量的模版名一樣,例如上面的都是AActor,如果不一樣,也會(huì)出現(xiàn)上面的錯(cuò)誤。
    再給個(gè)例子:

    Cpp代碼?

    ?

  • static?ConstructorHelpers::FClassFinder<UUserWidget>?TestBP(TEXT("/Game/Blueprints/MyWidget_BP"));??
  • TSubclassOf<UUserWidget>?MyWidgetClass?=?TestBP.Class;??
  • ?

    也可使用UClass*替換TSubclassOf<T>

    例如:

    Cpp代碼?

    ?

  • static?ConstructorHelpers::FClassFinder<UUserWidget>?TestBP(TEXT("/Game/Blueprints/MyWidget_BP"));??
  • UClass*?MyWidgetClass?=?TestBP.Class;??
  • ?

    ?

    之前看到很多例子是通過(guò)FObjectFinder()來(lái)獲取class,現(xiàn)在想想感覺(jué)是無(wú)奈之舉,UE4的文檔比較坑,不僅藍(lán)圖的文檔更新不同步,C++的文檔更是少得可憐。

    Cpp代碼?

    ?

  • static?ConstructorHelpers::FObjectFinder<UBlueprint>?UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));??
  • TSubclassOf<AActor>?UnitSelectorClass?=?(UClass*)UnitSelector.Object->GeneratedClass;??
  • ?

    ?

    ?

    其他參考:

    CDO Constructor: Failed to find Blueprint

    https://answers.unrealengine.com/questions/84880/cdo-constructor-failed-to-find-blueprint-ue-44.html

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的[UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。