01:添加自己的工具

以Editor命名的文件夹允许其中的脚本访问Unity Editor的API。如果脚本中使用了在UnityEditor命名空间中的类或方法,它必须被放在名为Editor的文件夹中。Editor文件夹中的脚本不会在build时被包含。
在项目中可以有多个Editor文件夹。
注意:如果在普通的文件夹下,Editor文件夹可以处于目录的任何层级。如果在特殊文件夹下,那Editor文件夹必须是特殊文件夹的直接子目录。
1.必须是放在 Assets / Editor 文件夹下的类,且使用了 using UnityEditor
2.调用的函数必须是静态函数(static)

MenuItem菜单项
MenuItem属性允许你添加菜单项到主菜单和检视面板上下文菜单。
(该属性把任意静态函数变为一个菜单命令。仅静态函数能使用这个MenuItem属性。)
MenuItem是编辑器类,所以技能导入 using UnityEditor; 命名空间
且一般我们的类也不是集成自MonoBehaviour的,而是集成ScriptableObject

using UnityEngine;
using UnityEditor; //

public class Tools {

[MenuItem("Tools/Test")]
public static void Test()
{
Debug.Log("233");
}

}

unity编辑器扩展_静态函数


02:MenuItem菜单的先后排序

MenuItem(string itemName, bool isValidateFunction, int priority) 
itemName:菜单名称路径
isValidateFunction:不写为false,true则点击菜单前就会调用
priority:菜单项显示排序
第一个参数为菜单路径名称,可添加菜单快捷键:(空格后加如下符号设置)
第三个参数为优先级,表示上下排列的顺序,小的在上,不写则默认为1000。
[MenuItem("Tools/Test1", false,1)]
public static void Test1()
{
Debug.Log("Test1");
}

[MenuItem("Tools/Test2", false, 2)]
public static void Test2()
{
Debug.Log("Test2");
}

[MenuItem("Tools/Test3", false, 15)]
public static void Test3()
{
Debug.Log("Test3");
}

03:给组件的右键菜单栏添加按钮

//CONTEXT  加组件名  按钮名
[MenuItem("CONTEXT/PlayerHealth/ChangePlayeVelue")]
public static void ChangePlayeVelue(MenuCommand cmd)
{
//上下文是一个菜单命令的目标对象。
CompleteProject.PlayerHealth playerHealth =cmd.context as CompleteProject.PlayerHealth;

playerHealth.currentHealth = 100;
playerHealth.startingHealth = 1000;

}

unity编辑器扩展_右键_02


04:学习使用Selection获取选择的游戏物体

[MenuItem("GameObject/Delete",false,10)]
public static void Delete()
{
Object[] objects=Selection.gameObjects;
foreach (var item in objects)
{
GameObject.DestroyImmediate(item);
}
}

05:编写可以撤销的删除操作

[MenuItem("GameObject/Delete",false,10)]
public static void Delete()
{
Object[] objects=Selection.gameObjects;
foreach (var item in objects)
{
//利用undo可以撤销
Undo.DestroyObjectImmediate(item);
}
}

06:给菜单项添加快捷键

//% =ctrl #=shif &= alt
[MenuItem("GameObject/Delete _s",false,10)]
public static void Delete()
{
Object[] objects=Selection.gameObjects;
foreach (var item in objects)
{
//利用undo可以撤销
Undo.DestroyObjectImmediate(item);
}
}

07:给组件添加右键菜单的方法ContextMenu和ContextMenuItem

//给字段设置右键添加功能
[ContextMenuItem("SetBool","ChangeValue")]
public bool isNeedPlay;

public void ChangeValue()
{
isNeedPlay = !isNeedPlay;
}
public int hp = 100;
//给方法设置
[ContextMenu("SetHpBtn")]
public void SetHp()
{
hp += 100;
}

unity编辑器扩展_右键_03


08:创建对话框

//继承ScriptableWizard 
public class ChangeValue : ScriptableWizard
{
[MenuItem("Tools/ChangeValue")]
public static void ChangeValues()
{
ScriptableWizard.DisplayWizard<ChangeValue>("改变字段的值");
}


public string name=null;
public int hp;
public float speed;
}

unity编辑器扩展_静态函数_04


09:兼容按钮点击统一修改字段

public class ValueChange : ScriptableWizard
{

public int addHp = 10;
public float addSpeed=20;

[MenuItem("Tools/Change")]
public static void ChangeValue(MenuCommand cmd)
{
ScriptableWizard.DisplayWizard<ValueChange>("改变hp 和speed的值");
}


//按钮点击
public void OnWizardCreate()
{
GameObject[] items = Selection.gameObjects;
foreach (var item in items)
{
Value value = item.GetComponent<Value>();
Undo.RecordObject(value,"2"); //撤销操作
value.hp += this.addHp;
value.speed += this.addSpeed;

}
}
}

10:显示提示框的帮助信息和错误信息

//更新
public void OnWizardUpdate()
{
helpString = null;
errorString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "当前选择了:"+ Selection.gameObjects.Length+"个物体";
}
else
{
errorString = "没有选择物体";
}

}
public void OnSelectionChange()
{
Debug.Log("选择的物体改变了");
}

unity编辑器扩展_右键_05


11:使用ShowNotification显示提示信息 继承: EditorWindow

ShowNotification(new GUIContent("值被改变了"));

unity编辑器扩展_菜单项_06


12:使用EditorPrefs保存数据

EditorPrefs.SetInt("addHp",addHp);
EditorPrefs.SetFloat("addSpeed",addSpeed);
void OnEnable()
{
addHp=EditorPrefs.GetInt("addHp");
addSpeed = EditorPrefs.GetFloat("addSpeed");
}

13:显示进度条

public void OnWizardCreate()
{
GameObject[] items = Selection.gameObjects;
EditorUtility.DisplayCancelableProgressBar("进度", "Shows a progress bar"+items.Length,0);
int count = 0;
foreach (var item in items)
{
Value value = item.GetComponent<Value>();
Undo.RecordObject(value, "2"); //撤销操作
value.hp += this.addHp;
value.speed += this.addSpeed;
count++;
EditorUtility.DisplayCancelableProgressBar("进度", "Shows a progress bar" + items.Length, (float)count/items.Length);

}
EditorUtility.ClearProgressBar();
}

14:创建自定义窗口

/// <summary>
/// 创建自己的窗口
/// </summary>
public class MyWindow : EditorWindow {

[MenuItem("Window/ShowWindow")]
public static void ShowWindow()
{
MyWindow myWindow=EditorWindow.GetWindow<MyWindow>(); //获得窗口
myWindow.Show(); //显示窗口

}

private string name=null;
void OnGUI()
{
GUILayout.Label("我的窗口");
name = GUILayout.TextField(name);
if (GUILayout.Button("创建物体"))
{
GameObject go=new GameObject(name);
Undo.RegisterCreatedObjectUndo(go,"go"); //注册
}
}
}

unity编辑器扩展_菜单项_07