600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 虚幻引擎之使用LoadClass加载蓝图类

虚幻引擎之使用LoadClass加载蓝图类

时间:2022-02-11 07:32:58

相关推荐

虚幻引擎之使用LoadClass加载蓝图类

虚幻引擎之使用LoadClass加载蓝图类

文章目录

虚幻引擎之使用LoadClass加载蓝图类一、前言二、探究2.1 LoadClass2.2 HashObject参考文章

一、前言

看序列化相关代码,做测试时,使用LoadClass加载蓝图类。

发现如下代码不能成功加载。

UClass* StaticMeshClass = LoadClass<AActor>(nullptr, TEXT("Blueprint'/Game/Test/BP_StaticMesh.BP_StaticMesh'"));

查了下,需要使用如下代码才可以正确加载:

UClass* StaticMeshClass = LoadClass<AActor>(nullptr, TEXT("Blueprint'/Game/Test/BP_StaticMesh.BP_StaticMesh_C'"));

对比二者,可以发现需要多加一个_C

二、探究

2.1 LoadClass

采用LoadClass进行加载,会调用到如下函数:

UObject* StaticFindObjectFast(UClass* ObjectClass, UObject* ObjectPackage, FName ObjectName, bool ExactClass, bool AnyPackage, EObjectFlags ExclusiveFlags, EInternalObjectFlags ExclusiveInternalFlags);

其中:

ObjectName输入为BP_StaticMesh。

进一步,在其调用的StaticFindObjectFastInternalThreadSafe函数中,会根据Package和ObjectName计算哈希值。

然后通过哈希值去找对应的UObject。找不到,因此返回Null。

那么,大概率就是资源之前缓存的哈希值和我们现在计算得到的不相符。

2.2 HashObject

接下来,来看下虚幻是如何缓存这个资源对象的哈希值?

操作如下:

HashObject函数,打上断点;编辑器操作,对资源重命名,如加上一个数字1;

完成ReName操作后,可以看到断点被激活了!

第一次进来:

Object的名字如下,是修改后的Package名称。

第二次进来:

Object的名字是修改后的资源对象名+_C

此时,查看调用堆栈:

进入UBlueprint::RenameGeneratedClasses函数进行调试,可以发现:

其调用了一个GetBlueprintClassNames的函数。

InName为BP_StaticMesh1,输出的GenClassName为:BP_StaticMesh1_C。

主要的功能就是对名称加了一个_C的后缀。

后续在计算哈希值时也使用的是修改后的名称

因此,当用LoadClass加载蓝图类资源时,需要在后面加上_C,才能正确加载!

参考文章

UE4 C++加载蓝图类,资源方式

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。