#Unity# 通过扩展编辑器实现快速输出iOS工程

有没有办法快速输出一个工程,而不用每次都重复输入工程目录呢?

问题环境

Unity输出iOS工程,支持两种模式:

Unity_Build_Settings_01

  1. 使用快捷键,直接输出并打包调试 (Build And Run)

在Mac的快捷方式是 Mac键+B, Windows下是 Ctrl+B。

好处
除了第一次,不用每次都输入工程目录。

不好的地方
输出以后会自动进入打包调试。调试功能需要调用XCode的工具,联调的时候,经常会挂,导致必须强制关闭Unity。

  1. 使用菜单,调出打包设置(Build Settings...)页面,从这里选择打包。
    Unity_Build_Settings_02

从这两个菜单进行输出。如果选择Build,则只输出工程,如果选择BuildAndRun,输出工程后会自动尝试调试。

不好的地方
每次都需要输入要导出的工程目录名。

那么,问题来了,有没有办法可以自动重用设置好的工程目录,不弹窗直接输出呢?

原因

没有什么原因,这是Unity很久以来的规定。

解决方法

方法就是自己写编辑器脚本。

把以下代码放到一个.cs文件,然后放到Editor目录下。

参考代码:

using UnityEngine;
using UnityEditor;
using System.IO;
using Debug = UnityEngine.Debug;
using System.Collections.Generic;

public static class AutoBuilder { static string GetProjectName() { string[] s = Application.dataPath.Split(’/’); return s[s.Length - 2]; }

static string[] GetScenePaths()
{
	List<string> scenes = new List<string>();
	for(int i = 0; i < EditorBuildSettings.scenes.Length; i++)
	{
		var scene = EditorBuildSettings.scenes[i];
		Debug.LogFormat("[Builder] Scenes [{0}]: {1}, [{2}]", i, scene.path, scene.enabled?"x":" ");

		if(scene.enabled){	
			scenes.Add(scene.path);
		}
	}

	return scenes.ToArray();
}

[MenuItem("Tools/Build For iOS: proj.ios")]
static void BuildForiOS()
{
	System.Console.WriteLine ("[Builder] Starting to build iOS project ...");
	string projDir = Application.dataPath + "/../proj.ios";  // 这里是输出的目录, Output Project Path

	BuildOptions option = BuildOptions.None;
	if(Directory.Exists(projDir))
	{
		Debug.LogFormat ("[Builder] project is existing: {0}", projDir);
		option = BuildOptions.AcceptExternalModificationsToPlayer;
	}
	else
	{
		Debug.LogFormat ("[Builder] project is not existing: {0}", projDir);
	}

	var args = System.Environment.GetCommandLineArgs();
	Debug.LogFormat(args.ToString());

	if(EditorUserBuildSettings.activeBuildTarget != BuildTarget.iOS){
		Debug.LogFormat("[Builder] Current target is: {0}, switching to: {1}", EditorUserBuildSettings.activeBuildTarget, BuildTarget.iOS);
		if(!EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.iOS, BuildTarget.iOS)){
			Debug.LogFormat("[Builder] Switching to {0}/{1} failed!", BuildTargetGroup.iOS, BuildTarget.iOS);
			return;
		}
	}

	BuildPipeline.BuildPlayer(GetScenePaths(), projDir, BuildTarget.iOS, option);

	Debug.LogFormat ("[Builder] Done: " + projDir);
}

}

然后,你就可以通过点击菜单,直接输出工程了
Unity_Build_Settings_03

你还可以参考文档,为这个菜单项添加一个快捷键
https://learn.unity.com/tutorial/editor-scripting#5c7f8528edbc2a002053b5f9

参考

  1. Unity Editor Extensions – Menu Items https://unity3d.com/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items
  2. Editor Scripting https://learn.unity.com/tutorial/editor-scripting#5c7f8528edbc2a002053b5f9