UE5的RumtimeFBXImport插件其实只能加载本机的fbx文件,要加载服务器上的fbx文件的话,需要先将该fbx文件下载到本地,然后再使用RumtimeFBXImport插件加载。
示例文件如下:
#include "Loader/WebLoader.h"
#include "Misc/FileHelper.h"
#include "Misc/Paths.h"
#include "HttpModule.h"
#include "Http.h"
#include "FBXImportManager.h"
AWebLoader::AWebLoader(){}
void AWebLoader::BeginPlay()
{
Super::BeginPlay();
if (WebFbxPath.Len() > 0)
{
LoadFileFromServer(WebFbxPath);
}
}
void AWebLoader::LoadFileFromServer(const FString& URL)
{
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetURL(URL);
HttpRequest->SetVerb("GET");
HttpRequest->OnProcessRequestComplete().BindUObject(this, &AWebLoader::OnFileDownloadComplete);
HttpRequest->ProcessRequest();
}
void AWebLoader::OnFileDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok)
{
FString ProjectRoot = FPaths::Combine(FPaths::ProjectDir(), LocalRelatedPath);
FString FileName = FPaths::GetCleanFilename(WebFbxPath);
FString LocalFullPath = FPaths::Combine(ProjectRoot, FileName);
if (!FFileHelper::SaveArrayToFile(Response->GetContent(), *LocalFullPath))
{
UE_LOG(LogTemp, Error, TEXT("File downloaded failed!"));
return;
}
//
LoadLocalFBX(LocalFullPath);
}
else
{
UE_LOG(LogTemp, Error, TEXT("File download failed."));
}
}
void AWebLoader::LoadLocalFBX(FString LocalFullPath)
{
if (!FBXImportManager)
{
FBXImportManager = GetWorld()->SpawnActor<AFBXImportManager>();
}
FBXImportManager->InitializeFBXLoad();
FBXImportManager->ImportFBXFile(LocalFullPath, FVector::UpVector, BaseMaterial, EFBXCollisionType::MeshCollision);
}