UE4中资源加载资源的方式
在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as Material,则可以返回一个材质的引用...
在UE4中,加载资源的方式区别较大.经过自己一个下午的摸索,目前发现了这4种资源的加载方式.在UE4中,它的蓝图就大致等于UNTIY中的prefab.所以我们将资源弄成了蓝图的方式来进行加载.
第一种: 如果该蓝图有C++类(或者说是从C++类创建的蓝图),直接进行加载
- ATemp* spawnActor = GetWorld()->SpawnActor<ATemp>(ATemp::StaticClass());
 
所有的加载资源并创建到场景中的方式都离不开SpawnActor这一句代码.如果你的蓝图包含了C++类,那么可以直接访问类的StaticClass
剩下的加载方式均是单纯的加载蓝图,并没有对应的C++类
第二种: 通过ConstructorHelpers来加载
- static ConstructorHelpers::FClassFinder<AActor> bpClass(TEXT("/Game/BluePrint/TestObj"));
 - if(bpClass.Class != NULL)
 - {
 - GetWorld()->SpawnActor(bpClass.Class);
 - }
 
FClassFinder是一个结构体,其中的Class成员变量是TSubClassof<T>类型的.所以我们只需要SpawnActor(bpClass.Class)就可以生成我们要的东西了
但是值得一提的是该方法只能在类的构造函数中使用,如果在普通的逻辑代码中嵌套这份代码,很可能引起整个编译器的crash.以下是该代码的具体执行步骤
- struct FClassFinder
 - {
 - TSubclassOf<T> Class;
 - FClassFinder(const TCHAR* ClassToFind)
 - {
 - CheckIfIsInConstructor(ClassToFind);
 - FString PathName(ClassToFind);
 - StripObjectClass(PathName, true);
 - Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());
 - ValidateObject(*Class, PathName, *PathName);
 - }
 - bool Succeeded()
 - {
 - return !!*Class;
 - }
 - };
 
不难看出该方法在一开头的地方就先检查了是否在构造函数中.CheckIfIsInConstructor,,如果不是的话可能会引起crash(具体原因不明)...然后通过路径去找到我们要加载的类,并返回给我们.另外一点,该变量必须是static的...
第三种: 通过FStringAssetReference来加载
- FStringAssetReference asset = "Blueprint'/Game/BluePrint/TestObj.TestObj'";
 - UObject* itemObj = asset.ResolveObject();
 - UBlueprint* gen = Cast<UBlueprint>(itemObj);
 - if (gen != NULL)
 - {
 - AActor* spawnActor = GetWorld()->SpawnActor<AActor>(gen->GeneratedClass);
 - }*/
 
FStringAssetReference类的作用主要是通过一个字符串,找到该字符串所对应的资源.或者通过给定的资源,找到该资源所对应的在项目中的路径,也就是前面所说的字符串
其中,asset.ResolveObject就是查找字符串对应的资源,返回一个UObejct,我们通过将其转化成UBlueprint类型然后再去的他的GenerateClass即可.
第四种: 通过StaticLoadObject来加载
- UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));
 - if (loadObj != nullptr)
 - {
 - UBlueprint* ubp = Cast<UBlueprint>(loadObj);
 - AActor* spawnActor = GetWorld()->SpawnActor<AActor>(ubp->GeneratedClass);
 - UE_LOG(LogClass, Log, TEXT("Success"));
 - }
 
原理的话几乎是和第三种是一样的.只是调用的方式不同而已.在这里就不再赘述了.
总结下来,第三种和第四种应该是最通用的.因为第一种要求有对应的蓝图C++类,而第二种又要求一定要是在构造函数中完成(不论是在谁的构造函数都可以,但该方法一定只能在构造函数中调用)...
想不到一个简单的加载资源也有这么多种方式...我已经给跪了...天呐...
UE4中资源加载资源的方式的更多相关文章
- UE4:四种加载资源的方式
		
转自:https://blog.csdn.net/zhangxsv123/article/details/79707686 第一种: 如果该蓝图有C++类(或者说是从C++类创建的蓝图),直接进行加载 ...
 - Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象
		
目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...
 - 手撸Spring框架,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
		
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你写的代码,能接的住产品加需求吗? 接,是能接的,接几次也行,哪怕就一个类一片的 i ...
 - 06.Spring 资源加载 - ResourceLoader
		
基本概念 ResourceLoader 接口,在 Spring 中用于加载资源,通过它可以获取一个 Resouce 对象. 内部构造 首先来看它的接口定义: public interface Reso ...
 - androidStudio中如何加载字体资源?
		
在android中字体的格式总是不能尽善尽美的显示出来 , 于是要求我们使用一些有美感的字体,加载的方式(就像HTML的字体一样),我们需要通过加载字体的方式来使用android中不曾提供的字体; ...
 - SpringBoot jar包中资源加载问题
		
在IDE下调试怎么也没有发现问题,但是部署到服务器上,提示找不到资源,找了半天资料总算是找到了原因: Jar包中的资源加载不能使用File方式,只能使用InputStream方式读取.知道原因就好解决 ...
 - [UE4]一个好用的虚幻4插件,根据资源名称动态加载资源,GetCurrentLeveName(获得当前地图名称)
		
下载地址 一.下载与UE4相对应的版本 二.在工程根目录新建Plugins目录,解压插件. 三.如果工程已经打开,则需要重新打开 四.重新打开工程后,右下角会有提示有新插件可用. 五.这个插件提供 ...
 - 通过源码浅析Java中的资源加载
		
前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...
 - 简说Spring中的资源加载
		
声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...
 
随机推荐
- Mac下php版本不支持imagetfftext函数问题
			
brew rm freetype jpeg libpng gd zlib brew install freetype jpeg libpng gd zlib brew install php71 ht ...
 - CodeIgniter底层数据库类继承关系
			
1.CI_DB_mysql_driver 继承 CI_DB, CI_DB这个类是不存在的,每次调用文件中~/CodeIgniter_2.1.3/system/database/DB.php函数&am ...
 - Java for LeetCode 121 Best Time to Buy and Sell Stock
			
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
 - Python网络编程--Echo服务
			
Python网络编程--Echo服务 学习网络编程必须要练习的三个小项目就是Echo服务,Chat服务和Proxy服务.在接下来的几篇文章会详细介绍. 今天就来介绍Echo服务,Echo服务是最基本的 ...
 - 织梦CMS博客风格模板
			
织梦CMS博客风格模板,织梦CMS,博客模板,CMS模板.程序模板. 模板地址:http://www.huiyi8.com/sc/7248.html
 - oracle中导出sql的几个常见词语的意思
			
set feedback off不显示反馈信息 “1行已插入”,大量数据装入时,显示这个也是很浪费资源和时间的. set define off 如果你某个字段里面有&字符,插入数据会出错,设 ...
 - hdu-2169 Computer(树形dp+树的直径)
			
题目链接: Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
 - python raw string
			
path = r'C:\a\b\c.txt' r'字符串' 是raw 字符串的意思, 其中的字符串不会转义,即不解释 \ . 作用之一:可以用来保存Windows的路径,直接从资源管理器复制来粘贴,不 ...
 - 机器学习 F1-Score, recall, precision
			
在机器学习,模式识别中,我们做分类的时候,会用到一些指标来评判算法的优劣,最常用的就是识别率,简单来说,就是 Acc=Npre/Ntotal 这里的 Npre表示预测对的样本数,Ntotal表示测试集 ...
 - 注意!!一定要谨慎使用c/c++原生指针
			
使用指针,要非常小心,今天在做一个小游戏时,就碰到一个使用原生指针的问题,找了好几个小时,才定位到问题的所在,晕. 主要是顶层逻辑中引用了一个指针,而在业务逻辑中将此指针删除了.这种在代码量很少的情况 ...
 
			
		