原文作者:@玄冬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高级教程建筑室内可视化 A-018---208集ue4官方从入门到精通视频教程(1080P高清中文字幕) UE4室内教程 AboutCG UE4虚幻引擎独立游戏制作教程 UE4编程教学 虚幻引擎4ok 1、Unreal Engine 4 零基础美术流程完全...
UE4 C++教程 虚幻四C++教程
UE4 C++ 离线API 下载直接使用 无障碍
实现了通过蓝图把场景中的AStaticMeshActor和两个动态材质实例UMaterialInstanceDynamic 传给c++ 自定义函数参数。 并在自定义函数里面实现两张材质的动态交替变更,其中一张材质还动态加载了本地1.png图片,使得能...
毕业设计基于C++的一款UE4射击游戏源码。一款UE4射击游戏Demo,包含UE4游戏框架及整套联网射击游戏功能。一款UE4射击游戏Demo,包含UE4游戏框架及整套联网射击游戏功能。一款UE4射击游戏Demo,包含UE4游戏框架及整套...
UE4 C++JSON读取示例.zip
该文档包含了UE4 C++ API的所有类、函数、宏、枚举等内容,并提供了详细的说明和示例代码。 文档内容 UE4 C++离线API文档的内容主要分为以下几部分: 类(Classes):该部分包含了UE4 C++ API中所有类的信息,包括...
UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源UE静态资源...
①:得到线段我们的线段集合S(本次项目鼠标点击得到线段(p1,p2两点)已经在ue4蓝图里面实现,这一步就不过多阐述) ②:移除孤立的线段(两端的点都是孤立的); ③:拆分所有的线段(就是将所有的相交线线段拆...
UE4 socket 数据接收以及发送,功能示例
1. 继承C++类的蓝图类直接调用 2.C++类中的全局函数,任意蓝图都能调用的方式。
亲测可用,内涵UE4的插件设置,从此敲C++代码的速度就起飞了
将一个多边形的所有点(点数组)按顺序输入,顺逆皆可,将其拆分成多个不重叠的三角形,输出所有三角形的点的index;
ue4动态加载资源
UE4加载本地图片
包括UE4中C++的各种常用知识点,为初学ue4游戏编程的同学提升c++编程能力提供一定的帮助!
Learning C++ by Creating Games With UE4 will start with the basics of C++: installing a code editor so you can begin to write C++ code. You will then learn how to write small, self-contained C++ ...
UE4和web网页的UI交互
1.默认关卡中,在函数中填写本地exe程序的绝对路径 2.打开工程前,重新生成VS文件
UE4学习笔记----使用C++之控制球体运动并使用移动粒子效果(源代码)