携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
系统总体介绍
本系列文章介绍一套基于Jenkins的Unity自动化打包方案。本方案中:
- 在局域网内部署一台Windows系统的Jenkins服务器,创建打包项目
- 在打包项目上配置打包参数,通过Jenkins拉取svn,并执行基于python的打包脚本。
- python打包脚本会初始化Windows服务器上的打包输出目录,从Jenkins获取参数,调用Unity项目中的命令行打包函数,并向Unity传递打包参数
- Unity命令行方式执行打包函数,进行打包
- Unity打包完成后,Python脚本会将包拷贝到局域网内的一个共享目录中
- 最后Jenkins会发送邮件通知打包结果。
本系统可以做到方便的自定义一键打包,根据选择的参数,可以打出不同平台(比如Windows和Android),不同商店(比如Steam和Google Play),不同类型(比如测试包,最终上线包)等各种版本包。解放了人工的重复的易错的操作,并且借助Jenkins,可以追溯每个包的环境,比如svn版本号,使用的参数,可以对构建进行标记,设置完成svn的tag。
Unity命令行打包基础
Unity batchmode
简单来说,Unity命令行打包是在Unity batchmode下,调用相关的打包函数。这个打包函数一般是一个静态方法,例如:
public class MyBuilder
{
public static void MakePackage()
{
//do build
}
}
通过命令行执行Unity的batchmode,并调用这个函数:
os.system(f'"{unity}" -batchmode -nographics -executeMethod MyBuilder.MakePackage -projectPath {proj_path} -logFile {log_path} -configFilePath:{json_path}')
上面这个命令行,是在Python中调用的,python3的格式化字符串填充需要的参数并使用os.system执行该命令行命令。其中:
{unity}是打包使用的Unity.exe文件的路径.- 参数上必须有
-batchmode表示这是批处理方式运行Unity,否则就会启动Unity编辑器的UI了。 -nographics表示不需要加载图形模块。-executeMethod则是指定了我们的打包函数。-projectPath指定了Unity项目的路径,即Assets目录的父目录。-logFile指定了Unity输出的Log文件的路径,如果打包出错,可以查看这个Log文件查找原因。-configFilePath:{json_path}这个则是我自己定义的命令行参数,这个参数指向了一个json文件,其中包含所有的打包设置,我们在打包函数中要解析这参数,获取到json文件的路径并载入解析它,从而获取到所有的自定义打包参数。之所以这么做,是因为通过命令行传递参数比较麻烦,会让命令行变的很长,并且每次增加参数都需要修改脚本和解析命令行参数的代码,很麻烦。所以我将这些参数都输出到了一个json文件中,再在打包函数中解析就可以了。
BuildPlayer
打包函数只是我们自己写的一个普通函数,它可以打出游戏包是因为使用了UnityEditor.BuildPipeline.BuildPlayer(BuildPlayerOptions buildPlayerOptions)这个方法。调用这个方法,我们需要设置buildPlayerOptions参数,后面会详细介绍。
打包函数还要做什么?
游戏可能需要根据不同的情况对代码和资源进行一定程度上的定制,这就需要打包函数进行处理。比如对于不同情况的代码,定义或取消定义一些预编译参数;对于不同情况选择使用不同的资源,以及构建不同的Unity Scene。而命令行打包,就是通过在执行Unity命令行时,传入不同的参数,让打包函数进行处理,最终调用BuildPlayer打包。而打包之后还可能做一些压缩zip包之类的后续操作。这些内容是完全和业务相关的,本文中将会介绍一些通用的做法以及注意事项。
小结
本篇中介绍了整个系统的运行原理,以及介绍了Unity命令行打包的基本原理。下篇中,将详细介绍C#端的打包系统的架构和一些注意事项。