基础篇
using UnityEditor;
using UnityEngine;
public class Tools
{
//菜单栏编辑,这个标签显示菜单栏上按钮的名字,点击则调用这个标签下的方法
//注意标签名字和方法名不能有两个一样的
[MenuItem("Tools/Test1")]
//必须是静态方法才能在菜单栏上显示
static void Test1()
{
Debug.Log("你大爷");
}
/*
* MenuItem(string itemName, bool isValidateFunction, int priority);
* 第一个参数:菜单栏显示的名字
* 第二个参数:
* 第三个参数:菜单栏名字显示的优先级,每一个菜单栏默认优先级为1000
* 如果手动设置,数值越小,优先级别越高,显示越靠前
* 其中每级相差数值>11时,分为一个类别,即显示的时候中间会用一条横线隔开
*/
[MenuItem("Tools/Test2")]
static void Test2()
{
Debug.Log("你2大爷");
}
[MenuItem("Tools/Test3")]
static void Test3()
{
Debug.Log("你3大爷");
}
/*================================================控制脚本代码==================================================================*/
/// <summary>
/// CONTEXT:代表这是一个要控制组件的标签方法
/// CubeMove:组件名字即脚本名字
/// DoSomething:显示的按钮名
/// MenuCommand cmd:通过这个cmd.context来获取GameObject的脚本进行修改
/// </summary>
[MenuItem("CONTEXT/CubeMove/DoSomething")]
static void DoSome(MenuCommand cmd)
{
CubeMove cubeMove = (CubeMove)cmd.context;
cubeMove.speed = 0.1f;
Debug.Log("Big妈妈");
}
/*================================================删除功能======================================================================*/
/// <summary>
/// Selection:函数,是指所有选中的物体,对其进行操作
/// </summary>
[MenuItem("Tools/MyDelete")]
static void MyDelete()
{
foreach (var o in Selection.objects)
{//这样操作删除物体之后不能撤销
//需要把删除操作注册到操作记录才能撤销
GameObject.DestroyImmediate(o);
//用Undo下的方法所做的操作都是可以撤销的
//Undo.DestroyObjectImmediate(o);
}
}
/*================================================添加快捷键功能======================================================================*/
/// <summary>
/// 按单个按键的情况:按p键直接输出,注意前面有空格和下划线,如果有冲突会提示冲突
/// </summary>
[MenuItem("Tools/Shortcutkeys _b")]
static void ShortCutKeys()
{
Debug.Log("按p键直接输出");
}
/// <summary>
/// %:代表Ctrl
/// #:代码表shift
/// &:代表Alt
/// </summary>
[MenuItem("Tools/SCK &y")]
static void SCK()
{
Debug.Log("%#&");
}
/*================================================添加验证功能是否可用===================================================*/
/// <summary>
/// 同一个名字的标签函数,验证函数,如果选中物体这个hehe按钮就显示否则变灰
/// 这个是menuitem标签第二个参数的功能,验证函数设置为true的时候不会在编辑器上显示
/// 验证函数可以不必添加快捷键功能,只需要保持按钮名字相同
/// 个人感觉这个功能实际用处不大,反正在方法中写好选中的物体做相应的功能就行了,不选中的也不会执行这个操作
/// </summary>
/// <returns></returns>
[MenuItem("GameObject/hehe", true, 10)]
static bool HEHE()
{
//如果选中物体
if (Selection.objects.Length > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 获取选中的物体添加脚本,如果本来有的就不添加,本来没有该脚本的就添加
/// 这里使用大写的L则 添加脚本的快捷键就是Alt+shift+L键
/// </summary>
[MenuItem("GameObject/hehe &L", false, 10)]
static void AddCubeMove()
{
if (Selection.objects.Length > 0)
{
foreach (var item in Selection.transforms)
{
if (item.gameObject.GetComponent<CubeMove>())
{
break;
}
else
{
item.gameObject.AddComponent<CubeMove>();
}
}
}
}
/*================================================================================================*/
//给属性添加特性:[ContextMenuItem("按钮名","方法名")]
//给函数添加特性:[ContextMenu("方法名")]
//这两个标签直接写在脚本当中不用继承UnityEditor
//到时候直接右键点击该脚本所在的组件就会出来
}
自定义对话框
/*=====================================自定义对话框======继承自ScriptableWizard=====================================================*/
/// <summary>
/// 需要继承自ScriptableWizard
/// </summary>
public class DialogBox : ScriptableWizard
{
/// <summary>
/// 创建对话框
/// </summary>
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
ScriptableWizard.DisplayWizard<DialogBox>("统一修改DialogBox类中的参数", "确定并关闭", "其他按钮");
}
public int heheda = 0;
public string hhh = "hello world";
const string hehedaKey = "hehedaKey";
const string hhhKey = "hhhKey";
/// <summary>
/// 每次进入对话框,先把字段赋值为上一次设置的值
/// </summary>
void OnEnable()
{
heheda = EditorPrefs.GetInt(hehedaKey, heheda);
hhh = EditorPrefs.GetString(hhhKey, hhh);
}
/// <summary>
/// 方法名是unity内置的固定函数,和Start(),Update()一样不能是其他方法名
/// 诺没有该方法 按“确定并关闭”按钮会报错,提示找不到对应方法
/// </summary>
void OnWizardCreate()
{
GameObject[] obj = Selection.gameObjects;
if (obj.Length <= 0)
{
Debug.LogError("没选中GameObject");
return;
}
foreach (var item in obj)
{
CubeMove cubeMove = item.GetComponent<CubeMove>();
//记录cubemove数据被更改前的样子,按Ctrl+z可以撤销,否则没有撤销功能
Undo.RecordObject(cubeMove, "record changes");
if (cubeMove == null)
{
Debug.LogError(string.Format("{0}:没有cubemove脚本", item.name));
continue;
}
cubeMove.speed += 9;
}
ShowNotification(new GUIContent("修改成功"));
Debug.Log("点击确定并关闭");
}
/// <summary>
/// 对应“其他按钮”的方法
/// 也是内置函数
/// </summary>
void OnWizardOtherButton()
{
OnWizardCreate();
Debug.Log("我是其他按钮啊");
}
/// <summary>
/// 方法名是unity内置的固定函数,和Start(),Update()一样不能是其他方法名,否则按“确定”按钮会报错
/// 当有数值变化的时候才会调用检测这个函数,并不会你选中多少个GameObject,就立马提示你选中多少个
/// </summary>
void OnWizardUpdate()
{
errorString = helpString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择的GameObject的数量:" + Selection.gameObjects.Length;
}
else
{
errorString = "请至少选择一个GameObject";
}
//每次字段数值改变就储存字段
EditorPrefs.SetInt(hehedaKey, heheda);
EditorPrefs.SetString(hhhKey, hhh);
}
/// <summary>
/// 该方法会随着你鼠标实时监测,点一下,提示一次
/// </summary>
void OnSelectionChange()
{
OnWizardUpdate();
}
}
测试脚本
using UnityEngine;
public class CubeMove : MonoBehaviour
{
public float speed = 0;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Translate(speed, 0, 0);
}
}