异步加载
Async(EAsyncExecution::Thread, [this, SkeletalMeshContext, MeshIndex, AsyncCallback]()
{
FglTFRuntimeSkeletalMeshContextFinalizer AsyncFinalizer(SkeletalMeshContext, AsyncCallback);
TSharedPtr<FJsonObject> JsonMeshObject = GetJsonObjectFromRootIndex("meshes", MeshIndex);
if (!JsonMeshObject)
{
AddError("LoadSkeletalMeshAsync()", FString::Printf(TEXT("Unable to find Mesh with index %d"), MeshIndex));
return;
}
TArray<FglTFRuntimePrimitive> Primitives;
if (!LoadPrimitives(JsonMeshObject.ToSharedRef(), Primitives, SkeletalMeshContext->SkeletalMeshConfig.MaterialsConfig))
{
return;
}
TArray<FglTFRuntimeLOD> LODs;
FglTFRuntimeLOD LOD0;
LOD0.Primitives = Primitives;
LODs.Add(LOD0);
SkeletalMeshContext->LODs = LODs;
SkeletalMeshContext->SkeletalMesh = CreateSkeletalMeshFromLODs(SkeletalMeshContext);
if (SkeletalMeshContext->SkeletalMesh)
{
FGraphEventRef Task = FFunctionGraphTask::CreateAndDispatchWhenReady([this, SkeletalMeshContext, AsyncCallback]()
{
SkeletalMeshContext->SkeletalMesh = FinalizeSkeletalMeshWithLODs(SkeletalMeshContext);
AsyncCallback.ExecuteIfBound(SkeletalMeshContext->SkeletalMesh);
}, TStatId(), nullptr, ENamedThreads::GameThread);
FTaskGraphInterface::Get().WaitUntilTaskCompletes(Task);
}
});