1、编辑器相关文件夹介绍
1.1Editor
该文件夹可以放在项目的任何文件夹下,可以有多个"Editor"文件夹。
编辑器扩展相关的脚本都要放在该文件夹内,该文件夹中的脚本只会对Unity编辑器起作用。
项目打包的时候,不会被打包到项目中。如果编辑器相关脚本不放在该文件夹中,打包项目可能会出错。
如果非要有些编辑器相关脚本不放在该文件夹中,需要在该类的前后加上UNITY_EDITOR的宏定义
1.2Editor Default Resources
该文件夹需要放在Assets根目录下,用来存储编辑器所需要的图片等资源,书写的时候需要注意中间有空格隔开。此文件夹也不会被打包,访问方法为:EditorGUIUtility.Load()
当然,也可以在Editor文件夹内创建一个Resources文件夹,将相关资源放在该文件夹内,通过Resources.Load()获取资源,也是可以的
1.3Gizmos
该文件夹也需要放在Assets根目录下,可以用来存放Gizmos.DrawIcon()的图片资源
1.4编辑器扩展的命名空间:
Using UnityEditor
2、添加菜单栏
2.1添加顶部菜单栏按钮
1)、[MenuItem(“MyTools / test1”, false, priority)]
- 第一个参数用来表示菜单的路径;
- 第二个参数用来判断是否是有效函数,是否需要显示;
- 第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。
- 注意需要是静态方法
例如:[MenuItem(“MyTools/test1”)]
也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window/test2”)],添加到Assets下,[MenuItem(“Assets/Project中的按钮”)]
代码
[MenuItem("MyTools/MenuItemTest", false, 100)]
public static void MenuItemTest()
{
Debug.Log("MenuItemTest");
}
效果展示
2)、添加快捷键
代码
[MenuItem("MyTools/Test2 &_d", false, 101)]
public static void Test2()
{
Debug.Log("Test2");
}
效果展示
快捷键对应符号
符号 | 字符 |
% | Ctr/Command |
# | Shift |
& | Alt |
LEFT/Right/UP/DOWN | 方向键 |
F1-F2 | F功能键 |
_g | 字母g |
3)、CONTEXT 给某组件添加右键菜单选项
代码
[MenuItem("CONTEXT/Transform/Test3")]
public static void Test3()
{
Debug.Log("Test3");
}
效果展示
4)、MenuCommand用于获取当前操作的组件
代码
[MenuItem("CONTEXT/Transform/Test4")]
public static void Test4(MenuCommand target)
{
Transform tran = target.context as Transform;
Debug.Log("Test4");
Debug.Log(tran.name);
}
效果展示
2.2组件右键添加按钮 [ContextMenu("Test5", false, 10)]
代码
[ContextMenu("Test5", false, 10)]
public void Test5()
{
Debug.Log("Test5");
}
效果展示
2.3ContextMenuItem给某属性添加右键菜单选项
同一个成员变量可以添加多个ContextMenuItem
代码
[ContextMenuItem("Test6", "Test6")]
[ContextMenuItem("Test7", "Test7")]
public string strName = "ZTTT";
public void Test6()
{
Debug.Log(strName);
Debug.Log("Test6");
}
public void Test7()
{
Debug.Log(strName);
Debug.Log("Test7");
}
效果展示
PS. 这两个特性是在UnityEngine命名空间下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。
3、Selection
用于获取选择的游戏物体
- Selection.activeGameObject 返回第一个选择的场景中的对象
- Selection.gameObjects 返回场景中选择的多个对象,包含预制体等
- Selection.objects 返回选择的多个对象
//遍历选择的对象,并立刻销毁
foreach(object obj in Selection.objects)
{
DestroyImmediate(obj);
}
PS. Destroy方法会将删除的对象放在缓存中,缓存满了,才完全删除,而在编辑器未运行的时候,是没有这片缓存的,所以需要用DestroyImmediate(),立刻销毁。当然,可以直接使用Undo.DestroyObjectImmediate()来销毁对象并记录销毁操作
测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class Test01_CaiDan : MonoBehaviour
{
//[MenuItem]
//添加菜单栏按钮
//[MenuItem(“MyTools / test1”, false, priority)]
//第一个参数用来表示菜单的路径;
//第二个参数用来判断是否是有效函数,是否需要显示;
//第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。
//注意需要是静态方法
//例如:[MenuItem(“MyTools / test1”)]
//也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window / test2”)],添加到Assets下,[MenuItem(“Assets / Project中的按钮”)]
[MenuItem("MyTools/MenuItemTest", false, 100)]
public static void MenuItemTest()
{
Debug.Log("MenuItemTest");
}
[MenuItem("MyTools/Test2 &_d", false, 101)]
public static void Test2()
{
Debug.Log("Test2");
}
[MenuItem("CONTEXT/Transform/Test3")]
public static void Test3()
{
Debug.Log("Test3");
}
[MenuItem("CONTEXT/Transform/Test4")]
public static void Test4(MenuCommand target)
{
Transform tran = target.context as Transform;
Debug.Log("Test4");
Debug.Log(tran.name);
}
//ContextMenu、ContextMenuItem
//给某组件添加右边小齿轮菜单选项
[ContextMenu("Test5", false, 10)]
public void Test5()
{
Debug.Log("Test5");
}
[ContextMenuItem("Test6", "Test6")]
[ContextMenuItem("Test7", "Test7")]
public string strName = "ZTTT";
public void Test6()
{
Debug.Log(strName);
Debug.Log("Test6");
}
public void Test7()
{
Debug.Log(strName);
Debug.Log("Test7");
}
}