欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UE4资源加载,持续更新中

程序员文章站 2022-06-04 23:44:20
...

在项目推进中,有很多种获取资源的需求需要我们处理。

需求举例:

例如:

1.我们需要处理C++父类的派生蓝图资源。

因为蓝图类有自己的配置,没办法直接用StaticClass直接使用蓝图子类。

2.我们需要在C++中获取资源相关的meta数据。

当然,我们可以用staticLoad等等,这些我就在文章中说一下。

 

解决办法:

资源的简单关系:

真实的关系很复杂,在此一定要区分两个概念。

资源和内容。

资源包裹着内容。

UE4的各种加载都是在读取资源。资源包裹着内容。

FAssetData说明了这一点。

而且要时刻明晰,对象和类。

在你使用各种加载的资源,通过资源内部的内容获取到类信息UClass,再通过类信息生成对象。

因为类信息也是UObject,所以在处理相关信息时,比如封装资源管理API做成资源管理Manager,很容易把自己绕进去。

UBlueprint是资源还是内容啊?说到这里,你们思考一下,它可以转换为你的类吗?答案是否。UBlueprint是资源。

单独加载资源:

解决办法多种多样,我先介绍1种:

StaticClass

UCustomUObject* u_obj=NewObject<UCustomUObject>(UCustomUObject::StaticClass());

小总结:

这是最简单的,直接创建C++类的对象。

但是如果你要创建这个类的子蓝图对象呢?比如,你有一个C++角色基类,你的每个蓝图子类修改了很多值,你该如何生成特定的蓝图子类对象呢?(当然,如果你没有C++基类也可以用哈)

ConstructorHelpers::FClassFinder

使用注意:

仅可以在构造函数里面使用。因为在构造函数里面直接拦截了

UE4资源加载,持续更新中

使用举例:

static ConstructorHelpers::FClassFinder<Actor> MyClass (TEXT("/Game/MyFloder/MyActor"));

// /Game/MyFolder 中/Game=/content,其实就是/content/YourFolder

if(MyClass.Succeeded())

{

            GetWorld()->SpawnActor(MyClass.Class);

}

一些小Tip:

UE4资源加载,持续更新中

其实就是一个模板。

检测读取是否成功调用内部方法Succeeded();其内部重写了*,至于为什么有!!,这个玩意在C++中是一个技巧,可以让你的值最终变为0或者1.算是个小技巧吧。

如果非要研究为什么在其他函数里面使用会崩掉的话,仅初步展开,展深就没完了。

另外,这玩意的底层是StaticLoadClass,只是进行封装了。。。。。。。。。

UE4资源加载,持续更新中

 

StaticLoadObject

未完待更新