一、在菜单栏添加按钮、在project和Herarity里点击鼠标右键出现按钮 MenuItem
using UnityEditor;
using UnityEngine;
//Editor下文件不会被打包,只能在编辑器下起作用
public class Tools {
//第一种 菜单栏添加按钮
//第三个参数为显示的优先级,优先级越小越在上,每一个菜单栏的priority的优先级默认为1000,如果相邻的优先级大于11,就相当于分类
[MenuItem("Tools/Test1",false,4)]
static void Test1()
{
Debug.Log("添加成功!");
}
//在GameObject菜单栏和Hierarchy视图里点击鼠标右键显示
[MenuItem("GameObject/my tool",false,10)]
static void Test2()
{
Debug.Log("添加成功!");
}
//在菜单栏和project里点击鼠标右键显示AssetButton
[MenuItem("Assets/assetButton")]
static void Test3()
{
Debug.Log("添加成功!");
}
//资源商店下载的存放位置 C:\Users\huang\AppData\Roaming\Unity\Asset Store-5.x\Unity Technologies
}
二、鼠标在组件上点击右键添加按钮 MenuCommand
using UnityEngine;
using UnityEditor;
public class PlayEditor {
//鼠标右键点击组件出现,并进行操作
[MenuItem("CONTEXT/PlayerHealth/InitHeathAndSpeed")] //CONTEXT(大写) 组件名 按钮名
static void InitHeathAndSpeed(MenuCommand cmd) //MenuCommand是当前正在操作的组件
{
Debug.Log(cmd.context.GetType().FullName);
CompleteProject.PlayerHealth health = cmd.context as CompleteProject.PlayerHealth; //强制转换成PlayerHealth类型
health.startingHealth = 200;
health.flashSpeed = 10;
Debug.Log(cmd.context.name); //输出组件所在游戏物体的名字
Debug.Log("Init");
}
}
三,选中Selection和可以撤回的删除以及给按钮添加快捷键
[MenuItem("Tools/show info",false,4)]
static void showinfo()
{
//Debug.Log(Selection.activeGameObject.name); //选中多个,只显示第一个对象的名字
Debug.Log(Selection.objects.Length); //选中的数量
}
//启用按钮 不启用时按钮为灰色 写在按钮的前面,名字必须一样
[MenuItem("GameObject/my delete",true,10)]
static bool MyDeleteValidate()
{
if (Selection.objects.Length > 0)
return true;
else
return false;
}
// 制作自己的删除功能按钮
[MenuItem("GameObject/my delete",false,10)]
static void MyDelete()
{
//无法撤回的删除功能
//foreach(Object o in Selection.objects)
//{
// GameObject.DestroyImmediate(o);
//}
//要想撤回删除,需要把删除操作记录到操作记录里
foreach (Object o in Selection.objects)
{
Undo.DestroyObjectImmediate(o);
}
}
//给按钮添加快捷键 %=ctrl #=shift &=alt 直接使用字母前加_
[MenuItem("Assets/assetButton _t",false,10)]
static void Test3()
{
Debug.Log("添加成功!");
}
四、在脚本里使用编辑器,改变字段值(ContextMenu,ContextMenuItem)
//在脚本内部修改属性 不需要引用
[ContextMenu("set color")]
void SetColor()
{
flashColour = Color.green;
}
//右键字段显示按钮,第一个为按钮名,第二个为方法名 这句必须写在字段前面
[ContextMenuItem("Add Hp", "AddHp")]
public int startingHealth = 100;
void AddHp()
{
startingHealth += 20;
}
五、按钮打开对话框
using UnityEngine;
using UnityEditor;
public class EnemyChange : ScriptableWizard {
//创建对话框
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
//第一个参数是对话框名称,第二个参数是Create按钮的名字,第三个参数是第二个按钮,点击不会关闭窗口
ScriptableWizard.DisplayWizard("统一修改敌人对话框","Change Value","Other Button");
}
public int changeHealthValue = 10;
public int changeSinkSpeed = 1;
//当窗口被创建出来的时候,取值
private void OnEnable()
{
//赋值
changeHealthValue = EditorPrefs.GetInt("changeHealthValue");
}
//Create按钮点击事件
private void OnWizardCreate()
{
GameObject[] enemyPrefabs=Selection.gameObjects;
//显示进度条
EditorUtility.DisplayCancelableProgressBar("进度条", "0/" + Selection.gameObjects.Length + "完成修改值", 0);
int count = 0;
foreach(GameObject go in enemyPrefabs)
{
//因为案例有两个相同的,默认操作的是继承自moonbehavior的,本处用的是继承CompleteProject的那个
CompleteProject.EnemyHealth hp = go.GetComponent();
//对hp进行记录,使其具有撤回的功能,这句话必须写在hp操作的前面
Undo.RecordObject(hp, "change health and speed");
hp.startingHealth += changeHealthValue;
hp.sinkSpeed += changeSinkSpeed;
count++;
EditorUtility.DisplayCancelableProgressBar("进度条", count+"/"+Selection.gameObjects.Length + "完成修改值", (float)count/Selection.gameObjects.Length);
}
EditorUtility.ClearProgressBar();
//窗口下方的提示信息
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个敌人的信息被修改了"));
}
private void OnWizardOtherButton()
{
//调用一下显示效果,并无什么意义
OnWizardCreate();
}
//对话框里字段被修改就会调用
private void OnWizardUpdate()
{
helpString = null;
errorString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "您选择了" + Selection.gameObjects.Length + "个敌人";
}
else
{
errorString = "请至少选择一个敌人";
}
//记录保存改变的数值
EditorPrefs.SetInt("changeHealthValue", changeHealthValue);
}
//选则改变更换提示显示
private void OnSelectionChange()
{
OnWizardUpdate();
}
}
六、自定义窗口
using UnityEngine;
using UnityEditor;
public class MyWindow :EditorWindow {
//自定义视图窗口
[MenuItem("Window/Show MyWindow")]
static void ShowMyWindow()
{
MyWindow myWindow = EditorWindow.GetWindow();
myWindow.Show();
}
private string name = "";
private void OnGUI()
{
GUILayout.Label("这是我的窗口");
name=GUILayout.TextField(name);
if (GUILayout.Button("创建"))
{
GameObject go = new GameObject(name);
//把创建物体注册到unity里 方便撤回
Undo.RegisterCreatedObjectUndo(go, "Create GameObject");
}
}
}