一、直接属性引用
通过在头文件中定义变量指针,并将其设置为UPROPERTY(EditDefaultsOnly),之后在蓝图中将此变量赋予资源,最后就可以直接引用该变量设置资源了。不过这种方式似乎是不能动态控制,就是说点击Play按钮就全部会默认都加载。
/** construction start sound stinger */
UPROPERTY(EditDefaultsOnly, Category=Mesh)
UStaticMesh* MeshData;
二、构造时引用
此种方式是在类的构造方法中使用,使用ConstructHelpers::FObjectFinder()方法可以实现在引用指定的资源文件,贴图,特效,材质等等都可以使用。有一点需要注意的就是这种方式一定只能在构造方法中使用,如果试图自己创建一个方法并且在这个方法中使用ConstructHelpers::FObjectFinder的方式去引用资源,游戏则会崩溃。
static
三、间接属性引用
间接属性引用跟第一种方法有点像同样用到了UPROPERTY(EditDefaulsOnly),但是不同的是它声明变量是需要使用TSoftObjectPtr。例如TSoftObjectPtr<UStaticMesh> MeshData。这个形式表示该变量以字符串形式与模板代码存储在一起一边安全地检查资源是否已经加载,而不是可以在蓝图中设置完资源后就直接使用了。
这种方式是可以控制什么时候加载该资源,并且加载需要手动写代码加载,加载之前将对该资源进行检查看是否加载。如果没有加载,会使用FStreamingManager 执行同步加载,如果已经加载,则会直接返回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进行使用