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");
}
}
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;
}
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;
}
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;
}
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("选择的物体改变了");
}
11:使用ShowNotification显示提示信息 继承: EditorWindow
ShowNotification(new GUIContent("值被改变了"));
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"); //注册
}
}
}