Unity 命令行打包

时间:2022-06-29 15:26:55

  在写文章之前先说下unity已经自带了可视化打包,我为什么要多此一举进行命令行打包,估计刚接触unity的小伙伴都会有这样的疑惑,当你游戏要发布到Android平台你就会知道,需要接不通平台的sdk,甚至有些平台还需要改包名。而游戏从接完平台sdk,到发布还需要经过无数次的测试,发布后甚至还需若干次升级。你要是每次都手动的将每个平台jar、res等,拷贝到unity Plugins文件下,然后再去改包名,暂且不说这样多次操作是多么的麻烦无聊,关键是你要是哪天不小心手残了,把什么拷贝错了或者包名写错了忘记改了等等,还特么的要重来,你能受得了嘛,Unity 命令行打包好了,我觉得我受不了,那么来吧,写个打包工具吧。Unity 命令行打包


  首先在unity的assets文件下建立Editor文件夹,我们把工具脚本写在此处,写在此处的目的是想在unity菜单栏上,创建打包按键。这个大家应该都知道吧。我们写个静态方法叫buildQQ吧,然后在方法上设置菜单[MenuItem("hugeBuild/QQ")],好吧,请原谅我的自恋,居然自称虎哥。效果出来了,截图作为真相。(注:使用头文件using UnityEditor;)

Unity 命令行打包

        那么下面我们就该在buildQQ方法中先去执行文件拷贝了,我们先把不同平台的jar、res、AndroidManifest.xml,放在Assets/Android/QQ(360、xiaomi)等。当我打包QQ的时候,我们先把Asssets/Plugins/Android目录下的文件删除,然后将Assets/Android/QQ文件拷贝到Asssets/Plugins/Android下。具体C#文件操作我就不多说了,太简单了,网上一搜到处都是。

        等待拷贝完成后,该去解析AndroidManifest.xml中包名了,因为不同平台包名要求会不同。把获取到的包名赋值给PlayerSettings.bundleIdentifier。具体方法我在这里说下吧!代码如下:

using System.Xml;

static string getPackage() {
string content = System.IO.File.ReadAllText("Assets/Plugins/AndroidManifest.xml");
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(content);
XmlElement rootElem = xmldoc.DocumentElement; //获取根节点
return rootElem.Attributes["package"].Value;
}

        搞定后,设置keystore账号和密码。

        PlayerSettings.Android.keystoreName = "Assets/xiaohu.keystore";
PlayerSettings.Android.keystorePass = "******";
PlayerSettings.Android.keyaliasName = "huge";
PlayerSettings.Android.keyaliasPass = "******";


         最后调用:打包函数 BuildPipeline.BuildPlayer(lsit.ToArray(), "Sample.apk", BuildTarget.Android, BuildOptions.None);等待完成,但是这里面参数要说明下,第一参数是要打包的场景,第二是打出包的路径和名称,第三是编译的平台,第四是编译的选项,一般选择Node,即可,具体参数详解到官网查看api。下面提供一种方法去获取所有需要打包的场景名称。

        List<string> lsit = new List<string>();
foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
if (scene.enabled) {
lsit.Add(scene.path);
}
}

        大功告成!Unity 命令行打包