在之前的篇章里面,我们一直在编辑器里面干活,然后做好资源的编辑和代码开发后,我们可以直接在编辑器内点击那个播放按钮就能真实的把游戏跑起来,但是有时候,我们可能希望在菜单里面加个按钮,这样我们可以直接执行一些批量的编辑动作,又或者我们希望像数组元素显示在Inspector面板上的效果一样,为我们的自定义数据结构也画一个特殊的编辑界面,那么这个时候我们就需要扩展Unity编辑器。
给编辑器加个菜单
我们知道Unity编辑器窗口顶部有一系列菜单,我们可以通过编写C#代码来增加我们自定义的菜单,现在我们新建一个脚本资源,叫MenuTest吧,代码如下:
using UnityEditor;
using UnityEngine;
public static class MenuTest
{
[MenuItem("MenuTest/Say Hello World")]
public static void SayHelloWorld()
{
Debug.Log("Hello World!");
}
}
可以看到我们新建了一个C#类,但是并不继承自MonoBehaviour,而是直接是纯粹的C#类,写不写成static没关系,但是我们用来作为菜单的方法得是一个static方法,所以我们写了一个SayHelloWorld方法,执行后会输出一行日志到Console窗口中,为了让这个功能在菜单里面出现,我们加了一个属性MenuItem,这个属性来自UnityEditor模块,属性的内容就是我们菜单所在的位置,以/分割,第一部分就是直接显示在界面上的菜单名,后面每个/都是这个菜单内部的选项层级,我们看一下效果:
如果我们点击一下这个菜单,就会执行我们编写的那个static函数,输出一个Hello World!到我们的Console窗口中。
如果我们希望有更深层级的菜单,我们可以写成类似
[MenuItem("MenuTest/Say Hello World/Say1/Say2")]
那么我们就会看到这样的菜单:
OK,我们现在知道了菜单如何制作,这样我们就可以做一些我们想要的批量操作,比如说我们之前给游戏打包的时候,总是要一个个场景打开,然后添加到我们的Build Settings里面,很难受,那我们是不是可以直接通过一个菜单去做这个事情呢?当然可以!我们稍微修改一下我们的代码:
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public static class MenuTest
{
[MenuItem("MenuTest/Add All Scenes to Build Settings")]
public static void AddAllScenesToBuildSettings()
{
//获取所有场景
string[] scenes = AssetDatabase.FindAssets("t:Scene");
if (scenes == null || scenes.Length == 0)
{
Debug.Log("No scenes found.");
return;
}
List<EditorBuildSettingsScene> editorBuildSettingsScenes = new List<EditorBuildSettingsScene>();
//将所有场景添加到BuildSettings中
foreach (string sceneGuid in scenes)
{
string scenePath = AssetDatabase.GUIDToAssetPath(sceneGuid);
EditorBuildSettingsScene bu