Unity的打包管线和自动化
从Build开始说起
Unity自己把资源工作流程划分为几部分
https://docs.unity3d.com/cn/2023.2/Manual/AssetWorkflow.html
导入 然后在编辑器下组合和修改 然后就到了Build这一步 也就是构建
什么是构建呢?
构建是指将已完成的项目导出为二进制文件的过程,然后您可以在您选择的平台上分发和运行该文件。例如,在针对 Windows 进行构建时,Unity 会生成一个
.EXE
文件以及一些随附的数据文件,然后您可以分发这些文件。如果您使用 Addressables 或 Asset Bundles 将您的资源分组为单独的下载包中,您还需要构建这些包文件以进行分发。
简单来说就是针对不同的设备平台 把编辑器里做好的东西打包出来 这个过程就是构建
构建之后就可以通过各种渠道进行分发(Steam等等)最后资源会在用户设备上被读取出来
文档里也提到了Addressable和AB包对资源进行分组的事情 这个就是另外一方面的问题了(深坑)
构建管线——BuildPipeline
构建管线 和渲染管线概念上比较类似 可以理解为构建的一整套流程
不过我一般叫的比较顺手 都叫打包管线 因为构建这个词确实很学术不是吗
Unity的历史中有三种主要的打包管线出现
- 5.X和2017时代 BuildPipeline.BuildPlayer 早期的传统管线 现在已经不用了
- 2018至今 BuildPipeline.BuildAssetBundles 现在的默认管线 也是最常用的 你现在默认在Build窗口按下Build in就是走这个管线
- 2019至今 SBP全名Scriptable Build Pipeline 比较新的管线 默认管线只在C++层下跑 SBP则是在公共C#层跑的
默认管线和SBP还是有不少区别的 但是SBP在现在的项目里用的还不是很多(新东西商业化比较慢 但应该是有人用的)
SBP——Scriptable Build Pipeline
https://docs.unity3d.com/Packages/[email protected]/manual/index.html
https://zhuanlan.zhihu.com/p/366780685
https://zhuanlan.zhihu.com/p/369264807
https://www.yooasset.com/docs/guide-editor/AssetBundleBuilder
SBP同样会构建AB包 但SBP在文档里提到了 建议新的项目去用Addressable构建AB包 而不是直接用SBP
它和默认管线相比有几个优势 可自定义化的程度高 AB包构建的速度提高了
甚至可以做到指定每个AB包的压缩形式和程度
但指南里推荐用Addrassable 我想还是因为代码自定义比较复杂的原因吧
需要在资源管理上有很多经验的老手才能做好
SBP和Addressable的关系
https://docs.unity3d.com/Packages/[email protected]/manual/build-intro.html
https://zhuanlan.zhihu.com/p/500535555
首先 Addressable(以下简称AA)主要提供的是寻址的服务
实际上它也是在调用构建管线去构建AB包的
只是你可以直接用SBP去自定义构建的流程然后替换掉原本Build界面下的Build in按钮干的事情
你可以用AA按照你当前标记好的Group进行构建
AA提供了开发过程中的Build测试(就在AA窗口下可以先Build 然后让编辑器使用Existing Build进行资源读取)
总之AA的构建AB包过程是可以被更改的 功能主要还是体现在寻址这两个字上
自动化打包?
当你自己做Demo的时候 打包肯定没有那么多讲究 点开Build 选一下打包的场景 然后build in按钮按下
等进度条跑完之后 windows就会弹出打包后的文件了 这听起来没啥毛病
但是商业项目里 一次Build的时间可比你想的要长多了 假如一次构建要花40分钟 你每天就有40分钟没办法做开发工作
你能接受PM可不能接受 所以就有了专门用来打包的打包机和一套自动化的打包流水线
所谓自动化打包 简单概括一下就是
只针对Windows或安卓的游戏 有一台Windows打包机 利用bat去调用Unity的Build
双端 安卓和IOS游戏 有一台Mac打包机 利用shell去调用Unity的Build
然后不管是什么系统的打包机 都有个自动化的管理和定时工具去控制bat或者shell的执行
这就是自动化打包
Jenkins在Mac下全自动打包
http://www.xuanyusong.com/archives/3349
https://zhuanlan.zhihu.com/p/40657950
https://www.cnblogs.com/jietian331/p/16857040.html
偷懒了 这里不打算讲太多 我个人认为这部分适合运维干 当然客户端可能也要操心这个就是了
Jenkins是一个自动化管理工具 可以做到同一局域网下 只要有浏览器就可以通过Jenkins来让目标设备自动的 定时的执行某一项任务
上面说的 我们可以利用Shell脚本去控制Unity对项目进行打包
就要利用Jenkins帮我们干这件事 流程跑通了 你就可以把Jenkins接进企业微信机器人或者飞书机器人啥的 可以看到构建的结果和报错信息