1.枚举菜单实现
文件1:Assets/MyScript/Test1.cs
代码如下:
uusing System.Collections; using System.Collections.Generic; using UnityEngine; public class Test1 : MonoBehaviour { public Enum4 mEnum; public int mInt; public float mFloat; public string mStr; public Color mColor; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } public enum Enum4 { None, IntVal, FloatVal, StrVal, ColorVal }
文件2:Assets/MyScript/Editor/Test1Editor.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; [CustomEditor(typeof(Test1),true)] public class Test4Editor : Editor { public SerializedObject mObj; public SerializedProperty mEnum; public SerializedProperty mInt; public SerializedProperty mFloat; public SerializedProperty mStr; public SerializedProperty mColor; public void OnEnable() { this.mObj = new SerializedObject(target); this.mEnum = this.mObj.FindProperty("mEnum"); this.mInt = this.mObj.FindProperty("mInt"); this.mFloat = this.mObj.FindProperty("mFloat"); this.mStr = this.mObj.FindProperty("mStr"); this.mColor = this.mObj.FindProperty("mColor"); } public override void OnInspectorGUI() { this.mObj.Update(); EditorGUILayout.PropertyField(this.mEnum); switch (this.mEnum.enumValueIndex) { case 1: EditorGUILayout.PropertyField(this.mInt); break; case 2: EditorGUILayout.PropertyField(this.mFloat); break; case 3: EditorGUILayout.PropertyField(this.mStr); break; case 4: EditorGUILayout.PropertyField(this.mColor); break; } this.mObj.ApplyModifiedProperties(); } }
测试一下
新建一个场景,新建一个Empty 节点,用来测试枚举组件
将文件1:Assets/MyScript/Test1.cs拖到Game Object的Inspector面板上。
实现了一个简单的枚举菜单:
2.Window窗口菜单实现
窗口菜单实现1——显示窗口:
文件:Assets/MyScript/Test2Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test2Window : EditorWindow { [MenuItem("测试2/ShowWindow")] public static void ShowWindow() { Test2Window.CreateInstance<Test2Window>().Show(); } }
测试一下
保存文件后,在窗口左边有"测试2/ShowWindow"菜单选项
如下:
打开"测试2/ShowWindow"窗口,如下:
窗口菜单实现2——弹出类型:
文件:Assets/MyScript/Test3Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test3Window : EditorWindow { [MenuItem("测试2/Test3Window")] public static void ShowWindow() { Test3Window.CreateInstance<Test3Window>().ShowUtility(); } }
测试一下
打开"测试2/Test3Window"窗口,如下:
窗口菜单实现3——浮动工具窗口:
文件:Assets/MyScript/Test4Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test4Window : EditorWindow { [MenuItem("测试2/Test4Window")] public static void ShowWindow() { Test4Window.CreateInstance<Test4Window>().ShowPopup(); } public void OnGUI() { if(GUILayout.Button("关闭")) { this.Close(); } } }
测试一下
打开"测试2/Test4Window"窗口,如下:
3.Window窗口文本与颜色
文件:Assets/MyScript/Test6Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test6Window : EditorWindow { [MenuItem("测试2/Test6Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test6Window>().Show(); } public string mText = "默认文本"; public Color mColor = Color.white; public void OnGUI() { if (GUILayout.Button("关闭")) { this.Close(); } this.mText = EditorGUILayout.TextField(this.mText); this.mText = EditorGUILayout.TextArea(this.mText); this.mText = EditorGUILayout.PasswordField(this.mText); this.mColor = EditorGUILayout.ColorField(this.mColor); //EditorGUILayout 后面的关键字:TextField、TextArea、PasswordField和ColorField。 } }
测试一下
打开"测试2/Test6Window"窗口,如下:
窗口文本与颜色关键字:TextField、TextArea、PasswordField和ColorField。
4.Window窗口标签字段
文件:Assets/MyScript/Test7Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test7Window : EditorWindow { [MenuItem("测试2/Test7Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test7Window>().Show(); } public string mText = "默认文本"; public Color mColor = Color.white; public void OnGUI() { EditorGUILayout.LabelField("文本输入框"); this.mText = EditorGUILayout.TextField(this.mText); EditorGUILayout.Space(20); this.mText = EditorGUILayout.TextArea(this.mText); EditorGUILayout.SelectableLabel("密码输入框"); this.mText = EditorGUILayout.PasswordField(this.mText); this.mColor = EditorGUILayout.ColorField(this.mColor); } }
测试一下
打开"测试2/Test7Window"窗口,如下:
窗口标签字段关键字:LabelField(“文本输入框”);和Space(20);
5.Window窗口滑动条
文件:Assets/MyScript/Test8Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test8Window : EditorWindow { [MenuItem("测试2/Test8Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test8Window>().Show(); } public int mInt; public float mFloat; public float mMinFloat; public float mMaxFloat; public void OnGUI() { EditorGUILayout.LabelField("浮点值滑动条0-100"); this.mFloat = EditorGUILayout.Slider(this.mFloat, 0, 100); EditorGUILayout.Space(20); EditorGUILayout.LabelField("整数值滑动条0-100"); this.mInt = EditorGUILayout.IntSlider(this.mInt, 0, 100); EditorGUILayout.Space(30); EditorGUILayout.LabelField("最小值和最大值滑动条"); this.mMinFloat = EditorGUILayout.Slider(this.mMinFloat, 0, 100); this.mMaxFloat = EditorGUILayout.Slider(this.mMaxFloat, 0, 100); EditorGUILayout.MinMaxSlider(ref this.mMinFloat, ref this.mMaxFloat, 0, 100); } }
测试一下
打开"测试2/Test8Window"窗口,如下:
窗口标签字段关键字:Slider、IntSlider和EditorGUILayout.MinMaxSlider(ref this.mMinFloat, ref this.mMaxFloat, 0, 100);
6.Window三维四维数组
文件:Assets/MyScript/Test9Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test9Window : EditorWindow { [MenuItem("测试2/Test9Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test9Window>().Show(); } public Vector2 mPos2; public Vector3 mPos3; public Vector4 mPos4; public Rect mRect; public Bounds mBounds; public void OnGUI() { this.mPos2 = EditorGUILayout.Vector2Field("二维数值",this.mPos2); this.mPos3 = EditorGUILayout.Vector3Field("三维数值",this.mPos3); this.mPos4 = EditorGUILayout.Vector4Field("四维数值",this.mPos4); EditorGUILayout.Space(20); EditorGUILayout.LabelField("矩阵"); this.mRect = EditorGUILayout.RectField(this.mRect); EditorGUILayout.Space(20); EditorGUILayout.LabelField("间距"); this.mBounds = EditorGUILayout.BoundsField(this.mBounds); } }
测试一下
打开"测试2/Test9Window"窗口,如下:
窗口标签字段关键字:Vector4Field、RectField和BoundsField
7.Window标签/层和对象选择
文件:Assets/MyScript/Test10Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test10Window : EditorWindow { [MenuItem("测试2/Test10Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test10Window>().Show(); } public string mStr; public int mInt; public Object mObj1; public Object mObj2; public Object mObj3; public Object mObj4; public void OnGUI() { EditorGUILayout.LabelField("Tag"); this.mStr = EditorGUILayout.TagField(this.mStr); EditorGUILayout.Space(170); EditorGUILayout.LabelField("Layer"); this.mInt = EditorGUILayout.LayerField(this.mInt); EditorGUILayout.Space(150); EditorGUILayout.LabelField("Camera"); this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Transform"); this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Texture"); this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Object_场景和资源的都可选"); this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object)); } }
测试一下
打开"测试2/Test10Window"窗口,如下:
8.Window实现Bool和折叠框
文件:Assets/MyScript/Test11Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test11Window : EditorWindow { [MenuItem("测试2/Test11Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test11Window>().Show(); } public bool mBool1; public bool mBool2; public string mStr; public int mInt; public Object mObj1; public Object mObj2; public Object mObj3; public Object mObj4; public void OnGUI() { this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1); if (this.mBool1) { EditorGUILayout.LabelField("Tag"); this.mStr = EditorGUILayout.TagField(this.mStr); EditorGUILayout.Space(20); EditorGUILayout.LabelField("Layer"); this.mInt = EditorGUILayout.LayerField(this.mInt); EditorGUILayout.Space(20); EditorGUILayout.LabelField("Camera"); this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera)); } this.mBool2 = EditorGUILayout.Foldout(this.mBool2 , "是否折叠"); if (this.mBool2) { EditorGUILayout.Space(); EditorGUILayout.LabelField("Transform"); this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Texture"); this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Object_场景和资源的都可选"); this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object)); } } }
测试一下
打开"测试2/Test11Window"窗口,如下:
Bool和折叠框实现结构:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test11Window : EditorWindow { [MenuItem("测试2/Test11Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test11Window>().Show(); } public bool mBool1; public bool mBool2; ... public void OnGUI() { this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1); if (this.mBool1) { ... } this.mBool2 = EditorGUILayout.Foldout(this.mBool2 , "是否折叠"); if (this.mBool2) { ... } } }
9.Window实现滑动条和禁用置灰选项
文件:Assets/MyScript/Test12Window.cs
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test12Window : EditorWindow { [MenuItem("测试2/Test12Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test12Window>().Show(); } public bool mBool1; public bool mBool2; public bool mBool3; public string mStr; public int mInt; public Object mObj1; public Object mObj2; public Object mObj3; public Object mObj4; public Vector2 mPos; public void OnGUI() { this.mPos = EditorGUILayout.BeginScrollView(this.mPos); this.mBool1 = EditorGUILayout.Toggle("是否开启", this.mBool1); if (this.mBool1) { EditorGUILayout.LabelField("Tag"); this.mStr = EditorGUILayout.TagField(this.mStr); EditorGUILayout.Space(20); EditorGUILayout.LabelField("Layer"); this.mInt = EditorGUILayout.LayerField(this.mInt); EditorGUILayout.Space(20); EditorGUILayout.LabelField("Camera"); this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera)); } this.mBool2 = EditorGUILayout.Foldout(this.mBool2, "是否折叠"); if (this.mBool2) { EditorGUILayout.Space(); EditorGUILayout.LabelField("Transform"); this.mObj2 = EditorGUILayout.ObjectField(this.mObj2, typeof(Transform)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Texture"); this.mObj3 = EditorGUILayout.ObjectField(this.mObj3, typeof(Texture)); EditorGUILayout.Space(); EditorGUILayout.LabelField("Object_场景和资源的都可选"); this.mObj4 = EditorGUILayout.ObjectField(this.mObj4, typeof(Object)); } this.mBool3 = EditorGUILayout.BeginToggleGroup("是否禁用置灰", this.mBool3); EditorGUILayout.LabelField("Tag"); this.mStr = EditorGUILayout.TagField(this.mStr); EditorGUILayout.LabelField("Layer"); this.mInt = EditorGUILayout.LayerField(this.mInt); EditorGUILayout.LabelField("Camera"); this.mObj1 = EditorGUILayout.ObjectField(this.mObj1, typeof(Camera)); EditorGUILayout.EndToggleGroup(); EditorGUILayout.EndScrollView(); } }
测试一下
打开"测试2/Test12Window"窗口,如下:
窗口右侧滑动条实现结构
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Test12Window : EditorWindow { [MenuItem("测试2/Test12Window")] public static void ShowWindow() { EditorWindow.GetWindow<Test12Window>().Show(); } public Object mObj4; public Vector2 mPos; public void OnGUI() { this.mPos = EditorGUILayout.BeginScrollView(this.mPos);//窗口右侧滑动条开始 ...//中间包含的菜单 EditorGUILayout.EndScrollView();//窗口右侧滑动条结束 } }
是否禁用置灰实现结构
this.mBool3 = EditorGUILayout.BeginToggleGroup("是否禁用置灰", this.mBool3); ... EditorGUILayout.EndToggleGroup(); ...