#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
扫一扫关注微信公众号:耿直的IT男阿斌
聊一聊IT男眼中的世界