Unity3D编辑器扩展
一、使用MeunItem添加菜单栏按钮
1、新建文件件Editor
2、引入命名空间
using UnityEditor;
3、使用特性
[MenuItem("Tools/Test")]
static void Test(){
Debug.Log("Test");
}
注意方法前加static
编辑器类不需要集成MonoBehaviour
二、MenuItem设置按钮显示的先后顺序
[MenuItem("Tools/Test1",flase,0)];
MenuItem的第三个参数为Priority优先级,Priority的值越小优先级越高,当两个MenuItem的Priority相差11就会分栏。如图
Priority默认等于1000
三、给组件的右键菜单栏添加按钮
[MenuItem("CONTEXT/PalyerHealth/Init")]
static void Init(){
Debug.Log("text");
}
格式[MenuItem("CONTEXT/组件名/脚本名")]
四、关于MenuCommand的使用
[MenuItem("CONTEXT/PalyerHealth/Init")]
static void Init(MenuCommand cmd){
PlayerHealth health=cmd.context;
health.health=0;
health.speed=0;
}
MenuCommand是当前正在操作的组件
使用Selection获取选择的游戏物体
Seletion.Objects
[MenuItem("GameObject/My Delete",false,13)]
static void MYDelete()
{
//Object[] objs=Selection.objects ;
foreach (var obj in Selection.objects)
{
Object.DestroyImmediate(obj);
}
}
https://docs.unity3d.com/ScriptReference/Selection.html
这里必须使用DestoryImmediate();
编写可以撤销的删除操作
[MenuItem("GameObject/My Delete",false,13)]
static void MYDelete()
{
//Object[] objs=Selection.objects ;
foreach (var obj in Selection.objects)
{
//Object.DestroyImmediate(obj);
Undo.DestroyObjectImmediate(obj);
}
}
关于Undo这个类后期我会专门开一片文章介绍。
给菜单栏项添加快捷键
//%=ctrl #=shift &=alt
[MenuItem("Tools/Test2 _%t",false,1)]
static void Test2()
{
Debug.Log("Test");
}
[MenuItem("Tools/Test3 _T",false,12)]
static void Test3()
{
Debug.Log("Test");
}
路径后面跟一个空格写快捷键,不区分大小写。
控制菜单项是否启用的功能
[MenuItem("GameObject/My Delete", true, 13)]
static bool MYDeleteValidate()
{
if (Selection.objects.Length > 0)
return true;
else return false;
}
[MenuItem("GameObject/My Delete",false,13)]
static void MYDelete()
{
//Object[] objs=Selection.objects ;
foreach (var obj in Selection.objects)
{
//Object.DestroyImmediate(obj);
Undo.DestroyObjectImmediate(obj);
}
}
1、路径名与需要验证的方法保持一致
2、MenuItem的第二参数isValidate改为 true
ContextMenuItem和ContextMenu
ContextMenuItem和ContextMenu虽然是编辑器扩展,但是属于 using UnityEngine;
所以不需要using UnityEditor;
ContextMenuItem给属性添加右键扩展
[ContextMenuItem("AddHp","ADDHP")]
public int startingHealth = 100; // The amount of health the player starts the game with.
void ADDHP()
{
startingHealth += 20;
}
ContextMenu给组件添加右键方法扩展
[ContextMenu("SetColor")]
void SetColor()
{
flashColour = Color.yellow;
}
显示一个弹出对话框
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
[MenuItem("Tools/DisPlay")]
static void Dispalywizard()
{
ScriptableWizard.DisplayWizard<EnemyChange>("统一修改敌人");
}
public int EnemyHealth = 10;
}
image.png
它会自动添加一个按钮,我们可以修改这个按钮的名称
ScriptableWizard.DisplayWizard<EnemyChange>("统一修改敌人","想要修改的名称");
检测这个按钮的点击
//默认方法名
void OnWizardCreate(){
}
当我们点击这个按钮,它会自动关闭,关闭之前他会执行我们在里写的代码
如何记录操作并撤销操作
void OnWizardCreate()
{
foreach (var item in Selection.gameObjects)
{
EnemyHealth hp = item.GetComponent<EnemyHealth>();
Undo.RecordObject(hp, "change hp");
hp.startingHealth+= EnemyHealth;
}
}
Undo.RecordObject()写在要记录的操作之前。
例子:
void OnWizardUpdate()
{
helpString = null;
errorString = null;
if (Selection.gameObjects.Length>0)
{
helpString = "你选择了"+Selection.gameObjects.Length+"个敌人";
}
else
{
errorString = "请至少选择一个敌人";
}
}
void OnSelectionChange()
{
OnWizardUpdate();
}
OnWizardUpdate()当弹出对话框的时候调用一次,数据发生变化时调用一次。
创建otherButton,并且监听它的点击
public static T DisplayWizard(string title, string createButtonName, string otherButtonName);
对话框最多有两个按钮,Other button 在前可以多次点击,change enemy在后点击执行并关闭。
https://docs.unity3d.com/ScriptReference/ScriptableWizard.html
使用Notification显示提示信息
Notification(new GUIContent("字符串"));
显示进度条
https://docs.unity3d.com/ScriptReference/EditorUtility.DisplayProgressBar.html
创建自定义窗口
using UnityEditor;
public class MyWindow : EditorWindow {
[MenuItem("Window/CreateMyWindow")]
static void CreateMyWindow()
{
MyWindow window= EditorWindow.GetWindow<MyWindow>();
window.Show();
}
private string name = "";
void OnGUI()
{
GUILayout.Label("My Window");
name = GUILayout.TextField(name);
if (GUILayout.Button("创建"))
{
GameObject go = new GameObject(name);
Undo.RegisterCreatedObjectUndo(go, "RegisterCreatedObjectUndo");
}
}
}