描述:
在Unity的开发过程中,我们有时根据需求需要获得Eclipse工程,或AS工程,来接入SDK或者在真机上调试.一般情况下,我们是直接选择在Unity点击即可获得我们所需,但是如果要做项目的持续集成的话,那我们就需要通过代码来做这些操作了。
特点:
-
可以针对不同的平台,不同的需要获得需要的工程,包含但不仅限于APK,Eclipse,AS,EXE
-
可扩展
架构
用户输入:根据用户点击不同的功能按钮确定用户打包的平台
逻辑控制:确定平台->准备工作(参数配置,清除残留文件等)->项目出包
目前支持的出包类型:
APK、EXE、Eclipse工程
Github下载地址:
主要代码:
using Assets.Editor;
using System;
using System.IO;
using UnityEditor;
using UnityEngine;
public class PackProjectTool
{
[MenuItem("Custom/Build Android(APK)")]
static void BuildAndroidPlatform_APK()
{
//此种写法,方便扩展
SettingBeforeBulid(PlayerSettings.productName, Platform.Android);
}
[MenuItem("Custom/Build Android(Eclipse)")]
static void BuildAndroidPlatform_Eclipse()
{
//此种写法,方便扩展
SettingBeforeBulid(PlayerSettings.productName, Platform.AndroidEclipse);
}
[MenuItem("Custom/Build PC")]
static void BuildPCPlatform()
{
//此种写法,方便扩展
SettingBeforeBulid(PlayerSettings.productName, Platform.PC);
}
/// <summary>
/// 打包之前参数设置
/// </summary>
/// <param name="appName">工程名</param>
/// <param name="platform">目标平台</param>
private static void SettingBeforeBulid(string proName, Platform platform)
{
string appName = "";
string targetDir = "";
string appFullPath = "";
BuildTargetGroup targetGroup = BuildTargetGroup.Standalone;
BuildTarget buildTarget = BuildTarget.StandaloneWindows;
BuildOptions buildOptions = BuildOptions.None;
switch (platform)
{
case Platform.Android:
appName = proName + ".apk";
targetDir = Application.dataPath.Replace("/Assets", "/targetAndroid");
targetGroup = BuildTargetGroup.Android;
buildTarget = BuildTarget.Android;
break;
case Platform.AndroidEclipse:
appName = proName;
targetDir = Application.dataPath.Replace("/Assets", "/targetAndroidEclipse");
targetGroup = BuildTargetGroup.Android;
buildTarget = BuildTarget.Android;
buildOptions = BuildOptions.AcceptExternalModificationsToPlayer;
break;
case Platform.PC:
appName = proName + ".exe";
targetDir = Application.dataPath.Replace("/Assets", "/targetPC");
targetGroup = BuildTargetGroup.Standalone;
buildTarget = BuildTarget.StandaloneWindows;
break;
default:
EditorMessageBox.MessageBox(IntPtr.Zero, "未选择平台!", "提示", 0);
return;
}
appFullPath = targetDir + "/" + appName;
//删除上一次打包残留文件
if (Directory.Exists(targetDir))
{
if (File.Exists(appFullPath))
{
FileOperation.DelectDirectory(targetDir);
}
}
else
{
Directory.CreateDirectory(targetDir);
}
//PlayerSettings
EditorUserBuildSettings.SwitchActiveBuildTarget(targetGroup, buildTarget);//切换平台
PlayerSettings.SetApplicationIdentifier(targetGroup, GameConstants.APPLICATIONIDENTIFIER);
PlayerSettings.bundleVersion = "v1.0.0";
//begin papcking
BuildProject(targetGroup, buildTarget, appFullPath, buildOptions);
}
/// <summary>
/// 构建项目
/// </summary>
/// <param name="group">组织</param>
/// <param name="target"></param>
/// <param name="targetDir"></param>
private static void BuildProject(BuildTargetGroup group,BuildTarget target,string targetDir,BuildOptions buildOptions=BuildOptions.None)
{
//ShowBuildPlayerWindow
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.locationPathName = targetDir;
buildPlayerOptions.scenes = GetActiveScenes();
buildPlayerOptions.targetGroup = group;
buildPlayerOptions.target = target;
buildPlayerOptions.options = buildOptions;//AcceptExternalModificationsToPlayer
string res = BuildPipeline.BuildPlayer(buildPlayerOptions);
if (res.Length > 0)
{
throw new Exception("BuildPlayer failure: " + res);
}
}
/// <summary>
/// 获取所有激活的场景
/// </summary>
/// <returns></returns>
private static string[] GetActiveScenes()
{
string[] scenesArr = EditorBuildSettingsScene.GetActiveSceneList(EditorBuildSettings.scenes);
return scenesArr;
}
}