#Unity# 通过扩展编辑器实现快速输出iOS工程
有没有办法快速输出一个工程,而不用每次都重复输入工程目录呢?
问题环境
Unity输出iOS工程,支持两种模式:

- 使用快捷键,直接输出并打包调试 (Build And Run)
在Mac的快捷方式是 Mac键+B, Windows下是 Ctrl+B。
好处
除了第一次,不用每次都输入工程目录。
不好的地方
输出以后会自动进入打包调试。调试功能需要调用XCode的工具,联调的时候,经常会挂,导致必须强制关闭Unity。
- 使用菜单,调出打包设置(Build Settings...)页面,从这里选择打包。

从这两个菜单进行输出。如果选择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); }
}
然后,你就可以通过点击菜单,直接输出工程了

你还可以参考文档,为这个菜单项添加一个快捷键
https://learn.unity.com/tutorial/editor-scripting#5c7f8528edbc2a002053b5f9
参考
- Unity Editor Extensions – Menu Items https://unity3d.com/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu-items
- Editor Scripting https://learn.unity.com/tutorial/editor-scripting#5c7f8528edbc2a002053b5f9