`
aigo
  • 浏览: 2566267 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()

UE4 
阅读更多

原文作者:@玄冬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动态加载资源路径信息

    在UE4(Unreal Engine 4)中,动态加载资源是一项关键功能,它允许游戏或应用在运行时根据需要加载和卸载资产,从而优化内存使用和性能。UE4使用了一种模块化的设计,使得资源管理变得更加灵活。下面将详细探讨如何...

    百度百科词条

    百度百科约500万条词条,可用于语义关联或简单的知识网络建立,xml格式,解压后638M,请不要用记事本直接打开,我是用UE打开的,sublime好像会有乱码,文件内容示例如下: &lt;REC&gt; &lt;ID&gt;=1 &lt;TITLE&gt;=百度百科 ...

    ue4蓝图c++动态改变staticmeshactor材质例子动态修改纹理

    实现了通过蓝图把场景中的AStaticMeshActor和两个动态材质实例UMaterialInstanceDynamic 传给c++ 自定义函数参数。 并在自定义函数里面实现两张材质的动态交替变更,其中一张材质还动态加载了本地1.png图片,使得能...

    UE4 C++JSON读取示例.zip

    在UE4(Unreal Engine 4)中,C++是一种常用的语言进行游戏开发,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,常用于存储和传输数据。本示例将详细介绍如何在UE4中使用C++来读取JSON文件。 ...

    UE4加载本地图片本地图片

    本教程将详细解释如何在UE4中加载和使用本地图片。 首先,我们需要了解UE4的项目结构。一个标准的UE4项目通常包含以下部分: 1. **MyProject.uproject**:这是项目的配置文件,包含了项目的基本信息,如版本、名称...

    C++实现获取本地时间

    本篇文章将详细讲解如何使用C++标准库中的`&lt;chrono&gt;`和`&lt;ctime&gt;`头文件来实现这个功能。 首先,`&lt;chrono&gt;`库是C++11引入的现代时间处理库,提供了更为灵活和精确的时间操作。而`&lt;ctime&gt;`是C++98标准库的一部分,...

    M5310-A模组AT指令手册2.0

    &lt;CR&gt;&lt;LF&gt;M5310-A&lt;CR&gt;&lt;LF&gt;OK&lt;CR&gt;&lt;LF&gt; 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 ...

    用jquery模仿的a的title属性的例子

    &lt;div class=wrap&gt; &lt;ul class=list&gt; &lt;li&gt;&lt;a&gt;UI设计师&lt;/a&gt; &lt;div class=show&gt; &lt;p&gt;所属部门:技术部&lt;/p&gt; &lt;p&gt;工作地点:郑州&lt;/p&gt; &lt;p&gt;招聘人数:21&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li&gt;&lt;a&gt;前端开发工程师&lt;/a&gt; &lt;div class=show&gt; &lt;p&gt;所属...

    UE4 UI简单例子 C++

    在C++中,这通常涉及到`FSoftObjectPath`和`LoadObject`函数。 8. **性能优化**:虽然这是一个简单的例子,但考虑性能总是很重要的。确保在不需要时释放资源,避免内存泄漏,并合理地缓存对象,可以提升应用的效率...

    中移物联 M5310 AT指令 英文版

    &lt;CR&gt;&lt;LF&gt;FIRMWARE DOWNLOADING&lt;CR&gt;&lt;LF&gt; Indicates UE is downloading update package. &lt;CR&gt;&lt;LF&gt;FIRMWARE DOWNLOAD FAILED&lt;CR&gt;&lt;LF&gt; Indicates download failed. &lt;CR&gt;&lt;LF&gt;FIRMWARE DOWNLOADED&lt;CR&gt;&lt;LF&gt; Indicates ...

    vue表单绑定实现多选框和下拉列表的实例

    在vue的实际开发过程中,我们如何将以选中的值直接渲染到页面中,这次主要说的是多选框和下拉列表的实现: &lt;label&gt;测试多选渲染:&lt;/label&gt; &lt;div&gt; &lt;template v-for=item&gt; &lt;input type=checkbox name=hobby :...

    UE4使用Echart项目

    为了与UE4的游戏逻辑交互,你还需要实现JavaScript与C++之间的通信。UE4提供了`FString`和`ExecuteJavaScript`函数,允许你在Blueprint中执行JavaScript代码或获取JavaScript的返回值。 例如,你可能希望根据游戏中...

    用jquery模仿的a的title属性(兼容ie6/7)

    html代码如下: 代码如下: &lt;div class=”wrap”&gt; &lt;ul class=”list&gt; &lt;li&gt;&lt;a&gt;UI设计师&lt;/a&gt; &lt;div class=”show”&gt; &lt;p&gt;所属部门:技术部&lt;/p&gt; &lt;p&gt;工作地点:郑州&lt;/p&gt; &lt;p&gt;招聘人数:21&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li&gt;&lt;a&gt;前端开发...

    selectIn构造工具

    发一个小工具软件 用于对付大量机械操作, 完全绿色版本 免安装直接运行&lt;br&gt;&lt;br&gt;当大家进行大批量查询 比如:&lt;br&gt;&lt;br&gt;SELECT * FROM TABLE &lt;br&gt;WHERE 字段A in&lt;br&gt;(&lt;br&gt;......................................&lt;br&gt;)...

    Vue表单提交点击事件只允许点击一次的实例

    &lt;el click.once=submitOrder()&gt;提交订单&lt;/el&gt; &lt;/div&gt; &lt;/template&gt; 方法: methods: { submitOrder() { // 处理逻辑 } } 2、使用原生JS事件 在数据data里面声明一个flag属性 data() { return { isSubmit: ...

    jQuery实现三级菜单的代码

    上周新接手一个网站建设的活儿,其中有需要要jquery代码...&lt;div class=navMenu&gt; &lt;ul&gt; &lt;li&gt;&lt;a&gt;首页&lt;/a&gt; &lt;ul&gt; &lt;li&gt;&lt;a&gt;JavaScript+&lt;/a&gt; &lt;ul&gt; &lt;li&gt;&lt;a&gt;三角函数&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a&gt;矩形&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;a&gt;语文&lt;/a&gt;

    ue4 json文件的读取和修改 项目示例

    在这个“ue4 json文件的读取和修改 项目示例”中,我们将探讨如何在UE4 C++工程中实现JSON文件的读取和修改功能。 首先,UE4集成了一套方便的JSON库,名为TJson,它是基于nlohmann/json第三方库的封装,允许开发者...

    UE4 C++教程 虚幻四C++教程

    UE4 C++教程 虚幻四C++教程

Global site tag (gtag.js) - Google Analytics