UE4 Pak打包、挂载、加载

2023-11-07 00:10
文章标签 加载 ue4 打包 挂载 pak

本文主要是介绍UE4 Pak打包、挂载、加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,必须得明确的一点就是如果想要加载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);//判断其中是否已经包含Pakreturn 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());}
}

异步加载资源

//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打包、挂载、加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359933

相关文章

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.

Maven项目打包时添加本地Jar包的操作步骤

《Maven项目打包时添加本地Jar包的操作步骤》在Maven项目开发中,我们经常会遇到需要引入本地Jar包的场景,比如使用未发布到中央仓库的第三方库或者处理版本冲突的依赖项,本文将详细介绍如何通过M... 目录一、适用场景说明​二、核心操作命令​1. 命令格式解析​2. 实战案例演示​三、项目配置步骤​1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模