本文共 5475 字,大约阅读时间需要 18 分钟。
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的,而是集成ScriptableObjectusing 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.DisplayWizard09:兼容按钮点击统一修改字段("改变字段的值"); } public string name=null; public int hp; public float speed;}
public class ValueChange : ScriptableWizard{ public int addHp = 10; public float addSpeed=20; [MenuItem("Tools/Change")] public static void ChangeValue(MenuCommand cmd) { ScriptableWizard.DisplayWizard("改变hp 和speed的值"); } //按钮点击 public void OnWizardCreate() { GameObject[] items = Selection.gameObjects; foreach (var item in items) { Value value = item.GetComponent (); 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(); 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:创建自定义窗口
////// 创建自己的窗口/// public class MyWindow : EditorWindow { [MenuItem("Window/ShowWindow")] public static void ShowWindow() { MyWindow myWindow=EditorWindow.GetWindow(); //获得窗口 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"); //注册 } }}
转载地址:http://xcrxo.baihongyu.com/