UE4引用资源小结
https://zhuanlan.zhihu.com/p/64485997
引用资源
1. Hard reference: A引用了B 所以A加载B也会被加载
2. Soft reference: A引用了B的路径 A加载只有B的路径(字符串)被加载
Hard Reference
直接资源引用
这个是最常见的引用。
一句话: 在类中暴露一个UPROPERTY变量可以让别人编辑或者指定资源。
构造时引用
即通过ConstructorHelpers在A的构造函数中加载B
ConstructorHelpers先在RAM中查找资源,找不到就加载
UPROPERTY()
class B* x;
A::A(const FObjectInitializen& ObjectInitializer) : Super(ObjectInitializer)
{
static ConstructorHelpers::FObjectFinder<B> b(TEXT("path_to_asset"));
x = b.Object;
}
Soft Renference
间接资源引用(lazy load)
与直接引用对应,间接引用不存放资源本身而是存放字符串和资源模板(TSoftObjectPtr)。 IsPending()可以检查是否准备好。 用这种方式我们必须手动加载资源(LoadObject, StaticLoadObject, FStreamingManager)。注意同步加载过多可能造成卡顿。
UPROPERTY()
TSoftObjectPtr<B> b;
B* func()
{
if (b.IsPending()) {
const FSoftObjectPath& AssetRef = b.ToStringReference();
b = Cast<B>(Streamble.SynchronousLoad(AssetRef));
}
return b.Get();
}
和TSoftObjectPtr对应的还有TSoftClassPtr.
runtime层动态加载
如果资源已经加载完毕: FindObject<>()
如果资源还没加载: LoadObject<>()
A* a = FindObject<A>(Outer, *Name);
b = LoadObject<B>(nullptr, TEXT("asset_path"), nullptr, LOAD_None, nullptr);
编辑于 2019-05-02