Unity Android一键打包

开发过程中总是需要不停的打包,给策划或者测试人员测试,花费很多时间。在这里做一个一键打包工具,让测试人员自行打包,开发只需要上传代码,测试人员只需要拉取,然后打包就可以。

iOS 制作ipa,设置导出Xcode工程配置:https://blog.csdn.net/qq_33515628/article/details/106361332

一、效果图

1、配置签名:

项目需要配置签名,这里点击一下就可以配置签名(如果项目中不需要,可以忽略此处)

2、Build Addressable:

每次打包的时候,需要build Assressable,因为非开发人员,可能不知道具体怎么用或者操作比较繁琐,在这里也一键配置一下如果项目中不需要,可以忽略此处)

3、制作安卓包:

使用代码制作APK。旁边有toggle,如果点击“制作安卓包”包含上面所有的。“内网”如果勾选就是测试服,如果不勾选就是线上服。

测试人员,只需要点击“制作安卓包”按钮,就可以打出APK包,放在桌面上。

二、代码部分

1、菜单栏显示

方便不熟悉Unity界面人员使用

 [UnityEditor.MenuItem("xxxx/制作安卓包", false, 1)]

2、通过GUI画出面板

        GUILayout.Space(20);
        GUILayout.BeginVertical(); 
        bool clickSign = GUILayout.Button("配置签名", GUILayout.Height(30), GUILayout.Width(120));
        bool clickBuildAddress = GUILayout.Button("Build Addressable", GUILayout.Height(30), GUILayout.Width(120));
        GUILayout.BeginHorizontal();
        bool clickAndroid = GUILayout.Button("制作安卓包", GUILayout.Height(30), GUILayout.Width(120));
        this.isSign = GUILayout.Toggle( this.isSign, "配置签名");
        this.isBuildAddressable = GUILayout.Toggle(this.isBuildAddressable, "Build Addressable");
        this.isNeiWang = GUILayout.Toggle( this.isNeiWang, "内网");
        GUILayout.EndHorizontal();
       
        GUILayout.EndVertical(); 

3、配置签名

        PlayerSettings.companyName = "xxx";
        PlayerSettings.productName = "xxx";
        //需要把签名文件放在Assets同一级的目录中
        PlayerSettings.Android.keystoreName = "user.keystore";
        PlayerSettings.Android.keystorePass = "123456";
        //BundleID
        PlayerSettings.Android.keyaliasName = "com.xxxx.xxx.xxxxx";
        PlayerSettings.Android.keyaliasPass = "123456";

4、Build Addressable

 UnityEditor.AddressableAssets.Settings.AddressableAssetSettings.BuildPlayerContent();

5、制作安卓包

        //获取桌面地址
        string buildPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        UnityEngine.Debug.Log("安装包路径:"+buildPath);
        string name = "安装包";
        //是否是开发环境,也可以配置到面板上
        EditorUserBuildSettings.development = true;
        //使用Unity打包,不需要出Android工程,防止其他人员的选项为Gradle
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Internal;
        //把所有的Scene加入
        foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
        {
            if (!scene.enabled) continue;
            levels.Add(scene.path);
        }
        //选择安卓平台
        EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
        DateTime dt = DateTime.Now;
        string tempName = this.isNeiWang ? "内网" : "外网"; 
        string APKName = buildPath+"/"+name +"_"+ tempName + string.Format("{0:yyyyMMddHHmm}", dt) + ".apk";
        UnityEngine.Debug.Log("打包的名字:" + APKName);
        //开始制作安卓包
        BuildPipeline.BuildPlayer(levels.ToArray(), APKName, BuildTarget.Android, BuildOptions.Development);

三、全部代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class BuildAndroidApk : EditorWindow {
    static BuildAndroidApk m_Window;
    static int windowWidth = 440;
    static int windowHeight = 400;
    private bool isSign = true;
    private bool isBuildAddressable = true;
    private bool isNeiWang = true;
    static List<string> levels = new List<string>();

    [UnityEditor.MenuItem("xxx/制作安卓包", false, 1)]
    public static void ShowBuildPackage() {
        m_Window = GetWindow<BuildAndroidApk>(true, "Build Package");
        m_Window.minSize = m_Window.maxSize = new Vector2(windowWidth, windowHeight);
    }

    public void OnGUI() {
        GUILayout.Space(20);
        GUILayout.BeginVertical(); 
        bool clickSign = GUILayout.Button("配置签名", GUILayout.Height(30), GUILayout.Width(120));
        bool clickBuildAddress = GUILayout.Button("Build Addressable", GUILayout.Height(30), GUILayout.Width(120));
        GUILayout.BeginHorizontal();
        bool clickAndroid = GUILayout.Button("制作安卓包", GUILayout.Height(30), GUILayout.Width(120));
        this.isSign = GUILayout.Toggle( this.isSign, "配置签名");
        this.isBuildAddressable = GUILayout.Toggle(this.isBuildAddressable, "Build Addressable");
        this.isNeiWang = GUILayout.Toggle( this.isNeiWang, "内网");
        GUILayout.EndHorizontal();
       
        GUILayout.EndVertical(); 
        
        this.OnClickSetSign(clickSign);
        this.OnClickGUIBuildAnroid(clickAndroid);
        this.OnClickBuildAddressAble(clickBuildAddress);
    }

    private void OnClickSetSign(bool isClickSetSign) {
        if (!isClickSetSign) {
            return;
        }
        PlayerSettings.companyName = "xxx";
        PlayerSettings.productName = "xxxx";
        PlayerSettings.Android.keystoreName = "user.keystore";
        PlayerSettings.Android.keystorePass = "123456";
        PlayerSettings.Android.keyaliasName = "com.xxx.xxx.xxxx";
        PlayerSettings.Android.keyaliasPass = "123456";
    }

    private void OnClickBuildAddressAble(bool isClick) {
        // UnityEngine.AddressableAssets.
        if (!isClick) {
            return;
        }
        UnityEditor.AddressableAssets.Settings.AddressableAssetSettings.BuildPlayerContent();
    }

    private void OnClickGUIBuildAnroid(bool click)
    {
        if (!click) {
            return;
        }
        string buildPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
        UnityEngine.Debug.Log("安装包路径:"+buildPath);
        string name = "安装包";
        EditorUserBuildSettings.development = true;
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Internal;

        this.OnClickSetSign(this.isSign);
        this.OnClickBuildAddressAble(this.isBuildAddressable);
        GoldenDungeon.Network.NetworkManager.Instance.initUrlIndex = this.isNeiWang ? 0 : 1;
        
        foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
        {
            if (!scene.enabled) continue;
            levels.Add(scene.path);
        }
        EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
        DateTime dt = DateTime.Now;
        string tempName = this.isNeiWang ? "内网" : "外网"; 
        string APKName = buildPath+"/"+name +"_"+ tempName + string.Format("{0:yyyyMMddHHmm}", dt) + ".apk";
        UnityEngine.Debug.Log("打包的名字:" + APKName);
        BuildPipeline.BuildPlayer(levels.ToArray(), APKName, BuildTarget.Android, BuildOptions.Development);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33515628/article/details/106359932