unity编辑器功能虽然已经很强大了,但是每个人的需要不同,所以,往往我们需要自定义编辑器,使得我们需要频繁的操作能够使用快捷按钮直接执行,这样会方便很多。今天就为大家讲解下编辑器扩展的基本使用方法,大家学习后可能根据实际情况扩展编辑器。
1在工具栏中创建一个按钮
代码:
[MenuItem("Tools/Test",false,1)]
static void Test()
{
Debug.Log("test");
}
注意:
MenuItem中第一个参数:需要创建选项在工具栏中的路径,此路径的父目录可以是Unity中已存在的,也可以自己直接同子目录一起创建,例如创建“MyApp/FPS”路径。
MenuItem中第二个参数:用于菜单项是否启用,后面会详细介绍。
MenuItem中第三个参数:该选项的优先级,默认为1000,越小优先级越大,选项越靠前。若需分块显示选项,则相邻两块之间的优先级必须相差11.
2分别在Hierarchy,Project中创建一个选项
在Hierarchy面板创建选项的代码:
[MenuItem("GameObject/Test",false,1)]
static void Test1()
{
Debug.Log("test");
}
在Project面板创建选项的代码:
[MenuItem("Assets/Test")]
static void Test4()
{
Debug.Log("test4");
}
注意:红色标记的为固定的,不能修改
3在组件中右击创建一个选项,并通过该选项修改该组件下面的字段的值
在组件中右击创建一个选项代码:
[MenuItem("CONTEXT/PlayerHealth/InitHealth")]
static void Test5()
{
Debug.Log("init");
}
说明:
MenuItem中第二个参数:组件名
MenuItem中第三个参数:选项名
修改该组件下面的字段的值的代码:
[MenuItem("CONTEXT/Rigidbody/Clear")]
static void ClearMassAndGravity(MenuCommand cmd)
{
Rigidbody rgd = cmd.context as Rigidbody;
rgd.mass = 0;
rgd.useGravity = false;
}
上述代码的功能为:将Rigidbody组件下面的质量修改为0,不使用重力
4使用Selection获取选择的游戏物体
代码:
[MenuItem("Tools/GetChance", false, 1)]
static void GetChance()
{
if (Selection.gameObjects.Length > 0)
{
Debug.Log(Selection.activeGameObject.name);
Debug.Log(Selection.gameObjects.Length);
}
else
{
Debug.Log("请选择至少一个游戏物体");
}
}
说明:
Selection.gameObjects.Length:选中游戏对象的个数
Selection.activeGameObject.name:第一个选择的游戏对象的名字。
5删除游戏对象并具有撤回功能
代码:
[MenuItem("Tools/Delete",false,1)]
static void Delete()
{
GameObject[] go = Selection.gameObjects;
foreach (GameObject g in go)
{
//GameObject.DestroyImmediate(g);
Undo.DestroyObjectImmediate(g);
}
}
注意:
如果使用注释语句删除游戏对象,则不能撤回,不推荐使用。
Undo使得具有撤回功能,Ctrl+z(系统默认的撤回操作)
6给选项添加快捷键,控制菜单是否启用
代码:
[MenuItem("Tools/Delete ", true, 1)]
static bool DeleteVadidate()
{
if (Selection.gameObjects.Length > 0) return true;
else return false;
}
[MenuItem("Tools/Delete %d",false,1)]
static void Delete()
{
GameObject[] go = Selection.gameObjects;
foreach (GameObject g in go)
{
//GameObject.DestroyImmediate(g);
Undo.DestroyObjectImmediate(g);
}
}
注意:Tools/Delete与%d之间有一个空格。添加快捷键时:%代表Ctrl,#代表Shift,&代表Alt,_加符号则代表快捷键为该符号
上述添加的绿色代码实现了控制菜单项是否启用。
7创建对话框,检测按钮的点击,点击按钮后提示信息,保存设置的数据,显示点击按钮后的处理的进度条信息
代码:
using UnityEditor;
using UnityEngine;
public class ChangeValue : ScriptableWizard {
public int health = 10;
public int speed = 23;
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
ScriptableWizard.DisplayWizard<ChangeValue>("这是自己创建的标题", "按钮1的名字","按钮2的名字");
}
void OnWizardCreate()
{
ShowNotification(new GUIContent(Selection.gameObjects.Length + "多个游戏物体被改变"));//显示提示信息
GameObject[] gameObject = Selection.gameObjects;
EditorUtility.DisplayProgressBar("这是进度条的标题", "进度信息", 0);
int count = 0;
foreach (GameObject go in gameObject)
{
count++;
CompleteProject.PlayerHealth ph = go.GetComponent<CompleteProject.PlayerHealth>();
Undo.RecordObject(ph,"ph");//对点击事件的撤销功能
ph.startingHealth += health;
ph.flashSpeed += speed;
EditorUtility.DisplayProgressBar("这是进度条标题", "进度信息", count / Selection.gameObjects.Length);
}
EditorUtility.ClearProgressBar();
}
void OnWizardOtherButton()
{
OnWizardCreate();
}
const string healtKey = "health";
const string speedKey = "speed";
void OnEnable()
{
health = EditorPrefs.GetInt(healtKey, health);
speed = EditorPrefs.GetInt(speedKey, speed);
}
void OnWizardUpdate()
{
string helpString = null;
string errorString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "个游戏物体";
}
else
{
errorString = "请选择至少一个游戏物体";
}
EditorPrefs.SetInt(healtKey, health);
EditorPrefs.SetInt(speedKey, speed);
}
void OnSelectionChange()
{
OnWizardUpdate();
}
}
说明:
使用ScriptableWizard.DisplayWizard创建对话框<类名>(“对话框名标题”,“按钮1”,“按钮2”),当参数不设置按钮1是,则默认按钮名字为Create。按钮2根据实际情况决定是否需要。
使用Undo.RecordObject对点击事件的撤销功能,第一个参数为需要保存的值,第二为该值保存后的名字。
使用ShowNotification显示提示信息
使用EditorPrefs保存数据
使用EditorUtility.DisplayProgressBar显示进度条
8创建自定义窗口
代码:
using UnityEngine;
using UnityEditor;
public class MyWidow : EditorWindow
{
[MenuItem("Window/Show MyWindow")]
static void ShowMyWindow()
{
MyWidow myWindow = EditorWindow.GetWindow<MyWidow>();//创建自定义窗口
myWindow.Show();//显示创建的自定义窗口
}
private string name = "";
void OnGUI()
{
GUILayout.Label("这是我的自定义窗口");
name = GUILayout.TextField(name);
if (GUILayout.Button("创建"))
{
GameObject go = new GameObject(name);
Undo.RegisterCreatedObjectUndo(go, "create gameObject");//允许撤回
}
}
}