UE4 C++靜態(tài)加載問(wèn)題的解決方法
這里說(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)獲取,例如:
- 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'
- static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/Blueprints/MyBlueprint.MyBlueprint_C'"));
- TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
B,去掉路徑前綴:/Game/Blueprints/MyBlueprint
- static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("/Game/Blueprints/MyBlueprint"));
- TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
另外注意:FClassFinder<T>的模版名稱,不能直接寫(xiě)UBlueprint,例如:FClassFinder<UBlueprint>是錯(cuò)誤的。創(chuàng)建藍(lán)圖時(shí)選擇的是什么父類,則寫(xiě)對(duì)應(yīng)的父類名,假如是Actor,那么要寫(xiě)成:FClassFinder<AActor>,否則無(wú)法加載成功。
使用TSubclassOf<T>時(shí)模板名必須相同
另外, FClassFinder<T>()函數(shù)中的模版名必須和TSubclassOf<T>變量的模版名一樣,例如上面的都是AActor,如果不一樣,也會(huì)出現(xiàn)上面的錯(cuò)誤。
再給個(gè)例子:
- static ConstructorHelpers::FClassFinder<UUserWidget> TestBP(TEXT("/Game/Blueprints/MyWidget_BP"));
- TSubclassOf<UUserWidget> MyWidgetClass = TestBP.Class;
也可使用UClass*替換TSubclassOf<T>
例如:
- 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++的文檔更是少得可憐。
- 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
-
分享到:
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
- 用戶名:
- 密 碼:
- 驗(yàn)證碼:
看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
- V-Ray 基礎(chǔ)教程整合
- zbrush制作小火龍教程
- Unity插件綜合教程
- 如何用C++實(shí)現(xiàn)策略模式
- 12節(jié)Unity 特效教程集合
- Unity 項(xiàng)目教程集合
- V-Ray 物理相機(jī)相關(guān)教程
- ZBrush水族女王完全雕刻

<p>《工業(yè)創(chuàng)意設(shè)計(jì)理論與實(shí)踐》適用于工業(yè)設(shè)計(jì)類專業(yè)研究...