/ 开发笔记

#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