如何不启动Unity执行对应的脚本
这一篇文章是我完善我们元宇宙APP整体打包流程中想到的一个功能点,对比现在的打包,真实非常的糟糕。
因为我们的项目是Flutter+Unity的混合体,所以每次打包都需要导出iOS和安卓的Unity包。之后再按照平时打Flutter的安装包出来。
打Unity的包
我们目前的Unity算是比较庞大的架构,用的是目前阿里云达摩院的底座。别说这底座不是一般的烂,从阿里的一个桌游临时剥离出来的框架,代码老旧,很多遗留的资源等等。
我们采用了最新的HybridCLR热更新框架,并且使用AA包作为管理资源热更。对于Unity和Flutter进行通信我们采用flutter_unity_widget这个框架。
所以整体对于Unity的打包就十分的麻烦,我们不但需要保存两份代码,分别是执行iOS和安卓平台的导包。这是因为一份代码切换平台时间是十分巨慢的,这也是用两份代码后续不会因为切换平台浪费太多的时间。
导出iOS的包就需要执行下面的操作
① HybridCLR
①.① HybridCLR/CompileDll/ActiveBuildTarget
①.② HybridCLR/Generate/All
①.③ HybridCLR/Build/BuildAssetsAndCopyToStreamingAssets
② Addressables
②.① Addressables/Build data in APP
③ Flutter Export
③.① Export Flutter iOS Release
③.① Export Flutter Android Release
至此从Unity的操作完毕,按照我现在2019年顶配的开发macbookPro至少每个平台至少需要20分钟的导出时间,加在一起大概需要40分钟,这种理想的情况还是在有人值守能在上一部操作之后赶紧下一步操作的情况下进行的。
但是上面操作完毕,给iOS的包还不能马上使用,还需要额外的操作。
打开iOS Unity的项目目录的路径~/HybridCLRData/iOSBuild
下,执行下面的脚本。
bash
bash build_libil2cpp.sh
执行完毕之后,将目录~/HybridCLRData/iOSBuild/build/libil2cpp.a
文件复制到Flutter项目中~/ios/UnityLibrary/Libraries/libil2cpp.a
处。
打开~/ios/UnityLibrary/Unity-iPhone.xcodeproj
文件将UnityFramework的Bitcode关闭掉。
至此导出包的全部操作才算操作完毕,整体的过程我写出来之后就已经感觉很繁琐了,别说每天因为Unity的更新就要重新的操作。
如果Unity工程的代码更新的频繁,那么我一天的时间就花在打包上面了。
为此我一直想通过Dart写一套打包脚本,不但包含导出Unity包,之后打出apk/ipa的安装包。苹果的就上传Testflight安卓的就上传到蒲公英。
写的时候发现其实整个过程步骤还是挺多的,所以就萌发了上一篇要做一个自动化流程软件,可以将这些流程组合起来的想法。
比如包含至少下面的自动化插件
- 获取当前代码是否最新(对比本地Hash和远程最新的Hash)
- 导出Unity iOS/Android包
- Flutter 打包
- 上传Testflight
- 上传蒲公英
应该这个过程可以公开使用的步骤还是很多的,就可以将一个完整的流程拆分处不同的插件。每个插件都会死一个独立命令行程序,也可以是其他语言实现的,比如用Shell。
不同语言怎么串联起来呢?只需要将他们规定输入和输出保持一直都统一走文件,这样整体运行期间的变量可以通过Environment获取也可以将每个插件运行输入和输出放在一个全局的字典保管,其他程序可以通过运行的ID进行访问。
这个扯远了,现在继续说怎么实现Uinty的自动化打包。
本来昨天我是持怀疑态度的,心想这个按照理论上应该支持,但是不是很确定。通过Ai的推荐,果然有对应的参数和方法。
具体的Unity官方文章的参考可以参考这里 docs.unity3d.com/cn/2018.4/M...
我很快就按照所说的方法,在Editor创建了Unity编辑器脚本。不过在测试的过程中发现了一些坑需要注意。
1 在对应文件夹下运行不会读取当前文件夹项目进行操作,而是最近Uinty Hub打开的项目,可以使用 -projectPath这个参数进行修改
2 对于当前的Unity没有退出完毕,会弹出一个运行允许一个Unity实例错误。
3 默认没有关闭UI,会影响执行的速度。
目前我们最终的打包命令如下:
shell
/Users/king/Documents/2021.3.16f1c1/Unity.app/Contents/MacOS/unity -quit -batchmode -executeMethod ExportAppData.exportAndroid -nographics -projectPath ./
🔴第一个参数是Unity的路径,每个人的路径可能不一样,需要自己设置。
🟢第二个参数代表运行完毕自动退出
🟢第三个参数是开启批处理模式,这样不会启动Untiy界面
🟢第四个参数代表要执行Unity的对应方法
🔴第五个参数是执行的方法类名和方法 这个类名和方法一定要唯一,方法要是静态方法。
🟢第六个参数不启动UI支持在只有主机的电脑运行
🟢第七个参数是代表设置自定义工程路径
🔴第八个参数是代表工程路径
🔴代表是需要根据情况进行修改的,🟢代表参数不需要变动的。第八个参数如果在当前的工程运行也是可以不进行修改的。
ExportAppData.exportAndroid这个实现的过程就不用说了,其实也很简单就把对应功能菜单的方法串联在一起调用即可。
不过不得不说,这么长时间没有学习Unity,突然写C#代码,一下基本语法就已经忘记了。😂