研发了两年多的项目开始推广了,为了应对多平台、多渠道需要打包巨多的应用程序,写了个一键打包工具,下面是源码及讲解。
这个打包工具包含的功能有一下几点:
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using LitJson;
namespace BuildTools
{
public class BuildTools
{
[InitializeOnLoad]
public class GlobalConfig
{
//自动填入keystore密码工具
static GlobalConfig()
{
PlayerSettings.Android.keystorePass = "XXXXXX";
PlayerSettings.Android.keyaliasName = "XXX";
PlayerSettings.Android.keyaliasPass = "XXXXXX";
}
}
public class BuildJson
{
public int Downloadplatform { set; get; }
public int GameType { set; get; }
}
/// <summary>
/// 用户安装包下载渠道
/// </summary>
public enum Downloadplatform
{
TempTest,//内部测试
TapTap,
Game4399,
Steam,
/// <summary>
/// 豌豆荚
/// </summary>
WanDouJia,
/// <summary>
/// 官方群
/// </summary>
Official
}
/// <summary>
/// 游戏类型 功能控制开关
/// </summary>
public enum GameType
{
/// <summary>
/// 地图版
/// </summary>
GameLife,
/// <summary>
/// 对战总版
/// </summary>
XinMo,
}
//得到工程中所有场景名称
static string[] SCEnes = FindEnabledEditorScenes();
//static string[] Target_SCEnes;
//一系列批量build的操作
//快易典apk打包
[MenuItem("BuildTools/正式服/游戏人生")]
static void GameLife()
{
BulidTarget("游戏人生(4399)", GameType.GameLife, Downloadplatform.Game4399);
BulidTarget("游戏人生(TapTap)", GameType.GameLife, Downloadplatform.TapTap);
BulidTarget("游戏人生(官方)", GameType.GameLife, Downloadplatform.Official);
BulidTarget("游戏人生(豌豆荚)", GameType.GameLife, Downloadplatform.WanDouJia);
}
//批量打包apk包
[MenuItem("BuildTools/正式服/心魔")]
static void XinMo()
{
BulidTarget("心魔(4399)", GameType.XinMo, Downloadplatform.Game4399);
BulidTarget("心魔(TapTap)", GameType.XinMo, Downloadplatform.TapTap);
BulidTarget("心魔(官方)", GameType.XinMo, Downloadplatform.Official);
BulidTarget("心魔(豌豆荚)", GameType.XinMo, Downloadplatform.WanDouJia);
}
static BuildJson buildJson = new BuildJson();
//这里封装了一个简单的通用方法。
static void BulidTarget(string apkName, GameType gameType, Downloadplatform Downloadplatform)
{
buildJson.Downloadplatform = (int)Downloadplatform;
buildJson.GameType = (int)gameType;
//buildJson.version = "000157";
WriteLine();//把数据写入项目本地文件,用于项目运行时拿取
string app_name = apkName;
//string target_dir = Application.dataPath + "/TargetAndroid";
string target_dir = "E:/APK_正式服";
string target_name = app_name + ".apk";
//环境变量(宏定义)
string ScriptingDefinesymbols = "VUFORIA_SAMPLE_ORIENTATION_SETTINGS;VUFORIA_ANDROID_SETTINGS;CROSS_PLATFORM_INPUT;MOBILE_INPUT;";
BuildTargetGroup targetGroup = BuildTargetGroup.Android;
BuildTarget buildTarget = BuildTarget.Android;
//string applicationPath = Application.dataPath.Replace("/Assets", "");
//每次build删除之前的残留
if (Directory.Exists(target_dir))
{
if (File.Exists(target_name))
{
File.Delete(target_name);
}
}
else
{
Directory.CreateDirectory(target_dir);
}
//==================这里是比较重要的东西,设置打包apk的bundleID以及区分宏定义调用相应代码=======================
switch (gameType)
{
case GameType.GameLife:
PlayerSettings.applicationIdentifier = "com.dxzb.xinmo";
PlayerSettings.bundLeversion = "1.0";
//PlayerSettings.Android.bundLeversionCode = 14;
PlayerSettings.SetScriptingDefinesymbolsForGroup(targetGroup, ScriptingDefinesymbols + "Cheng");
PlayerSettings.productName = "游戏人生";
break;
case GameType.XinMo:
PlayerSettings.applicationIdentifier = "com.dxzb.xinmose";
PlayerSettings.bundLeversion = "1.0";
//PlayerSettings.Android.bundLeversionCode = 14;
PlayerSettings.SetScriptingDefinesymbolsForGroup(targetGroup, ScriptingDefinesymbols + "Cheng;BattleSplit");
PlayerSettings.productName = "心魔";
break;
case GameType.BreakThrough:
PlayerSettings.applicationIdentifier = "com.dxzb.xinmoBT.m4399";
PlayerSettings.bundLeversion = "1.0";
//PlayerSettings.Android.bundLeversionCode = 14;
PlayerSettings.SetScriptingDefinesymbolsForGroup(targetGroup, ScriptingDefinesymbols + "Cheng;BattleSplit");
PlayerSettings.productName = "灵兽闯关";
break;
}
PlayerSettings.companyName = "xxx";
//==================这里是比较重要的东西=======================
//开始Build场景,等待吧~
GenericBuild(SCEnes, target_dir + "/" + target_name, buildTarget, BuildOptions.None);
}
static string[] FindEnabledEditorScenes()
{
List<string> EditorScenes = new List<string>();
foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
{
if (!scene.enabled) continue;
EditorScenes.Add(scene.path);
}
return EditorScenes.ToArray();
}
/// <summary>
/// 打包
/// </summary>
/// <param name="scenes">打包场景</param>
/// <param name="target_dir">APK输出文件夹地址</param>
/// <param name="build_target">打包平台</param>
/// <param name="build_options"></param>
static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)
{
//EditorUserBuildSettings.SwitchActiveBuildTarget(build_target);
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, build_target);
BuildPipeline.Buildplayer(scenes, target_dir, build_target, build_options);
//string res = BuildPipeline.Buildplayer(scenes, target_dir, build_target, build_options);
//if (res.Length > 0)
//{
// throw new Exception("Buildplayer failure: " + res);
//}
}
/// <summary>
/// 流 编辑器
/// </summary>
static void WriteLine()
{
StreamWriter writer;
string filePath = "";
filePath = Application.streamingAssetsPath + "/BuildJson.json";
FileInfo fileInfo = new FileInfo(filePath);
writer = new StreamWriter(filePath, false);
writer.Write(JsonMapper.ToJson(buildJson),false);
// 释放 流
writer.Close();
//writer.Flush();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。