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
使用注意:
仅可以在构造函数里面使用。因为在构造函数里面直接拦截了
使用举例:
static ConstructorHelpers::FClassFinder<Actor> MyClass (TEXT("/Game/MyFloder/MyActor"));
// /Game/MyFolder 中/Game=/content,其实就是/content/YourFolder
if(MyClass.Succeeded())
{
GetWorld()->SpawnActor(MyClass.Class);
}
一些小Tip:
其实就是一个模板。
检测读取是否成功调用内部方法Succeeded();其内部重写了*,至于为什么有!!,这个玩意在C++中是一个技巧,可以让你的值最终变为0或者1.算是个小技巧吧。
如果非要研究为什么在其他函数里面使用会崩掉的话,仅初步展开,展深就没完了。
另外,这玩意的底层是StaticLoadClass,只是进行封装了。。。。。。。。。
StaticLoadObject
未完待更新