UE4中资源加载资源的方式

在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as Material,则可以返回一个材质的引用...

在UE4中,加载资源的方式区别较大.经过自己一个下午的摸索,目前发现了这4种资源的加载方式.在UE4中,它的蓝图就大致等于UNTIY中的prefab.所以我们将资源弄成了蓝图的方式来进行加载.

第一种: 如果该蓝图有C++类(或者说是从C++类创建的蓝图),直接进行加载
[cpp] view plain copy在CODE上查看代码片派生到我的代码片
1. ATemp* spawnActor = GetWorld()->SpawnActor(ATemp::StaticClass());

所有的加载资源并创建到场景中的方式都离不开SpawnActor这一句代码.如果你的蓝图包含了C++类,那么可以直接访问类的StaticClass


剩下的加载方式均是单纯的加载蓝图,并没有对应的C++类

第二种: 通过ConstructorHelpers来加载

[cpp] view plain copy在CODE上查看代码片派生到我的代码片
1. staticConstructorHelpers::FClassFinder bpClass(TEXT("/Game/BluePrint/TestObj"));
2. if(bpClass.Class != NULL)
3. {
4. GetWorld()->SpawnActor(bpClass.Class);
5. }
FClassFinder是一个结构体,其中的Class成员变量是TSubClassof类型的.所以我们只需要SpawnActor(bpClass.Class)就可以生成我们要的东西了

但是值得一提的是该方法只能在类的构造函数中使用,如果在普通的逻辑代码中嵌套这份代码,很可能引起整个编译器的crash.以下是该代码的具体执行步骤

[cpp] view plain copy在CODE上查看代码片派生到我的代码片
1. structFClassFinder
2. {
3. TSubclassOf Class;
4. FClassFinder(constTCHAR ClassToFind)
5. {
6. CheckIfIsInConstructor(ClassToFind);
7. FString PathName(ClassToFind);
8. StripObjectClass(PathName,true);
9. Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());
10. ValidateObject(
Class, PathName, PathName);
11. }
12. boolSucceeded()
13. {
14. return!!
Class;
15. }
16. };
不难看出该方法在一开头的地方就先检查了是否在构造函数中.CheckIfIsInConstructor,,如果不是的话可能会引起crash(具体原因不明)...然后通过路径去找到我们要加载的类,并返回给我们.另外一点,该变量必须是static的...


第三种: 通过FStringAssetReference来加载
[cpp] view plain copy在CODE上查看代码片派生到我的代码片
1. FStringAssetReference asset ="Blueprint'/Game/BluePrint/TestObj.TestObj'";
2. UObject itemObj = asset.ResolveObject();
3. UBlueprint
gen = Cast(itemObj);
4. if(gen != NULL)
5. {
6. AActor spawnActor = GetWorld()->SpawnActor(gen->GeneratedClass);
7. }
/
FStringAssetReference类的作用主要是通过一个字符串,找到该字符串所对应的资源.或者通过给定的资源,找到该资源所对应的在项目中的路径,也就是前面所说的字符串

其中,asset.ResolveObject就是查找字符串对应的资源,返回一个UObejct,我们通过将其转化成UBlueprint类型然后再去的他的GenerateClass即可.


第四种: 通过StaticLoadObject来加载

[cpp] view plain copy在CODE上查看代码片派生到我的代码片
1. UObject loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));
2. if(loadObj != nullptr)
3. {
4. UBlueprint
ubp = Cast(loadObj);
5. AActor* spawnActor = GetWorld()->SpawnActor(ubp->GeneratedClass);
6. UE_LOG(LogClass, Log, TEXT("Success"));
7. }
原理的话几乎是和第三种是一样的.只是调用的方式不同而已.在这里就不再赘述了.

总结下来,第三种和第四种应该是最通用的.因为第一种要求有对应的蓝图C++类,而第二种又要求一定要是在构造函数中完成(不论是在谁的构造函数都可以,但该方法一定只能在构造函数中调用)...


想不到一个简单的加载资源也有这么多种方式...我已经给跪了...天呐...
原文链接: https://www.cnblogs.com/nafio/p/9137066.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/259807

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午1:01
下一篇 2023年2月14日 下午1:03

相关推荐