UE4Cook前的资源格式通常为.uasset,.umap,资源打包时,会默认把这些格式的文件打包进资源包,打包后的资源文件后缀为.pak。
一、资源打包设置:
1.设置打包参数:打开ProjectSettings->Project->Packaging来设置打包参数:
这里有很多控制Cook和打包pak的参数,解释几个:
UsePakFile:True表示资源打包为.pak,如果不勾选,表示不打包Pak,资源会被原封不动的Copy到包里;
List of maps to include in a packaged build:这里添加要打入包的Map,如果这里为空,则默认所有Map打包Pak,反之则只打包这里添加的Map;
Additional Non-Asset Directories To Package(Copy):UE打包只会打包那些它自己承认的资源格式,比如上边提到的.uasset,umap,还有Cook后的.uexp,.ubulk,插件的.uplugin等,除此之外,如果我们自己想加一个文件,比如说.json到Pak中,就要在这里配置一下。
二、打包Pak
方法一:设置好参数,直接出包,然后就可以在游戏的Game/Content/Paks目录下看到pak文件。
方法二:打包pak时,其实调用引擎目录下的Engine/Win64/UnrealPak.exe,对应的代码是在UnrealPak.cpp里
代码及其精简,主要逻辑还是在PakFileUtilities.cpp里,我们上边的设置,最终都会在打包流程中处理成参数传入ExecuteUnrealPak,在此函数的最后可以看到可以传入的参数代表的意义:
使用方法:
- 打包Pak:UnrealPak.exe <.pak生成路径> -Create=<PakList路径>
其中PakList表示要打包的资源,UE自己生成的PakList在“C:User\AppData\Roaming\Unreal
Engine\AutomationTool\Logs\x+engine\PakList_<pak名>.txt”,我们也可以写通配符,比如:
- 解包Pak:UnrealPak.exe <.pak路径> -Extract <解包路径>
- 其他参数:
UnrealPak <PakFilename> -Test
UnrealPak <PakFilename> -List
UnrealPak <PakFilename> -Dest=<MountPoint>
UnrealPak GenerateKeys=<KeyFilename>
UnrealPak GeneratePrimeTable=<KeyFilename> [-TableMax=<N>]
UnrealPak <PakFilename1> <PakFilename2> -diff
UnrealPak -TestEncryption
Options:
-blocksize=<BlockSize>
-bitwindow=<BitWindow>
-compress
-encrypt
-order=<OrderingFile>
-diff (requires 2 filenames first)
-enginedir (specify engine dir for when using ini encryption configs)
-projectdir (specify project dir for when using ini encryption configs)
-encryptionini (specify ini base name to gather encryption settings from)
-extracttomountpoint (Extract to mount point path of pak file)
-encryptindex (encrypt the pak file index, making it unusable in unrealpak without supplying the key)
-compressionformat[s]=<Format[,format2,...]> (set the format(s) to compress with, falling back on failures)
如果只是为了生成pak,我们可以直接通过这种方式生成Pak,跳过了Build、Cook等待阶段。我们也可以自定义一些参数,做一些自己的逻辑。
三、Patch
UE4的打包原理是:
1.先打包一个release的发布包,这个是玩家第一次拿到游戏时所包含的资源包,我们称它为母包。
2.之后在生成pak的时候,用当前的资源和母包进行对比,得到的差异生成的pak,则为下一次的Patch。
要生成Patch,这里我们就要用到UE4的UAT打包工具,它在UE的Engine\Build\BatchFiles目录下,打开cmd输入出包命令:
"RunUAT.bat -ScriptsForProject= BuildCookRun -nocompile -nocompileeditor -project= -clientconfig=Development -ue4exe=UE4Editor-Cmd.exe -targetplatform=Win64 -utf8output -cook -stage -pak -archive -package"
生成Patch需要增加以下参数:
生成Release的时候: -createreleaseversion=1.0 -createreleaseversionroot=<pak存放路径>
生成Patch的时候:-generatepatch -basedonreleaseversion=1.0 -basedonreleaseversionroot=<release pak的路径>
Pak文件内容:
在整个打包流程中,Pak之前有一步流程是Cook,Cook是把项目资源烘焙为对应平台的资源,然后Pak阶段把Cook后的对应平台的资源打包为.pak,.pak文件中包含了:
工程文件:.uproject
配置文件:.ini
插件配置文件:.uplugin
Engine Content下的文件:.png,.res,.ttf(源文件格式)
游戏项目资源文件:.uasset,.umap,.uexp,.ubulk
以上都是默认添加的,还有其他我们自己设置添加的文件
4.Pak文件结构
.Pak文件(FPakFile):
{
序列化文件(FPakEntry):
[
文件偏移
文件大小
解压后大小
压缩方式
时间戳(可选)
Hash(验证文件是否被修改)
压缩块(可选:记录如何解压这个文件)
标记(可选:标记是否加密,是否删除)
压缩块大小(可选)
文件内容
]
挂载点
文件数量
[
文件名
序列化文件(同上)
]
秘钥
加密标记
魔数
版本号
Pak索引偏移
Pak索引大小
Hash
}
未完待续……