首先,必须得明确的一点就是如果想要加载Pak内资源,那么这些资源必须是经过Cook的。如果打包的是未Cook的资源,那么即使Pak挂载成功,也不可能会成功加载Pak内资源。
不知道怎么生成Cook资源,可以看我前一篇 UE4 Cook指定平台资源_来梦学长i的博客-CSDN博客
打包Pak
首先,将引擎目录下"Engine\Binaries\Win64"添加到系统环境变量中
方式一:使用命令行方式打包
打包Pak的命令行格式
UnrealPak “存储Pak的路径+Pak包名” -create="Cook好的资源的路径"
打开CMD键入打包命令,执行打包Pak
示例一:打包整个Content文件
UnrealPak "E:\ProjectName\Pak\ContentPak.pak" -create="E:\ProjectName\Saved\Cooked\Content"
示例二:打包单个指定文件
UnrealPak "E:\ProjectName\Pak\SiglePak.pak" -create="E:\ProjectName\Saved\Cooked\Content\FileName\FileName.uasset"
方式二:使用批处理方式打包
@ECHO OFF
ECHO ---------------------------------------------------------------
ECHO UnrealPak Strart Create Pak
ECHO ---------------------------------------------------------------
set PakFilename="E:\AndroidVR\Pak\ContentPak.pak"
set CookedFileName="E:\AndroidVR\Saved\Cooked\Newfile"
set UnrealPak="E:\UE4.26\Engine\Binaries\Win64\UnrealPak.exe"
CALL %UnrealPak% %PakFilename% -create=%CookedFileName%
ECHO ---------------------------------------------------------------
ECHO UnrealPak Finished
ECHO ---------------------------------------------------------------
PAUSE
打包完成,即可在你自己指定的目录下找到打包好的Pak文件
挂载Pak
如果手动将Pak放在以下这些项目路径中,引擎将会自动加载Pak
[ProjectName]/Content/Paks
[ProjectName]/Saved/Paks
Engine/Content/Paks
也可以使用以下方法,手动挂载Pak
挂载Pak的功能需要C++代码实现,项目Build.cs中加入"PakFile"模块
包含必要头文件
#include "HAL/PlatformFilemanager.h"
#include "IPlatformFilePak.h"
创建函数,用于获取平台文件
FPakPlatformFile* FSimpleHotPakModule::GetPakPlatformFile()
{
if (!PakPlatformFile)
{
if (IPlatformFile* InPlatformFile = FPlatformFileManager::Get().FindPlatformFile(TEXT("PakFile")))
{
PakPlatformFile = static_cast<FPakPlatformFile*>(InPlatformFile);
}
else
{
PakPlatformFile = new FPakPlatformFile();
if (PakPlatformFile->Initialize(&FPlatformFileManager::Get().GetPlatformFile(), TEXT("")))
{
FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile);
}
}
}
return PakPlatformFile;
}
创建函数,用于判断是否已经挂载指定Pak,防止重复挂载
@PakFilename Pak包名
bool USimpleHotPakBPLibrary::IsMounted(const FString& PakFilename)
{
if (FPakPlatformFile* InPakFile = GetPakPlatformFile())
{
TArray<FString> PakFilenames;
//获取已经挂载的Pak数组容器
InPakFile->GetMountedPakFilenames(PakFilenames);
//判断其中是否已经包含Pak
return PakFilenames.Contains(PakFilename);
}
return false;
}
创建函数,用于挂载Pak
@PakFilename Pak包名
@PakOrder Pak加载优先级
@MountPoint Pak挂载到哪个路径
bool AHotUpdateTestCharacter::MountPak(const FString& PakFilename, int32 PakOrder, const FString& MountPoint)
{
if (FPakPlatformFile *InPakFile = GetPakPlatformFile())
{
if (!IsMounted(PakFilename))
{
//返回挂载结果
return InPakFile->Mount(*PakFilename, PakOrder, *MountPoint);
}
}
return false;
}
创建函数,用于卸载Pak
@PakFilename Pak包名
bool AHotUpdateTestCharacter::UnmountPak(const FString& PakFilename)
{
if (FPakPlatformFile* InPakFile = GetPakPlatformFile())
{
return InPakFile->Unmount(*PakFilename);
}
return false;
}
方法都准备好了,开始挂载Pak
值得说明的是,MountPoint路径是你所打包的Cook资源的相对路径
例如打包了一个"ProjectName/Saved/Cooked/Content/Asseset"路径下的资源,那么这个资源的挂载点则是"ProjectName/Content/Asseset"
//Pak文件路径
FString PakFileName = FPaths::ProjectDir() / TEXT("Pak/Asset.pak");
//Pak挂载点
FString PakMountPoint = FPaths::ProjectContentDir() / TEXT("Asset/");
if(MountPak(*PakFileName,3,*PakMountPoint))
{
}
这样就已经将Pak挂载到引擎中了,接下来则是加载Pak中的资源
资源加载
动态加载资源文章来源:https://www.toymoban.com/news/detail-403190.html
//Pak文件路径
FString PakFileName = FPaths::ProjectDir() / TEXT("Pak/Asset.pak");
//Pak挂载点
FString PakMountPoint = FPaths::ProjectContentDir() / TEXT("Asset/");
if(MountPak(*PakFileName,3,*PakMountPoint))
{
FString AssetPath = "'Blueprint'/Gmae/Asseset/AssetName.AssetName_C'";
if(AActor *TheActor = Cast<AActor>(StaticLoadObject(UObject::StaticClass(),nullptr,*AssetPath)))
{
GetWorld()->SpawnActor(TheActor,FVector(),FRotator());
}
}
异步加载资源文章来源地址https://www.toymoban.com/news/detail-403190.html
//Pak文件路径
FString PakFileName = FPaths::ProjectDir() / TEXT("Pak/Asset.pak");
//Pak挂载点
FString PakMountPoint = FPaths::ProjectContentDir() / TEXT("Asset/");
if(MountPak(*PakFileName,3,*PakMountPoint))
{
if (FPakPlatformFile*InPakPlatformFile = GetPakPlatformFile())
{
FPakFile*InPakFile = new FPakFile(InPakPlatformFile,*PakFileName,false);
TArray<FSoftObjectPath> AllReourcePath;
TArray<FString> Files;
InPakFile->FindFilesAtPath(Files,*InPakFile->GetMountPoint(),true,false,true);
for (auto &InPak : Files)
{
AllReourcePath.AddUnique(InPak);
}
UAssetManager::GetStreamableManager().RequestAsyncLoad(AllReourcePath,FStreamableDelegate::CreateLambda([&]()
{
FString FileName = "'Blueprint'/Gmae/Asseset/AssesetName.AssesetName'";
AActor*TheActor = FindObject<AActor>(nullptr,*FileName);
}));
}
}
到了这里,关于UE4 Pak打包、挂载、加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!