虚幻引擎之使用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,才能正确加载!