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