菜单栏扩展
- 创建一个Editor文件夹
- 在文件夹下创建c#脚本
- 脚本引用Unity.Editor
- 创建一个静态方法
- 在方法上下[MenuItem("菜单栏名/扩展按钮名)"]后面还可以跟两个参数,第一个isValidateFuntion(后面有介绍),第二个是级别,默认为1000,级别相差11就会有分割线
例:
using UnityEditor;
using UnityEngine;
public class Tools{
[MenuItem("Tools/print")]
static void print()
{
Debug.Log("This is a text");
}
}
组件的右键菜单栏
[MenuItem("CONTEXT/组件名/扩展按钮名)"]能添加任意组件的扩展按钮
[ContextMenu("···")]直接添加所打开脚本的扩展按钮
组件的属性右键菜单栏
[ContextMenuItem("按钮名","方法名")]加在属性前,且方法必须存在
MenuCommand
MenuCommand有一个context变量,能够获取当前的组件对象,即MenuCommand.context为当前组件对象,将对象转换为当前组件就可以使用了
Selection用来获取当前选取的游戏物体
变量activityGameObject,获取Inspector面板上的游戏物体或者第一个选取的游戏物体
变量objects,获取Hierarchy层级面板或者Project面板等上的所选取的游戏物体集合
编写可以撤销的通过扩展按钮进行的删除操作
不使用GameObject.DestroyImmediate(X);
而是使用Undo.DestroyObjectImmediate(X);
菜单项添加快捷键
[MenuItem("菜单栏名/扩展按钮名 _t)"]快捷键就是T
%=ctrl #=shift &=alt
[MenuItem("菜单栏名/扩展按钮名 %q)"]快捷键就是ctrl+q
isValidateFuntion
表示是否为控制扩展按钮是否启用的方法
例:
using UnityEditor;
using UnityEngine;
public class Tools{
[MenuItem("Tools/print"),false,12]
static void Print()
{
Debug.Log("This is a text");
}
[MenuItem("Tools/print"),false,12]//除第二个参数,其他与上面保持一致
static bool CtroPrint() //方法名不相同,注意返回值为bool类型
{
if(Selection.objects.Length>0) //选中了物体则启用,没有则不启用
return true;
else
return false;
}
}
创建对话框,动态修改脚本字段
例:
using UnityEditor;
public class ChangeHealth : ScriptableWizard {
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
//第一个参数是对话框的名字,第二个是对话框按钮的名字,默认为Create
//第三个参数为第二个对话框按钮的名字,最多两个按钮
//第一个执行完点击事件方法后就会自动关闭对话框,第二个不会关闭对话框
ScriptableWizard.DisplayWizard<ChangeHealth>("修改血量", "change and close","change");
}
public int Health;
private void OnEnable() //对话框初始化时调用,相当于Awake
{
Health = 0;
}
private void OnWizardCreate()
{
GameObject[] roles = Selection.gameObjects;
foreach (GameObject go in roles)
{
CompleteProject.EnemyHealth hp = go.GetComponent<CompleteProject.EnemyHealth>();
Undo.RecordObject(hp, "Undo Health");
hp.startingHealth += Health;
}
ShowNotification(new GUIContent("血量改变了"));//提示框信息
}
private void OnWizardOtherButton()
{
OnWizardCreate();
}
private void OnWizardUpdate() //对话框变化使自动调用改方法,包括创建对话框,不包括关闭对话框
{
helpString = null;errorString = null;
if (Selection.gameObjects.Length > 0)
{
helpString = "当前选择了" + Selection.gameObjects.Length + "个物体"; //提示信息
}
else
errorString = "当前没有选择!"; //错误信息
}
private void OnSelectionChange() //选择改变时调用
{
OnWizardUpdate();
}
}
编辑器模式下数据保存
使用EditorPrefs保存数据,相较于PlayerPrefs,这个不会被打包
进度条的创建
创建使用EditorUtility.DisplayProgressBar(进度条名,进度名,进度);
进度加载完不会清除,要清除使用EditorUtility.ClearProgressBar();
创建自定义窗口
例:
using UnityEngine;
using UnityEditor;
public class MyWindow : EditorWindow {
[MenuItem("Tools/mywindow")]
static void ShowMyWindow()
{
MyWindow myWindow = EditorWindow.GetWindow<MyWindow>();
myWindow.Show();
}
private string name = "";
private void OnGUI()
{
GUILayout.Label("窗口");
name = GUILayout.TextField(name);
if(GUILayout.Button("创建一个空物体"))
{
GameObject go = new GameObject(name);
Undo.RegisterCreatedObjectUndo(go, "Create GameObject");
}
}
}
网友评论