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

相关内容:

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()来获取,例如:

Cpp代码 

 收藏代码

  1. static ConstructorHelpers::FClassFinder<AActor> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));  
  2. 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'
 

Cpp代码 

 收藏代码

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

   

B,去掉路径前缀:/Game/Blueprints/MyBlueprint

 

Cpp代码 

 收藏代码

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

 

另外注意:FClassFinder<T>的模版名称,不能直接写UBlueprint,例如:FClassFinder<UBlueprint>是错误的。创建蓝图时选择的是什么父类,则写对应的父类名,假如是Actor,那么要写成:FClassFinder<AActor>,否则无法加载成功。

 

 

使用TSubclassOf<T>时模板名必须相同

另外, FClassFinder<T>()函数中的模版名必须和TSubclassOf<T>变量的模版名一样,例如上面的都是AActor,如果不一样,也会出现上面的错误。
再给个例子:

Cpp代码 

 收藏代码

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

 

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

例如:

Cpp代码 

 收藏代码

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

 

 

之前看到很多例子是通过FObjectFinder()来获取class,现在想想感觉是无奈之举,UE4的文档比较坑,不仅蓝图的文档更新不同步,C++的文档更是少得可怜。

Cpp代码 

 收藏代码

  1. static ConstructorHelpers::FObjectFinder<UBlueprint> UnitSelector(TEXT("Blueprint'/Game/MyProject/MyBlueprint.MyBlueprint'"));  
  2. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

inside uboot (五) DRAM的构成

DRAM(Dynamic Random Access Memory)&#xff0c;即动态随机存取存储器. 1. Storage Cell 如上图&#xff0c;一个DRAM的基本存储单元由4个部分组成。 Storage Capacitor&#xff0c;即存储电容&#xff0c;它通过存储在其中的电荷的多和少&#xff0c;或者说电容两端电压差的…

使用json-lib进行Java和JSON之间的转换

转自http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库&#xff0c;提供将Java对象&#xff0c;包括beans, maps, collections, java arrays and XML等转换成JSON&#xff0c;或者反向转换的功能。 2. json-lib 主页 &#xff1a…

inside uboot (六) DRAM芯片的控制线及时序

Clock &#xff08;差分信号&#xff0c;CLK和nCLK&#xff09;为时钟信号 &#xff08;同一个rank共用&#xff09; CKE 时钟信号使能 &#xff08;同一个rank共用&#xff09; RAS 为行选…

MVC — 初步理解IIS工作流程

声明&#xff1a;本文只是自己的总结和积累。IIS7.x 目录 IIS流程及组成部分ASP.NET流程及组成部分IIS与ASP.NET MVC一、IIS流程及组成部分  1、Http.SYS&#xff1a;负责监听HTTP请求&#xff08;它不属于IIS范畴&#xff0c;但是和IIS联系紧密&#xff09; Http.SYS和IIS是…

卷积积分这样学!

卷积积分是一种数学运算&#xff0c;那么既然是数学运算&#xff0c;那么就得有数学的特性——定义、性质、定理。 本文将从卷积积分的理论、案例、求解方法、知识图谱四方面介绍卷积积分&#xff01; 一、【理论】卷积积分的理论 卷积积分定义&#xff1a; 卷积图解01 卷积…

世界地图并不是世界的真实样貌!甚至误差非常大

现在所用的世界地图并不是世界的真实样貌&#xff0c;甚至误差大的离谱。 地球属于三维球体&#xff0c;想完整地表现到二维平面上是不可能的&#xff0c;必须牺牲一些真实属性。因为三维降到二维肯定存在扭曲失真&#xff0c;这是维度差异所决定的&#xff0c;不可避免。 我们…

error MSB6006: cmd.exe exited with code 3

利用vs2012和qt5.5.1&#xff0c;在编译例子时发生如下错误&#xff1a; C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(172,5): error MSB6006: “cmd.exe”已退出&#xff0c;代码为 3。 图片如下&#xff1a; 解决办法如下&#x…

数学天才用5万字让你读懂:微积分!

前面接连发了三篇麦克斯韦方程组的文章&#xff08;积分篇、微分篇和电磁波篇&#xff09;&#xff0c;从理论上来说&#xff0c;讲麦克斯韦方程组不讲微积分是不行的&#xff0c;因为人家本来就是一组积分方程和一组微分方程。 但是&#xff0c;为了让更多人&#xff0c;尤其是…

指定一个actor对pawn不可见

1. 把一个staticmesh作成一个actor 2. 给actor添加一个tag 3. 在pawn的beginPlay里面查找这个actor&#xff0c;并设置actor的owner为pawn&#xff0c;然后调用set owner no see

oracle中DECODE与CASE的用法区别

对于CASE与DECODE其实并没有太多的区别&#xff0c;他们都是用来实现逻辑判断。Oracle的DECODE函数功能很强&#xff0c;灵活运用的话可以避免多次扫描&#xff0c;从而提高查询的性能。而CASE是9i以后提供的语法&#xff0c;这个语法更加的灵活&#xff0c;提供了IF THEN ELSE…

计算曲线的长度

若一条平面曲线可表达成标准方程 那么它的长度就是&#xff1a; 其中a、b为x的上下限。 若平面曲线可表达成参数方程 那么它的长度就是&#xff1a;

MATLAB 求曲线长度

1. 求曲线长度积分公式 2. 已知曲线方程 3. 已知系数&#xff0c;曲线方程为 y 0.0001 * x 0.0005 * x 20 4. 已知曲线的x的起点和终点 -90.78 &#xff0c;90.78 5. matlab中定义曲线方程 >> syms x; >> y 20 0.0005 * x ^ 2 0.0001 * x ^ 3; 6. matlab中…

C++调用matlab dll

1. 编写matlab函数 2. 命令行输入 mex -setup 选择 mex -setup C 3. 命令行输入 mbuild -setup 选择 mex -setup C -client MBUILD 4. 命令行输入 mcc -W cpplib:add -T link:lib add.m -C 第一个add为生成的dll名称&#xff0c;第二个add为m文件名称&#xff0c;m文…

rapidxml在qt linux(gcc)下写xml文件出错

在linux&#xff08;gcc&#xff09;下使用qt写入xml出错&#xff0c;代码如下&#xff1a; 错误如图&#xff1a;这里写图片描述 在网上找了好久没有找到答案&#xff0c;最后在http://stackoverflow.com/questions/14113923/rapidxml-print-header-has-undefined-methods找到…

SCRUM 12.03

第二轮迭代从今天起正式开始了。12月3日&#xff0c;我们举行了一次组会。 第一轮迭代结束时&#xff0c;我们意识到第二轮迭代需要实现的功能主要如下&#xff1a; 在下次迭代的时候实现对多个网站的信息进行比较取最优惠的选择&#xff0c;目前我们劲针对了一个网站的信息进行…

swift UIActivityIndicatorView

// // ActivityIndicatorViewController.swift // UIControlDemo // // Created by on 14/12/1. // Copyright (c) 2014年 马大哈. All rights reserved. // import UIKit class ActivityIndicatorViewController: BaseViewController { var waitActivity:UIActivityIndi…

UE4打包后如何调试

在项目打包后发现有一个数组越界问题&#xff0c;然而无论是 Play in Editor或是 VS选为DebugGame后启动&#xff0c;游戏都没有任何问题&#xff0c;越界问题只在打包后出现。这里记录一下自己的Debug方法。 首先将项目以DebugGame配置打包&#xff1a; 更改打包配置&#xff…