原文作者:@玄冬Wong
相关内容:
C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
http://aigo.iteye.com/blog/2281373
C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例
http://aigo.iteye.com/blog/2268056
动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T>() ,两者均在在UObjectGlobals.h中。
区别:
LoadObject<T>()用来加载非蓝图资源,比如动画、贴图、音效等资源;
LoadClass<T>()用来加载蓝图并获取蓝图Class,比如角色蓝图。如果要用蓝图创建对象,必须先通过LoadClass获取class,然后再通过SpawnActor生成对象。
LoadClass参数注意事项:
另外注意:LoadClass<T>的模版名称,不能直接写UBlueprint,例如:LoadClass<UBlueprint>是错误的,创建蓝图时选择的是什么父类,则写对应的父类名,假如是Actor,那么要写成:LoadClass<AActor>,否则无法加载成功。
路径名也必须带_C后缀(LoadObject不需要带_C后缀),例如,蓝图路径是:Blueprint'/Game/Blueprints/MyBP.MyBP',
加后缀以后,则是:Blueprint'/Game/Blueprints/MyBP.MyBP_C',
例子:
UClass* Test = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/Blueprints/MapPathBrush_BP.MapPathBrush_BP_C'"));
官方还没出文档,只能先看代码注释:
// Load an object.
template< class T >
inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}
// Load a class object.
template< class T >
inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}
/**
* Find or load an object by string name with optional outer and filename specifications.
* These are optional because the InName can contain all of the necessary information.
*
* @param ObjectClass The class (or a superclass) of the object to be loaded.
* @param InOuter An optional object to narrow where to find/load the object from
* @param InName String name of the object. If it's not fully qualified, InOuter and/or Filename will be needed
* @param Filename An optional file to load from (or find in the file's package object)
* @param LoadFlags Flags controlling how to handle loading from disk
* @param Sandbox A list of packages to restrict the search for the object
* @param bAllowObjectReconciliation Whether to allow the object to be found via FindObject in the case of seek free loading
*
* @return The object that was loaded or found. NULL for a failure.
*/
COREUOBJECT_API UObject* StaticLoadObject( UClass* Class, UObject* InOuter, const TCHAR* Name, const TCHAR* Filename = NULL, uint32 LoadFlags = LOAD_None, UPackageMap* Sandbox = NULL, bool bAllowObjectReconciliation = true );
COREUOBJECT_API UClass* StaticLoadClass(UClass* BaseClass, UObject* InOuter, const TCHAR* Name, const TCHAR* Filename = NULL, uint32 LoadFlags = LOAD_None, UPackageMap* Sandbox = NULL);
LoadObject参数注意事项:
LoadObject加载例子,不需要添加后缀:
UTexture2D* Tex = LoadObject<UTexture2D>(NULL, TEXT("Texture2D'/Game/Textures/UI/tex_test001.tex_test001'"));
可以用LoadObject加载的文件包括:
Texture、Material、SoundWave、SoundCue、ParticlesSystem、AnimMontage、BlendSpace(1D,2D,3D)、AnimSequence、AnimBlueprint、SkeletalMesh等等。这些文件的父类都是UObject,所以也可以先加载为UObject*然后再强转为具体的类型,例如:
UObject* Obj = LoadObject<UObject>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));
USkeletalMesh* MyMesh = Cast<USkeletalMesh*>(Obj);
另外有两个全局函数叫:StaticLoadObject()和StaticLoadClass(),应该是LoadObject<T>()和LoadClass<T>()的早期版本,前者需要手动强转,后者使用模版封装过,使用更方便,推荐使用后者
LoadClass除了可以加载蓝图,还可以加载UObject类型的native class:
UClass* Test = LoadClass<AActor>(NULL, TEXT("Class'/Script/MyProj.MyProjCharacter'"));
分享到:
相关推荐
在UE4(Unreal Engine 4)中,动态加载资源是一项关键功能,它允许游戏或应用在运行时根据需要加载和卸载资产,从而优化内存使用和性能。UE4使用了一种模块化的设计,使得资源管理变得更加灵活。下面将详细探讨如何...
百度百科约500万条词条,可用于语义关联或简单的知识网络建立,xml格式,解压后638M,请不要用记事本直接打开,我是用UE打开的,sublime好像会有乱码,文件内容示例如下: <REC> <ID>=1 <TITLE>=百度百科 ...
实现了通过蓝图把场景中的AStaticMeshActor和两个动态材质实例UMaterialInstanceDynamic 传给c++ 自定义函数参数。 并在自定义函数里面实现两张材质的动态交替变更,其中一张材质还动态加载了本地1.png图片,使得能...
在UE4(Unreal Engine 4)中,C++是一种常用的语言进行游戏开发,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,常用于存储和传输数据。本示例将详细介绍如何在UE4中使用C++来读取JSON文件。 ...
本教程将详细解释如何在UE4中加载和使用本地图片。 首先,我们需要了解UE4的项目结构。一个标准的UE4项目通常包含以下部分: 1. **MyProject.uproject**:这是项目的配置文件,包含了项目的基本信息,如版本、名称...
本篇文章将详细讲解如何使用C++标准库中的`<chrono>`和`<ctime>`头文件来实现这个功能。 首先,`<chrono>`库是C++11引入的现代时间处理库,提供了更为灵活和精确的时间操作。而`<ctime>`是C++98标准库的一部分,...
<CR><LF>M5310-A<CR><LF>OK<CR><LF> After this string has been received the AT Command processor is ready to accept AT commands. If the Applications core was rebooted or restarted for any reason that ...
<div class=wrap> <ul class=list> <li><a>UI设计师</a> <div class=show> <p>所属部门:技术部</p> <p>工作地点:郑州</p> <p>招聘人数:21</p> </div> </li> <li><a>前端开发工程师</a> <div class=show> <p>所属...
在C++中,这通常涉及到`FSoftObjectPath`和`LoadObject`函数。 8. **性能优化**:虽然这是一个简单的例子,但考虑性能总是很重要的。确保在不需要时释放资源,避免内存泄漏,并合理地缓存对象,可以提升应用的效率...
<CR><LF>FIRMWARE DOWNLOADING<CR><LF> Indicates UE is downloading update package. <CR><LF>FIRMWARE DOWNLOAD FAILED<CR><LF> Indicates download failed. <CR><LF>FIRMWARE DOWNLOADED<CR><LF> Indicates ...
为了与UE4的游戏逻辑交互,你还需要实现JavaScript与C++之间的通信。UE4提供了`FString`和`ExecuteJavaScript`函数,允许你在Blueprint中执行JavaScript代码或获取JavaScript的返回值。 例如,你可能希望根据游戏中...
在vue的实际开发过程中,我们如何将以选中的值直接渲染到页面中,这次主要说的是多选框和下拉列表的实现: <label>测试多选渲染:</label> <div> <template v-for=item> <input type=checkbox name=hobby :...
html代码如下: 代码如下: <div class=”wrap”> <ul class=”list> <li><a>UI设计师</a> <div class=”show”> <p>所属部门:技术部</p> <p>工作地点:郑州</p> <p>招聘人数:21</p> </div> </li> <li><a>前端开发...
发一个小工具软件 用于对付大量机械操作, 完全绿色版本 免安装直接运行<br><br>当大家进行大批量查询 比如:<br><br>SELECT * FROM TABLE <br>WHERE 字段A in<br>(<br>......................................<br>)...
<el click.once=submitOrder()>提交订单</el> </div> </template> 方法: methods: { submitOrder() { // 处理逻辑 } } 2、使用原生JS事件 在数据data里面声明一个flag属性 data() { return { isSubmit: ...
上周新接手一个网站建设的活儿,其中有需要要jquery代码...<div class=navMenu> <ul> <li><a>首页</a> <ul> <li><a>JavaScript+</a> <ul> <li><a>三角函数</a></li> <li><a>矩形</a></li> </ul> </li> <li><a>语文</a>
在这个“ue4 json文件的读取和修改 项目示例”中,我们将探讨如何在UE4 C++工程中实现JSON文件的读取和修改功能。 首先,UE4集成了一套方便的JSON库,名为TJson,它是基于nlohmann/json第三方库的封装,允许开发者...
UE4 C++教程 虚幻四C++教程