首先需要在**本项目**中cook内容,内容放在content文件夹下,cooked文件在[ProjectName]\Saved\Cooked\WindowsNoEditor\[ProjectName]\Content\[CookedFolder]
然后用引擎自带的unrealpak打包成一个pak文件 unrealpak D:\MyDesktop\Apple.pak -create=[ProjectName]\Saved\Cooked\WindowsNoEditor\[ProjectName]\Content\[CookedFolder] -compressed
最后在运行时加载:
void AMyActor::BeginPlay()
{
Super::BeginPlay();
OldPlatform = MakeShareable(&FPlatformFileManager::Get().GetPlatformFile());
PakPlatformFile = MakeShareable(new FPakPlatformFile());
PakPlatformFile->Initialize(OldPlatform.Get(), TEXT(""));
TestLoadPak(TEXT("D:\\MyDesktop\\Apple.pak"));
}
void AMyActor::TestLoadPak(FString InFullPath)
{
FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);
FString PakFileFullPath = InFullPath;
FPakFile* TmpPak = new FPakFile(PakPlatformFile.Get(), *PakFileFullPath, false);
FString PakMountPoint = TmpPak->GetMountPoint();
int32 Pos = PakMountPoint.Find("Content/");
FString NewMountPoint = PakMountPoint.RightChop(Pos);
NewMountPoint = FPaths::ProjectDir() + NewMountPoint;
//FString NewMountPoint = "../../../DBJTest/Content/DLC/";
TmpPak->SetMountPoint(*NewMountPoint);
if (PakPlatformFile->Mount(*PakFileFullPath, 1, *NewMountPoint))
{
TArray<FString> FoundFilenames;
TmpPak->FindPrunedFilesAtPath(FoundFilenames, *TmpPak->GetMountPoint(), true, false, false);
if (FoundFilenames.Num() > 0)
{
for (FString& Filename : FoundFilenames)
{
if (Filename.EndsWith(TEXT(".uasset")))
{
FString NewFileName = Filename;
NewFileName.RemoveFromEnd(TEXT(".uasset"));
int32 Pos2 = NewFileName.Find("/Content/");
NewFileName = NewFileName.RightChop(Pos2 + 8);
NewFileName = "/Game" + NewFileName;
UObject* LoadedObj = StaticLoadObject(UObject::StaticClass(), NULL, *NewFileName);
UStaticMesh* SM = Cast<UStaticMesh>(LoadedObj);
if (SM)
{
GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT("Get static mesh"));
AStaticMeshActor* MeshActor = GetWorld()->SpawnActor<AStaticMeshActor>(AStaticMeshActor::StaticClass(), FVector(0, 0, 460), FRotator(0, 0, 0));
MeshActor->SetMobility(EComponentMobility::Movable);
MeshActor->GetStaticMeshComponent()->SetStaticMesh(SM);
break;
}
}
}
}
}
FPlatformFileManager::Get().SetPlatformFile(*OldPlatform);
}