你必须先对虚幻项目进行正确打包,之后才能将其发布给用户。 打包能确保所有代码和内容都为最新且使用正确格式,以便在预期的目标平台上运行。
打包过程会涉及以下几个步骤。 首先,所有项目特定的源代码会被编译。 代码编译完成后,所有所需的内容都会被转化(即所谓的"烘培")成目标平台可以使用的格式。 然后,编译后的代码和经过烘焙的内容将被打包成一组可发布的文件,例如安装程序。
在主文件(File)菜单中,有一个名为打包项目(Package Project)的选项,该选项包含一个子菜单。 该选项包含一个子菜单,其中列出了所有引擎能支持得平台,你可以为这些平台打包项目。
假如选择为Android设备打包,你就会看到多个选项。 如需更多信息,请参阅Android参考页面。
在打包前,你还可以设置一些高级选项。
设置游戏的默认地图
打包游戏前,你首先需要设置游戏默认地图,打包好的游戏会在启动时加载这张地图。 假如你没有设置地图,并且使用的是空白项目,那么打包好的游戏在启动时只会显示一篇漆黑。 假如你使用了某张模板地图,例如第一人称(First Person)模板或第三人称(Third Person)模板,那么就会加载启动地图。
若要设置游戏默认地图,请转到编辑器的主菜单栏,点击编辑(Edit)> 项目设置(Project Settings)> 地图和模式(Maps & Modes):
创建打包文件
若要为特定平台打包项目,请转到编辑器的主菜单栏,点击文件(File)> 打包项目(Package Project)> [平台名称]:
你会看到一个提示你选择目标路径的对话框。 如果成功完成打包,则此目录将保存你的打包项目。
确认完目标路径后,你就可以开始为所选平台打包项目了。 由于打包非常耗时,所以整个过程会在后台执行,你可以继续使用编辑器。 编辑器右下角会显示一个状态指示器,提示你打包进度。
状态指示器还有一个"取消(Cancel)"按钮来停止打包过程。 此外,"显示日志(Show Log)"链接可以用来显示额外的输出日志信息,假如你想找出打包的失败原因,或者捕捉可能揭示潜在漏洞的警告信息,这些日志会非常有用:
一些最重要的日志消息,例如错误和警告消息,都会输出到常规的消息日志(Message Log)窗口中:
假如这些窗口不可见,你只需找到窗口(Window) > 开发者工具(Developer Tool) > 输出日志(Output Log) / 消息日志(Message Log)选项,即可将它们启用。
分布
假如你想将iOS或Android游戏发布到App Store或Google Play Store上,你就要用发布(Distribution)模式创建打包文件。 为此,请点击打包(Packaging)菜单中的打包设置(Packaging Settings)选项,然后勾选发布(Distribution)复选框。
假如是iOS,你需要在Apple的开发人员网站上创建发布证书(Distribution Certificate)和移动设备配置(MobileProvision)。 请以安装开发证书的方式安装发布证书,并以"Distro_"开头命名发布配置,紧接着命名另一个配置(这样你将同时拥有Distro_MyProject.mobileprovision
和MyProject.mobileprovision
)。
假如是Android,你需要创建一个密钥来签署.apk
文件,并使用名为SigningConfig.xml
的文件向编译工具传递一些信息。 该文件位于引擎的安装目录(Engine/Build/Android/Java/
)中。 假如你编辑了该文件,它就会影响你的所有项目。 然而,你可以将该文件复制到项目的Build/Android/
目录(无Java/
子目录),使其仅供该项目所用。 你可以在该文件的内部找到关于如何生成密钥和填写文件的说明。
高级设置
在主菜单栏中,点击文件(File)> 打包项目(Package Project)> 打包设置...(Packaging Settings...)或者点击编辑(Edit)> 项目设置(Project Settings)> 打包(Packaging),即可看到关于打包功能的一些高级配置选项。
目前,它们包括:
选项 | 说明 |
---|---|
编译配置(Build Configuration) | 编译代码类项目时使用的编译配置。 若要调试代码项目,请选择"调试游戏(DebugGame)"。 对于大多数具有最低限度调试支持但性能更佳的其他开发,请选择开发(Development)。 对于不含调试信息且不含调试导向性功能(例如绘制调试形状或打印屏幕上的调试消息)的最终发布版本,请选择发布(Shipping)。 注意,纯蓝图项目没有用于创建DebugGame编译的选项。 |
暂存目录(Staging Directory) | 包含游戏打包后的版本的目录。 当你在目标目录选择中选择另一个目录时,它将自动更新。 |
完整重编译(Full Rebuild) | 是否应编译所有代码。 如果禁用,则只编译修改过的代码。 这可以加快打包过程。 对于发布版本,你应该始终执行完整重编译,以确保没有任何内容丢失或过时。 该选项默认启用。 |
使用Pak文件(Use Pak File) | 是否将项目的资产打包为单个文件或单个包。 如果启用,所有资产将被放入单个.pak文件,而非复制所有单个文件(默认为启用)。 如果你的项目使用大量资产文件,则使用Pak文件可以使发布变得更简单,因为它减少了需要传输的文件数量。 该选项默认禁用。 |
生成文件块(Generate Chunks) | 是否生成可用于流送安装的.pak文件块。 |
编译HTTP文件块安装数据(Build Http Chunk Install Data) | 是否为HTTP块安装文件生成数据。 此配置允许在运行时安装将在Web服务器上托管的该数据。 |
HTTP数据块安装数据目录(Http Chunk Install Data Directory) | 它表示数据在编译后的目标安装目录。 |
HTTP文件块安装数据版本 | 它表示HTTP数据块安装数据的版本名称。 |
包含先决条件安装程序(Include Prerequisites Installer) | 它指定打包游戏是否包含先决条件的安装文件,例如可重新发布的OS组件。 |
始终应烘焙的目录(Directories to Always Cook) | 目录列表,其中包含始终应进行修改的文件。 默认情况下,打包功能会自动检测和烘焙游戏引用的所有内容。 一些必需的内容可能不会直接进行引用,例如自定义Slate UI的纹理。 这些内容所在的目录应该在此处列出,以便也将这些内容包含在包中。 |
签名和加密
随着虚幻引擎4.22的发布,我们为桌面平台(Windows、Mac和Linux)集成了行业标准OpenSSL库。
当以最终发布产品的形式分发时,.Pak
文件可以被签名或加密,这通常是为了防止数据提取或篡改。 要激活、停用或调整项目上的密码设置,请转到项目设置(Project Settings)菜单,找到加密(Crypto)分段。
以下设置可用于该菜单:
选项 | 说明 |
---|---|
加密Pak INI文件(Encrypt Pak INI Files) | 对项目的 |
加密Pak索引(Encrypt Pak Index) | 加密 |
加密UAsset文件(Encrypt UAsset Files) | 加密 |
加密资产(Encrypt Assets) | 完全加密 注意,此设置会对运行时文件I/O性能产生可度量的影响,并增加最终打包数据中的熵,从而降低分发补丁系统的效率。 |
启用Pak签名(Enable Pak Signing) | 激活或禁用 .pak 文件签名。 |
此外,可以设置或清除用于签名或加密的密钥。
内容烘焙
作为一名开发人员,在迭代新的或修改过的游戏内容时,你可能并不总是希望经历将所有内容都打包到Staging Directory并从此处运行的漫长过程。 因此,只需点击文件(File)> 烘焙内容(Cook Content)> [平台名称],即可为特定目标平台烘焙内容,而无需打包。
注意,该功能将更新项目本地开发人员工作区中的内容,并且不会将任何资产复制到暂存目录。 你可以直接从本地开发人员工作区运行游戏,以实现快速迭代。
优化加载时间
较短的加载时间对于开放世界场景游戏而言至关重要,而且对于任何类型的游戏来说也非常重要。 虚幻引擎提供了几种方法来优化项目在打包过程中的加载时间。 以下是缩短游戏加载时间的一些推荐做法。 如需了解如何打包项目,请参阅打包和烘焙游戏小节。
使用事件驱动加载器(Event Driven Loader,EDL)和异步加载线程(Asynchronous Loading Thread,ALT)
默认情况下,异步加载线程(Asynchronous Loading Thread)(ALT)是关闭的,但你可以在项目设置(Project Settings)菜单中的引擎(Engine)>流送(Streaming)分段下将其打开。 对于修改过的引擎,可能需要进行一些调整,但一般来说,ALT应该会将加载速度提高一倍,包括具有"预先"加载时间的游戏和持续流送数据的游戏。 ALT的工作方式是在两个独立的线程上同时运行序列化和后加载代码,因此,它增加了一项要求,即游戏代码中的
UObject
类构造函数、PostInitProperties
函数和Serialize
函数必须具有线程安全性。 激活ALT后,ALT会将加载速度提高一倍。 如需详细了解异步加载方法(在C++中)的使用,请参阅资产异步加载页面。事件驱动加载程序(Event-Driven Loader)默认是激活的,但你可以在项目设置(Project Settings)"菜单的"引擎(Engine)>流送(Streaming)"分段下"将其禁用。 对于大多数项目,EDL会将加载时间减半。 EDL是稳定的,可以向后移植到旧版本的虚幻引擎,也可以针对修改过或自定义的引擎版本进行调整。
压缩.pak文件
要在项目中使用
.pak
文件压缩,请打开"项目设置(Project Settings)"并找到"打包(Packaging)"分段。 在此部分,打开"打包(Packaging)"标题的高级部分,并选中出现的标有"创建压缩烘焙包(Create compressed cooked packages)"的复选框。大多数平台不提供自动压缩,而压缩你的
.pak
文件将减少加载时间,但有一些特殊情况需要考虑:
平台 | 建议 |
---|---|
Steam | Steam在用户下载文件时压缩文件,所以初始下载时间不会受到游戏正在压缩的.pak文件的影响。 然而,Steam的差分补丁系统在未压缩文件时会运行得更好。 压缩的.pak文件可以节省在客户系统上的空间,但是在打补丁时需要更长的时间来下载。 |
Oculus | 不启用 |
对pak文件排序
井井有条的.pak
文件对于减少加载时间而言至关重要。 为了帮你以最佳方式对.pak
文件进行排序,虚幻引擎4提供了一组工具来发现数据资产所需的顺序,并编译更快加载的包。 从概念上讲,此过程类似于基于配置文件的优化。 按照下列方法对我们的.pak
文件进行排序:
使用命令行选项
-fileopenlog
编译并运行已打包的游戏,这时引擎会记录文件的打开顺序。测试游戏的所有主要方面。 加载每个关卡、每个可操作角色、每个武器、每个载具等等。 加载所有内容后,退出游戏。
在部署的游戏中,将有一个名为
GameOpenOrder.log
的文件,其中包含了优化.pak文件顺序所需的信息。 例如,在Windows各版本上,该文件的位置是Windows/(YourGame)/Build/Windows/FileOpenOrder/
。 将该文件按/Build/Windows/FileOpenOrder/
路径复制到开发目录。 在Mac各版本上,该文件的位置是MacNoEditor/(YourGame)/Build/WindowsNoEditor/FileOpenOrder/
。 将该文件按路径Build/Mac/FileOpenOrder/
复制到开发目录。日志文件就绪后,重新编译
.pak
文件。 该文件和未来生成的所有.pak
文件都将使用日志文件中规定的文件顺序。
在生产环境中,日志文件应该检入源码控制,并使用-fileopenlog
的运行结果定期更新,包括游戏准备发行时的最后一次运行。