先进行第一步,给编辑器加个菜单,通过[MenuItem("AXX/BXX")]就可以在编辑器的上边菜单栏增加一个下拉菜单AXX,并增加一个按钮BXX。只要把这句话写在我们定义的函数上方就可以,然后我们点击这个按钮,就会调用这个我们自定义的函数。不过有一点一定要记住,这个函数要是static的!(想一想就可以知道是为什么,编辑器没有必要搞粗一个对象之类的,因为我们要调用的只是这个方法)例如:
using UnityEngine; using UnityEditor; using System.Collections; public class EditorTest { [MenuItem("MyTools/EditorTest")] public static void ConfigDialog() { Debug.Log("EditorTest ToolButton is pressed!"); } }
我们的编辑器就多了这样的一个工具选项MyTools,点击出现了EditorTest下拉菜单,再点击按钮就会输出Log了,如下图所示:
using UnityEngine; using UnityEditor; using System.Collections; //typeof(编辑器类名),继承EditorWindow [CustomEditor(typeof(EditorTest))] public class EditorTest : EditorWindow { //通过MenuItem按钮来创建这样的一个对话框 [MenuItem("MyTools/EditorTest")] public static void ConfigDialog() { //GetWindow创建 EditorWindow.GetWindow(typeof(EditorTest)); } public UnityEngine.Object go = null; //对话框中的各种内容通过OnGUI函数来设置 void OnGUI() { //Label GUILayout.Label("Label Test", EditorStyles.boldLabel); //通过EditorGUILayout.ObjectField可以接受Object类型的参数进行相关操作 go = EditorGUILayout.ObjectField(go, typeof(UnityEngine.Object), true); //Button if (GUILayout.Button("Button Test")) { Debug.Log(go.name); } } }
[ContextMenu("Context Menu Test")] void OnTest() { Debug.Log("Context Menu is called"); }结果如下:
using UnityEngine; using UnityEditor; using System.Collections; //typeof中参数即为我们需要定义Inspector面板的组件 [CustomEditor(typeof(CustomEditorTest))] public class TestCustomEditor : Editor { CustomEditorTest script; public override void OnInspectorGUI() { base.OnInspectorGUI(); //将target转化为我们需要的脚本 script = target as CustomEditorTest; //增加一个按钮 if (GUILayout.Button("Test Button")) { //可以直接访问CustomEditorTest类的内容 script.Test(script.num); } } }结果:
using System; using UnityEngine; public class Test : MonoBehaviour { #region 编辑Inspector视图 /// <summary> /// 只能输入 0-1的值 /// </summary> [Range(0f, 1f)] public float tRange = 1f; /// <summary> /// 输入时的提示 /// </summary> [Tooltip("Tooltip_test")] public float tTooltip = 1f; /// <summary> /// 标头 /// </summary> [Header("Header_test")] public float tHeader = 1f; /// <summary> /// 距离上一行50px /// </summary> [Space(50)] public float tSpace = 1f; /// <summary> /// 隐藏该属性(依然会被实例化) /// </summary> [HideInInspector] public float tHideInInspector = 1f; #endregion #region 编辑MonoBehaviour功能 /// <summary> /// 在标题栏Component中添加("Duan/AddComponentMenu_test")层级。 /// 点击将(Test)脚本绑定到当前选中的gameobject上。 ///(Test)脚本名必须与文件名一致,(单独的Class文件)。 /// </summary> //[AddComponentMenu("Duan/AddComponentMenu_test")] //public class Test : MonoBehaviour{} /// <summary> /// 在辑模式运行Update、FixedUpdate和OnGUI。 /// </summary> //[ExecuteInEditMode] //public class Test : MonoBehaviour{} /// <summary> /// 强制要求该脚本的gameobject必须同时绑定了Rigidbody组件,如果没有则立即添加。 /// </summary> //[RequireComponent(typeof(Rigidbody))] //public class Test : MonoBehaviour{} /// <summary> /// 给当前脚本添加右键(或小齿轮)选项 /// 点击调用该方法。 /// </summary> [ContextMenu("ContextMenu Test")] public void mContextMenu() { Debug.Log("ContextMenu Test Log"); } /// <summary> /// 在标题栏中添加("Duan/MenuItem")层级。 /// 点击调用该方法。 /// 该方法必须是static的。 /// </summary> [MenuItem("Duan/MenuItem")] public static void tMenuItem() { Debug.Log("MenuItem Test Log"); } #endregion #region 编辑属性 /// <summary> /// 标记一个变量或方法不会被序列化 /// </summary> [NonSerialized] public float tNonSerialized = 1f; /// <summary> /// 该类可以被序列化 (序列化就是把内存中对象以一种可以保存的形式保存起来。 ) /// </summary> [Serializable] public class Serializable{ } /// <summary> /// 强制序列化属性(Unity只序列化Public属性。序列化Private添加[SerializeField]。) /// </summary> [SerializeField] private bool tSerializeField = true; #endregion }PS:转载于 http://blog.csdn.net/asd237241291/article/details/41696981
http://blog.csdn.net/asd237241291/article/details/38235091
http://blog.csdn.net/kun1234567/article/details/19421471
http://blog.sina.com.cn/s/blog_471132920101n8cr.html