【转载】UE4 资源加载的几种方式

760 阅读2分钟

原文链接:UE4资源加载的几种方式 | yxiaojiang

一、直接属性引用

通过在头文件中定义变量指针,并将其设置为 UPROPERTY(EditDefaultsOnly), 之后在蓝图中将此变量赋予资源,最后就可以直接引用该变量设置资源了。不过这种方式似乎是不能动态控制,就是说点击 Play 按钮就全部会默认都加载。

/** construction start sound stinger */
UPROPERTY(EditDefaultsOnly, Category=Mesh)
UStaticMesh* MeshData;

二、构造时引用

此种方式是在类的构造方法中使用,使用 ConstructHelpers::FObjectFinder() 方法可以实现在引用指定的资源文件、贴图、特效、材质等等都可以使用。有一点需要注意的就是这种方式一定只能在构造方法中使用,如果试图自己创建一个方法并且在这个方法中使用 ConstructHelpers::FObjectFinder 的方式去引用资源,游戏则会崩溃。

static ConstructorHelpers::FObjectFinder<UMaterialInterface> WoodMaterial(TEXT("Material'/Game/StarterContent/Materials/M_Wood_Walnut.M_Wood_Walnut'"));
if (WoodMaterial.Object)
{
        GetMesh()->SetMaterial(0, WoodMaterial.Object);
}

三、间接属性引用

间接属性引用跟第一种方法有点像同样用到了 UPROPERTY(EditDefaulsOnly),但是不同的是它声明变量是需要使用 TSoftObjectPtr。例如 TSoftObjectPtr<UStaticMesh> MeshData。 这个形式表示 该变量以字符串形式与模板代码存储在一起一边安全地检查资源是否已经加载 ,而不是可以在蓝图中设置完资源后就直接使用了。

这种方式是可以控制什么时候加载该资源,并且加载需要手动写代码加载,加载之前将对该资源进行检查看是否加载。如果没有加载,会使用 FStreamableManager 执行同步加载,如果已经加载,则会直接返回 TSoftObjectPtr 中的 UStaticMesh 指针

void ASoftActor::DynamicUpdateStaticMesh()
{
	FStreamableManager& StreamableManager = UAssetManager::Get().GetStreamableManager();
	if (MeshData.IsPending())
	{
		const FSoftObjectPath& AssetRef = MeshData.ToSoftObjectPath();
		MeshData = Cast<UStaticMesh>(StreamableManager.LoadSynchronous(AssetRef));
		if (MeshData.Get())
		{
			BaseMesh->SetStaticMesh(MeshData.Get());
		}
	}
	else
	{
		if (MeshData.Get())
		{
			BaseMesh->SetStaticMesh(MeshData.Get());
		}
	}
}

四、运行时引用

与第二点中提到的构造时引用正好相反,可以实现在运行中引用指定路径的资源。此时它就不是使用 ConstructHelpers 这个类去实现了,需要用到 StaticLoadObject ,以下是示例代码:

UStaticMesh* AMyActor::GetStaticMeshByName(const FString& AssetName){
	//"StaticMesh'/Engine/BasicShapes/Cube.Cube'"
	FString Paths = "StaticMesh'/Game/TestFolder/Product1/Geometries/";
	Paths.Append(AssetName).Append(".").Append(AssetName).Append("'");
	UStaticMesh* ReturnMesh = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), NULL, *Paths));
	return ReturnMesh;
}

以上代码都是使用 UE4.24 进行使用

相关文章

【转载】UE4 静态/动态加载资源方式