[UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
来源:互联网 发布:淘宝网上哪家玉好 编辑:程序博客网 时间:2024/05/28 15:18
http://aigo.iteye.com/blog/2281373
原文作者:@玄冬Wong
相关内容:
C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
http://aigo.iteye.com/blog/2281558
C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例
http://aigo.iteye.com/blog/2268056
这里说的静态加载指的是必须在构造函数中完成的加载方式,动态加载值得是可以在Runtime期间加载的方式,UE4源码里面,前者其实是对后者的一层封装,即FObjectFinder()是对LoadObject()的封装。But,FClassFinder()不是对LoadClass()的封装,FClassFinder()内部调用的是LoadObject()。
如果要获取某个蓝图BP的类型class,可以通过ConstructorHelpers::FClassFinder()来获取,例如:
- static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));
- TSubclassOf<AActor> UnitSelectorClass = UnitSelector.Class;
但是在启动游戏时会报错提示找不到文件,例如:
Default property warnings and errors:
Error: COD Constructor (MyGameMode): Failed to find /Game/MyProject/MyBlueprint.MyBlueprint
解决办法有两种(这是UE4的一个坑,浪费了我很长时间。。。):
A,在copy reference出来的文件路径后面加_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>的模版名称,不能直接写UBlueprint,例如:FClassFinder<UBlueprint>是错误的。创建蓝图时选择的是什么父类,则写对应的父类名,假如是Actor,那么要写成:FClassFinder<AActor>,否则无法加载成功。
使用TSubclassOf<T>时模板名必须相同
另外, FClassFinder<T>()函数中的模版名必须和TSubclassOf<T>变量的模版名一样,例如上面的都是AActor,如果不一样,也会出现上面的错误。
再给个例子:
- 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;
之前看到很多例子是通过FObjectFinder()来获取class,现在想想感觉是无奈之举,UE4的文档比较坑,不仅蓝图的文档更新不同步,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
- [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
- [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
- UE4-静态加载蓝图类的方式
- QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)
- [UE4]C++实现动态加载的问题
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
- ue4-资源加载和实例化类
- 静态加载问题
- c++:静态成员变量和静态成员函数使用问题
- 动态加载和静态加载
- 《C编译原理》共享库的动态加载和静态加载
- 静态加载dll的问题
- springMVC加载静态资源问题
- UE4 异步资源加载
- UE4 异步资源加载
- ue4-异步加载资源
- UE4 PAK加载资源
- (转载)Linux 学习记录 四(Bash 和 Shell scirpt)
- java核心技术卷 之布局管理概述
- SpringMVC(一)注解
- eclipse中的web项目导入到myeclipse中
- 英语单词复数到底读s还是z?
- [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
- nodejs两种方式实现跨域(jsonp,cors)
- 从运行时看Block——披着函数外衣的结构体
- 如何有效的建模聚合(二)
- NYOJ-Binary String Matching
- 如何理解递归?
- CF516B Drazil and Tiles(拓扑排序)
- 2017年第5届东北亚 (沈阳)国际酒店用品展览会会刊(参展商名录)
- 【WEB】百度前端技术学院任务汇总