UE4 Pak打包、挂载、加载

这篇具有很好参考价值的文章主要介绍了UE4 Pak打包、挂载、加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先,必须得明确的一点就是如果想要加载Pak内资源,那么这些资源必须是经过Cook的。如果打包的是未Cook的资源,那么即使Pak挂载成功,也不可能会成功加载Pak内资源。

不知道怎么生成Cook资源,可以看我前一篇 ​​​​​​UE4 Cook指定平台资源_来梦学长i的博客-CSDN博客

打包Pak

首先,将引擎目录下"Engine\Binaries\Win64"添加到系统环境变量中

UE4 Pak打包、挂载、加载

方式一:使用命令行方式打包

打包Pak的命令行格式

UnrealPak “存储Pak的路径+Pak包名” -create="Cook好的资源的路径"

打开CMD键入打包命令,执行打包Pak

UE4 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文件

UE4 Pak打包、挂载、加载

挂载Pak

如果手动将Pak放在以下这些项目路径中,引擎将会自动加载Pak

  • [ProjectName]/Content/Paks
  • [ProjectName]/Saved/Paks
  • Engine/Content/Paks

也可以使用以下方法,手动挂载Pak

挂载Pak的功能需要C++代码实现,项目Build.cs中加入"PakFile"模块

UE4 Pak打包、挂载、加载

包含必要头文件

#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中的资源

资源加载

动态加载资源

//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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4查看加密PAK里边的资源Android/iOS/PC方法

    我们经常会需要把1个模型进行减面然后在移动端使用,有时候会出现移动端模型和PC端模型不一致的问题,这时候就需要将移动端的模型和PC端的模型进行对比,找到问题出现的原因,检查Mesh、Normal、UV0、UV1、MaterialId、碰撞等是否一致。 如何打包Pak文件,见这篇文章:UE4打

    2024年02月14日
    浏览(53)
  • ue4打包错误

    UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: begin: stack for UAT UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: === Critical error: === UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: Fatal error! UATHelper: 打包 (Windows (64-bit)):   LogWindows: Error: UA

    2024年02月03日
    浏览(44)
  • 【UE4 Cesium】加载离线地图

    主体思路:先使用水经注软件下载瓦片数据,再使用Python转换瓦片数据格式(TMS),使用Nginx发布网络服务,最后将网络服务加载到UE中。 步骤: 使用水经注下载瓦片数据,这里下载的是全球七级地图存放在/map文件夹内 用python install GDAL(Whl文件下载地址:https://www.lfd.uci.e

    2024年02月15日
    浏览(51)
  • UE4打包Android报错解决方案

    报错如上 1、找到UE安装目录UE_4.26EngineExtrasAndroid如: E:UE4UE4AnUE_4.26EngineExtrasAndroid 2、启动该目录下的SetupAndroid.bat文件 3、文件开始下载sdk,根据下载提示可知sdk下载目录。 4、打开UE,在项目设置ProjectSettings到Android SDK配置对应上一步下载的SDK,其中,NDK也在下载目录内,

    2024年02月13日
    浏览(48)
  • ue4.27空项目打包不卡ue5.1空项目打包运行卡的要命研究测试

    知乎上有人提问 lumen是如何做到不卡顿的,我却不以为然,我的显卡虽然算不上好显卡,但是也不至于独立显卡一个空项目都玩不起吧,打个cf,玩腾讯模拟器和平精英吃鸡肯定还是会很流畅的. 一个空项目都卡,怎么能说是我电脑配置问题呢??? 再来看提示 image.png image.png 反射设置的

    2023年04月21日
    浏览(65)
  • 启动 UE4编辑器报 加载 Plugin 失败

    启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. 方法一: 在 UE4 安装目录/Engin/Plugins 中找到该插件的目录,修改 SteamVR.uplugin 文件

    2024年04月27日
    浏览(41)
  • 【虚幻引擎】UE4 同步和异步资源加载(软引用)

    虚幻引擎给我们提供了两种引用,一个是硬引用。软引用通常是仅储存资源对象的资源路径没有与资源产生耦合关系的引用(软引用加载到内存中,引用对象不会被加载到内存中,只有在需要的时候才会被加载进内存中)。硬引用则是拥有资源对象实际成员变量,直接与资源对

    2024年02月01日
    浏览(106)
  • UE4 打包设置全屏模式和窗口模式方法

    我的项目路径    E:ue4.27ZGC我的项目3Config 更改的核心参数:FullscreenMode 若想默认全屏需在项目 Config目录 下建立 DefaultGameUserSettings.ini 文件,写入相应内容  1.默认打包后全屏显示 DefaultGameUserSettings.ini写入下面代码 效果图   2.默认打包后窗口模式 DefaultGameUserSettings.ini写入

    2024年02月11日
    浏览(59)
  • UE4.27 编译及打包HTML5相关资料

    https://docs.unrealengine.com/4.27/zh-CN/SharingAndReleasing/HTML5/GettingStarted/ UE4.27可以打包HTML5啦 https://github.com/Xi3Chen/UE4.27PackingH5DDoc https://blog.csdn.net/mrbaolong/article/details/131732174?spm=1001.2014.3001.5501

    2024年02月13日
    浏览(46)
  • UE5 UE4 打包报错Failed to compile material 解决

    参考:https://forums.unrealengine.com/t/failed-to-compile-material-for-pcd3d_sm5-warning/385087 https://forums.unrealengine.com/t/failed-to-compile-material-for-platform-pcd3d-sm4/436176 报错:Failed to compile Material for platform PCD3D_SM5 ..... 解决方法:在project settings中,找到 Packaging - share material shader code中,去掉勾选

    2024年01月17日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包