UE4 Pak打包、挂载、加载

2023-11-01

首先,必须得明确的一点就是如果想要加载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中的资源

资源加载

动态加载资源

//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);
			}));
		}
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4 Pak打包、挂载、加载 的相关文章

  • UE4中实现鼠标拖动游戏中的物体

    一 显示鼠标光标 启用鼠标点击事件 可以在关卡蓝图中或者游戏模式中加入下面代码 二 点击物体进入选中状态 三 根据通道获取命中结果 通过这个函数可以获取当前鼠标光标下接触的actor 重新设定actor位置即可 这里可以将类型转换去掉 就可
  • 【UE4】【C++】PlayerController、AIController获取玩家对应的Pawn

    先创建一个基本的C 类 Tank 因为要对Tank进行各种操作 移动 寻找目标 所以选择了Pawn类型 PlayerController 再创建一个C 类 TankPlayerController 用以控制玩家操作的对象 Tank 创建好后
  • 如何解决x盘莫名出现的msdia80.dll文件

    如何解决x盘莫名出现的msdia80 dll文件 参考文章 https zhuanlan zhihu com p 138954717
  • (UE4 4.20 )UE4的GC(垃圾回收)编程规范

    UObject系统的GC UPROPERTY 引用 当我们在一个UObject类声明各种继承UObject的 变量时 得加UPROPERTY 这个可以让UE4帮我们自动管理UObject的垃圾回收 UPROPERTY不仅仅用于反射变量到编辑
  • UE4 导航网格的使用

    在使用导航网格前 应先设置项目导航系统支持的导航代理者 Agents 在项目设置中 找到导航系统页面 DirtyAreasUpdateFreq 表示导航网格变化时 检测变化并更新的频率 这里可以设置导航系统的一些参数 包括是否允许客户端导航
  • UE4学习日记——蓝图中的各种颜色代表什么

    节点类型颜色 白色 执行线 蓝色 调用的函数或事件 暗蓝色 结构体 草绿色 流程切换 绿色 纯函数 通常用于获取什么 青色 试着对象转换 紫色 函数定义 灰色 宏 红色 事件的定义 土黄色 时间轴 数据类型颜色 白色线条 执行线 程序的执行
  • 【UE4】多视角相机捕获图像如何同屏拼接在一起

    前段时间有个Demo移植的需求 需要把实时裸眼3D多视角立体显示的Unity版本移植到UE4 主要包含后处理Shader 相机矩阵变换 多视角画面平铺拼接三大部分 10 10 多视角相机捕获图拼接效果 对现有的多窗口显示方法进行查阅后 发现
  • 11月5日 Unreal Engine Rider 代码使用记录

    11月5日的代码使用记录 TSubclassOf UPROPERTY EditAnywhere TSubclassOf
  • UE4 技能系统(GAS插件的使用) 01--Build Basic Classes 创建基础类

    翻译自Udemy的视频课程introduction to unreal engine 4 ability system Build Basic Classes 创建基础类 1 创建工程和人物设置 01 创建Git仓库 使用UE4 22 VS
  • ue中的经纬高转xyz的问题

    在ue中 做了个地球仪 发现经纬度转地心坐标系老是出问题 后来发现 是转ue时 x y坐标要互换 也对 因为在cesium for unreal中还有一系列ecef转ue的相关函数 即下面的代码中 xy需要互换 在ue中才能正常使用 偏心率
  • 11月8日 改良射线,蓝图 UE4斯坦福 学习笔记

    修改射线类型 更改了昨天的射线类型 void USInteractionComponent PrimaryInteract 射线 FHitResult FHit 碰撞体 FCollisionObjectQueryParams ObjectQ
  • UE4 实现用鼠标旋转场景中的物体

    本文实现的是用在UE4 中用鼠标旋转场景中的物体 点击到物体时开始物体旋转功能 移动鼠标物体跟着旋转相应的角度 松开鼠标左键物体停止旋转 下面介绍实现此功能的蓝图逻辑 由于比较简单就不一一介绍了 直接贴上蓝图代码 如有问题欢迎交流
  • UE4修改splitScreen layout方式

    UE4自身提供了分屏显示的方法 可以分成两个屏幕 也可以分成三个屏幕 但提供的分屏布局方式有限 包括两个玩家分屏布局 Vertical Horizontal 三个玩家分屏布局 Favor Top Favor Bottom 这里提供给大家一种
  • UE4 命令工具打包

    用cmd进入UE4引擎的目录 Engine Build BatchFiles找到RunUAT bat cmd中输入以下命令 RunUAT BuildCookRun project F VidaUpdater VidaUpdater upro
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • UE44如何使用Geometry(BSP)笔刷,快速创建游戏原型?

    游戏原型搭建 如何快速搭建场景 一 好处1 防止同时也放大了对应的网格 如果像unity里面一样 R放大缩小以后 网格也会对应拉伸 失真 导致了材质会被拉伸或者缩小 1 选择Geometry 在BrushSetting里面 将X Y Z对应
  • UE4 通过Echarts实现各种统计图

    主要内容 本文主要讲解UE4 UMG向网页发送数据 通过WebBrowser插件将用Echarts定制好的统计图在UE4内展现出来 达到数据可视化的效果 本文主要演示柱形图的效果 其它类型的统计图可以结合Echarts官方案列以及文档自行修
  • UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿 UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了 开了VPN也链接不上 这使得用UE4打包配置安卓游戏变得非常麻烦 博主捣鼓了好几天才打包成功 深感在中国学习UE4的艰难与
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行
  • 4,引擎初始化--(5)初始化actor--6,生成PlayActor--(2)玩家登录--3,PostLogin()(学习资料来自于ue4游戏框架)

    一旦PlayerController生成出来 world关于玩家的网络的初始化工作全部完成 接下来 进行PostLogin 从而在玩家加入游戏时 能做一些设置工作 默认情况下 GameMode会为新生的PlayerController建立一

随机推荐

  • pic程序SD24XX读写演示程序

    本程序根据网友提供的pic程序进行修改 未进行测试 仅供参考 e mail FAE whwave com cn TEL 0755 83114387 2014 07 01 include
  • [R]第二节 对象介绍与赋值运算

    前言 R 创建 控制的实体 entity 称为对象 object 向量 vector 矩阵 matrix 数组 array 数据框 data frame 列表 list 因子 factor 函数 function 通过以上实体定义的更为一般
  • ROS的3D建模与仿真

    1 实验目的及要求 掌握 ROS 中 3D 模型 URDF 的创建方法 2 实验器材 PC 机 ROS 系统 ubuntu18 04 ROS melodic 3 内容与步骤 建立一个简单的移动机器人小车 过程中尽量使用简单的元素 移动机器人
  • HashSet可能存在的内存泄漏问题

    文章目录 HashSet可能存在的内存泄漏问题 问题描述 问题示例 C 问题解释 HashSet可能存在的内存泄漏问题 问题描述 如果往HashSet hs添加一个对象A 然后更改对象A中参与Hash计算的属性 将导致HashSet产生内存
  • 在Windows上访问linux的共享文件夹

    1 在Linux服务器上安装Samba并启动 yum install samba y systemctl start smb systemctl enable smb 2 创建samba用户并设置密码 注意用户需要系统里本来就创建好的用户
  • 详细解析Java中抽象类和接口的区别

    在 Java 语言中 abstract class 和 interface 是支持 抽象类 定义的两种机制 正是由于这两种机制的存在 才赋予了Java强大的 面向对象能力 abstract class和interface之间在对于抽象类定义
  • Postgresql数据库转义字符

    产生问题 Postgresql数据库运行下面insert命令 insert into mapping mac brand id mac brand values 777 D86595 Toy s Myth Inc 提示下面的警告 Warni
  • 用vue+videojs实现播放rtmp遇到的问题

    代码结构如下 html js 问题呈现 后来经过百度 是flash的问题 解决办法 点击浏览器如上图标 将flash选择为允许 更改之后会提示重新加载 点击点击重新加载即可
  • 关于DSP28335 AD采样的两个问题

    问题1 当DSP28335的AD采样触发信号soc来自于ePWM1时 这时的采样周期是PWM的周期还是AD硬件本身经过ACQ PS 3 0 和ADCTRL 7 分频得到的 问题2 当要对同一个通道进行重复采集1024个数据时 soc信号的来
  • 解决EasyExcel不支持解析List以及实体类对象问题

    1 解决EasyExcel不支持解析List以及实体类对象问题 1 EasyExcel支持的类型 public enum CellDataTypeEnum STRING DIRECT STRING NUMBER BOOLEAN EMPTY
  • go语言可变参数和interface{}使用

    go语言也支持可变参数 使用形式 func 函数名 参数名 类型 返回值 跟正常其他函数声明不同的是 在参数名和类型中间加了 符号 当需要传递的是不定类型和任意类型时 可以用interface 代替 类似于c语言中的void 下面这个例子演
  • 外部中断1

    实验现象 下载程序后 操作K4按键使LED1 D11 状态取反 接线说明 具体接线图可见开发攻略对应实验的 实验现象 章节 1 单片机 gt LED 交通灯模块 P20 gt D1 2 单片机 gt 独立按键模块 P33 gt K4 注意事
  • redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...

    大家好 我是可乐 一个专注原创 乐于分享的程序猿 本系列教程持续更新 可以微信搜索 IT可乐 第一时间阅读 回复 电子书 有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前 我们先来看如下几个问题 如何设置Redis键的过期时间 设置
  • multimap的介绍及使用

    multimap的介绍及使用 1 multimap的介绍 1 multimap是关联式容器 它按特定的次序 按照key来比较 存储由键key和值value组合而成的元素 多个键值对之间的key可以重复 2 在multimap中 键值key通
  • maven项目搭建

    一 开发环境搭建 数据库环境搭建 启动Navicat 启动Navicat 创建mysql连接 数据库设计 数据库设计 概念设计 E R图 逻辑设计 物理设计 概念设计 概念设计是数据库设计的核心环节 通过对用户需求进行综合 归纳与抽象 形成
  • 【Python】Python3中列表乘以某一个数

    Python3中列表乘以某一个数 在Python列表操作中 列表乘以某一个数 如list2 list1 2 得到一个新的列表是list1的元素重复n次 且list1不改变 但运行如下代码时 得到的新列表b中 b 0 和b 1 的地址相同 即
  • 图像标注工具labelImg安装方法(win10+Python3.5)

    吐槽一下 坑太多 闪开 老司机开车了 系统环境 win10 64位 Python3 5 1 下载源码 https github com tzutalin labelImg download之后 解压 2 安装Python3 5 不要用3 6
  • unity游戏云化后,暂停后游戏会继续执行问题解决

    问题 云化后点击暂停后可以暂停 但是暂停界面后的游戏主场景仍然在执行 解决这个问题首先要了解下如何暂停游戏 Time timeScale public static float timeScale 时间流逝的标度 可用于慢动作效果 当 ti
  • Flutter 5个必备的桌面插件包将包含在你的下一个版本中

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img NkSUeN6B 1622765619020 https ducafecat tech 2021 06 04 translation 5 must have flu
  • UE4 Pak打包、挂载、加载

    首先 必须得明确的一点就是如果想要加载Pak内资源 那么这些资源必须是经过Cook的 如果打包的是未Cook的资源 那么即使Pak挂载成功 也不可能会成功加载Pak内资源 不知道怎么生成Cook资源 可以看我前一篇 UE4 Cook指定平台