(我们自己写的脚本放在 Editor文件里(Editor 自己创建 跟创建Scenes文件一样))
1 增加简单菜单栏(第一排菜单栏)
(我们使用静态方法便于调用 不用静态方法 我们Unity不能显示出来)
public Class Tools {
[MenuItem("Tools/Test1",false,1)]
(MenuItem)这个上面添加菜单
(Test1 是名称)
static void Test1() //调试信息 点击Test1 控制台输出“ 加油”
{
Debug.Log("加油");
}
[MenuItem("Tools/Test2",false,12)]//在菜单栏上添加自己的方法 菜单栏中横线 分类 相邻的两个菜单要想用横线划分 priority必须相差11
static void Test2()
{
Debug.Log("加油");
}
[MenuItem("Tools/Test3",false,0)]//在菜单栏上添加自己的方法
static void Test3()
{
Debug.Log("加油");
}
[MenuItem("Tools/Test3",false,0)] 参数 第一个是名称 和路径 第二个默认为false 第三个(priority 优先级)作用有两个 a:排序 数字越小越排在前面 列如 Test3 第三个参数为0 所以排在前 b:分界线 相邻的两个菜单如果第三个参数相差11就会有分界线 列如Test1 和Test2
[MenuItem("GameObject/myTool", false, 10)]//在已有的菜单栏上添加自己的方法
10表示 放在很前面 第一级
Hierarchy面板中也可以使用了
{
Debug.Log("加油德玛西亚");
}
}
2 给我们自己写的菜单栏添加快捷键
- %-CTRL 在Windows / CMD在OSX
- # -Shift
- & -Alt
- LEFT/RIGHT/UP/DOWN-光标键
- F1…F12
- HOME,END,PGUP,PDDN
字母键不是key-sequence的一部分,要让字母键被添加到key-sequence中必须在前面加上下划线(例如:_g对应于快捷键”G”)
快捷键的组合被添加在菜单项的路径后面,并以一个空格分隔例子 上面的Test3
[MenuItem("Tools/Test3 %a",false,0)]//在菜单栏上添加自己的方法
static void Test3()
{
Debug.Log("加油");
}
%a 代表快捷键 ctrl+A
[MenuItem("Tools/Test3 _g",false,0)]//在菜单栏上添加自己的方法
static void Test3()
{
Debug.Log("加油");
}
_g 代表快捷键 G
3.给组件的右键菜单栏添加按钮
举例 Camera 的Camera组件
public Class CameraEditor{
//CONTEXT 组件 Camera 组件名 (脚本名) InitHealthAndSpeed 按钮名
[MenuItem("CONTEXT/Camera/changeView")]
// MenuCommand 表示该组件(Camera) cmd.context 表示该Camera 组件的内容
static void ChangeViem(MenuCommand cmd)
{
//强制转换为Camera
Camera ca=cmd.context as Camera;
Debug.Log("加油");}
}
如上图 我们右击Camera 时 显示出我们写的按钮 changeView 点击 输出 “加油”
4.使用Selection获取选择的游戏物体
[MenuItem("Tools/showInfo", false, 1)]static void Test1()
{
Debug.Log(Selection.activeGameObject.name);// 显示我们第一个选择的游戏物体
Debug.Log(Selection.objects.Length);// 获取我们选择游戏物体的个数(Preject 和Hierarchy都可以)
Debug.Log(Selection.transforms.Length);// 只能获取在Hierarchy面板上选择物体的个数
}
选择游戏物体 点击我们写的按钮 输出的是 我们选择游戏物体的名字
/// <summary>
/// 删除选择的物体
/// </summary>
[MenuItem("GameObject/my delete", false, 11)]
static void mydelete()
{
foreach (var o in Selection.objects)
{
GameObject.DestroyImmediate(o);//使用这个方法写的 删除掉的物体我们不能进行撤销
Undo.DestroyObjectImmediate(o); //使用这个方法写的 删除掉的物体我们可以进行撤销
//需要把删除操作注册到操作记录里面
}
选择游戏物体 点击 我们写的按钮 可以删除
(我自己试过 选择两个删除没问题 选择三个以上删除Unity会关闭)
[MenuItem("GameObject/myTool", false, 10)]//在菜单栏上添加自己的方法static void myTool()
{
Debug.Log("加油德玛西亚");
}
[MenuItem("GameObject/my delete", true, 11)]//在菜单栏上添加自己的方法
static bool MyDeleteValidate()
{
if (Selection.objects.Length>0)
{
return true;
}
return false;
}
5.控制菜单项是否启用的功能
[MenuItem("GameObject/my delete", true, 11)]//在菜单栏上添加自己的方法
(在执行下面那个方法前 先进行这个方法的验证)
(第二个参数为true 表示验证该方法是否可行)
static bool MyDeleteValidate(){
if (Selection.objects.Length>0)
{
return true;
}
return false;
}
[MenuItem("GameObject/my delete", false, 11)]//在菜单栏上添加自己的方法
static void mydelete()
{
foreach (var o in Selection.objects)
{
//GameObject.DestroyImmediate(o);
Undo.DestroyObjectImmediate(o); //使用这个方法写的 删除掉的物体我们可以进行撤销
}
//需要把删除操作注册到操作记录里面
}
没有选择物体的时候 我们写的按钮 为灰色 表示不可用
选择游戏物体的时候 我们写的按钮 表示可用
6. 给自己写的脚本里添加按钮(系统自带的组件不能使用该方法)
例子 : 我们写了一个Cube脚本 挂载到我们创建的Cube物体上
我们在Cube脚本中 写下如下 语句(给Cube添加了SetScale脚本)
[ContextMenu("SetScale")]
void SetScale()
{
pox = 100;
}
给我们脚本的属性添加按钮
例子:
[ContextMenuItem("Test","Test1")]
第一个参数表示我们按钮的名称 第二个参数 是我们点击按钮执行 的方法
public float pox=10; void Test1()
{
Debug.Log("加油");
}
当我们右击Pox属性的时候 显示出我们的按钮Test 点击它执行方法 输出“加油”
7 如何创建对话框 (用于统一修改数据)
public class EnemyChange :ScriptableWizard //(ScriptableWizard 继承这个对话框的类)
{
[MenuItem("Tools/CreateWizard")] //创建按钮
static void CreateWizard()
{
// 下面这个方法是用来显示对话框的 EnemyChange 是我们 需要指定的类型 (这里是我们的类)
// "统一修改敌人"是我们给对话框取的名字
//"ChangeValue" 我们对话框上的按钮名字
//"Other Button" 我们自己额外创建的按钮
ScriptableWizard.DisplayWizard<EnemyChange>("统一修改敌人","ChangeValue","Other Button");}
public int changeSpeed = 10; // 我们要展现出来修改的属性
//给我们添加的按钮 添加一个方法
void OnWizardOtherButton()
{
Debug.Log("加油"); //点击OtherButton 会执行该方法 (按下之后不会关闭这个对话框,按下另外一 个按钮 会关闭该对话框)
}
void OnWizardCreate() //检测 对话框的按钮 的点击
{
(修改我们选择物体上的脚本里面的属性)
GameObject[] enemyPrefabs = Selection.gameObjects; //保存我们选择的物体foreach (var go in enemyPrefabs) //遍历我们选择的物体
{
Cube cb = go.GetComponent<Cube>(); //得到我们选择的物体上的脚本
Undo.RecordObject(cb,"change"); // 记录我们 的操作 便于撤销 “change”是随便起的名字
cb.speed += changeSpeed; //修改脚本属性
}
}
// 当前对话框弹出来和字段值修改的时候会被调用
void OnWizardUpdate()
{
helpString = null;
errorString = null;
if (Selection.gameObjects.Length>0)
{
helpString = "您当前选择了:" + Selection.gameObjects.Length + "个敌人"; // 帮助信息提示
// helpString = "加油";
}
else
{
errorString="请选择至少一个敌人"; // 错误信息提示(红色提示字)
}
}
// 当我们选择改变的时候 会被调用
void OnSelectionChange()
{
OnWizardUpdate();
}
}
8.如何显示提示信息
使用ShowNotification这个方法显示提示信息
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体的值被修改了"));
9 使用EditorPrefabs 保存数据
private int changeSpeed=10;
// 当窗口被创建出来 的时候调用的
{
changeSpeed = EditorPrefs.GetInt("changeSpeed", changeSpeed);
}
// 当前对话框弹出来和字段值修改的时候会被调用
void OnWizardUpdate()
{
EditorPrefs.SetInt("changeSpeed",changeSpeed); //存储我们的修改的值
}
作用 当我们修改值的时候 会被对话框 保存下来
例子 :
把15修改为20 点击AddSpeed
再重新打开 我们的值是不是修改并保存下来了呢
10.显示进度条
编辑进度条
EditorUtility.DisplayProgressBar("进度","0/"+enemyPrefabs.Length+"完成修改值",0);
int count=0;
count++;
EditorUtility.DisplayProgressBar("进度", count+"/" + enemyPrefabs.Length + "完成修改值", count/enemyPrefabs.Length);
EditorUtility.ClearProgressBar(); 进度条完成后 关闭进度条
11.创建自定义窗口
using UnityEditor;
public class MyWindow : EditorWindow { // 继承自这个类EditorWindow[MenuItem("Window/Show myWindow")]
static void ShowMyWindow()
{
MyWindow window = EditorWindow.GetWindow<MyWindow>();
window.Show(); // 显示出来这个窗口
}
}
private string name=null;
//绘制窗口
void OnGUI()
{
GUILayout.Label("这是我的窗口");
name= GUILayout.TextField(name);
if (GUILayout.Button("创建"))
{
GameObject go=new GameObject(name);
Undo.RegisterCreatedObjectUndo(go,"create gameObjet"); //注册到操作记录里 可以撤销操作
}