[Unity编辑器]自定义编辑器界面
2015-03-21 13:58
603 查看
主要参考了雨松MoMo的Unity3D拓展编辑器系列
编辑器GUI类
1.GUI、GUILayout
2.EditorGUI、EditorGUILayout
编辑器类(脚本要放在Assets/Editor文件夹中,要使用UnityEditor的命名空间):
1.EditorWindow(重点是OnGUI()的编写)
2.Editor(重点是OnInspectorGUI()、OnSceneGUI()的编写,为特定的脚本或者对象编写自定义的界面)
a.OnInspectorGUI()
对比图如下:
对Inspector视图下Test脚本的变量进行自定义
b.OnSceneGUI()
为物体挂上Test脚本,运行时,在Hierarchy视图中选择该物体即可显示相关信息
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.
2.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
实际上,查看Unity的api,会发现Unity为我们封装了很多的编辑器类,因此,以上的只是冰上一角而已。
以下是本人发现的一个比较好的Unity编辑器教程:点击这里
编辑器GUI类
1.GUI、GUILayout
2.EditorGUI、EditorGUILayout
编辑器类(脚本要放在Assets/Editor文件夹中,要使用UnityEditor的命名空间):
1.EditorWindow(重点是OnGUI()的编写)
using UnityEngine; using UnityEditor; public class MyWindow : EditorWindow { string myString = "Hello World"; bool groupEnabled; bool myBool = true; float myFloat = 1.23f; [MenuItem("Window/My Window")] static void Init() { EditorWindow.GetWindow(typeof(MyWindow)); } void OnGUI() { GUILayout.Label("Base Settings", EditorStyles.boldLabel); myString = EditorGUILayout.TextField("Text Field", myString); groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Settings", groupEnabled); myBool = EditorGUILayout.Toggle("Toggle", myBool); myFloat = EditorGUILayout.Slider("Slider", myFloat, -3, 3); EditorGUILayout.EndToggleGroup(); } }
2.Editor(重点是OnInspectorGUI()、OnSceneGUI()的编写,为特定的脚本或者对象编写自定义的界面)
a.OnInspectorGUI()
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public Rect mRectValue; public Texture texture; }
using UnityEditor; using UnityEngine; //自定义Tset脚本 [CustomEditor(typeof(Test))] //在编辑模式下执行脚本,这里用处不大可以删除。 [ExecuteInEditMode] //请继承Editor public class MyEditor : Editor { //在这里方法中就可以绘制面板。 public override void OnInspectorGUI() { //得到Test对象 Test test = (Test)target; //绘制一个窗口 test.mRectValue = EditorGUILayout.RectField("窗口坐标", test.mRectValue); //绘制一个贴图槽 test.texture = EditorGUILayout.ObjectField("增加一个贴图", test.texture, typeof(Texture), true) as Texture; } }
对比图如下:
对Inspector视图下Test脚本的变量进行自定义
b.OnSceneGUI()
using UnityEditor; using UnityEngine; //自定义Tset脚本 [CustomEditor(typeof(Test))] //请继承Editor public class MyEditor2 : Editor { void OnSceneGUI() { //得到test脚本的对象 Test test = (Test) target; //绘制文本框 Handles.Label(test.transform.position + Vector3.up*2, test.transform.name +" : "+ test.transform.position.ToString() ); //在OnSceneGUI()中只能通过Handles来绘制新视图,如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()组合的使用。 //开始绘制GUI Handles.BeginGUI(); //规定GUI显示区域 GUILayout.BeginArea(new Rect(100, 100, 100, 100)); //GUI绘制一个按钮 if(GUILayout.Button("这是一个按钮!")) { Debug.Log("test"); } //GUI绘制文本框 GUILayout.Label("我在编辑Scene视图"); GUILayout.EndArea(); Handles.EndGUI(); } }
为物体挂上Test脚本,运行时,在Hierarchy视图中选择该物体即可显示相关信息
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.
using UnityEngine; using System.Collections; using UnityEditor; using System.Linq; public class AnimClipEventEditor : EditorWindow { public AnimationClip clip; [MenuItem("Window/动画事件编辑器")] static void Init() { GetWindow<AnimClipEventEditor>(); } void OnGUI() { clip = (AnimationClip)EditorGUILayout.ObjectField(clip,typeof(AnimationClip)); if(clip) { if(GUILayout.Button("清除所有动画事件")) { AnimationUtility.SetAnimationEvents(clip,null); } var events = AnimationUtility.GetAnimationEvents(clip); for(int i = 0;i < events.Length;i++) { if(GUILayout.Button("清除动画事件" + events[i].functionName)) { var listEvents = events.ToList(); listEvents.RemoveAt(i); AnimationUtility.SetAnimationEvents(clip,listEvents.ToArray()); EditorUtility.SetDirty(clip); } } } } }
2.
using UnityEngine; using System.Collections; public class MyDate : MonoBehaviour { public Texture texture; }
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(MyDate))] public class MyDateEditor : Editor { public override bool HasPreviewGUI () { return true; } public override GUIContent GetPreviewTitle () { return new GUIContent("MyDate"); } public override void OnPreviewGUI (Rect r, GUIStyle background) { MyDate myDate = (MyDate)target; if(myDate.texture != null) GUI.Box(r,myDate.texture); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
实际上,查看Unity的api,会发现Unity为我们封装了很多的编辑器类,因此,以上的只是冰上一角而已。
以下是本人发现的一个比较好的Unity编辑器教程:点击这里
相关文章推荐
- 用mel编写自定义节点的属性编辑器界面
- 【unity】拓展自定义编辑器窗口(二)
- Unity编辑器扩展-基本界面编写
- Unity编辑器界面模糊
- Unity 自定义Inspector界面。 延时 对 对象的 一些 基本操作。
- 使用GMF开发可视化界面编辑器(二)——自定义Figure
- Unity 自定义 编辑器 添加提示框
- unity 编辑器界面能调用OnGUI和Update等函数
- Unity编辑器拓展【自定义窗口】
- Unity 编辑器启动时运行自定义编辑器脚本
- 【Unity编辑器】使用反射和Attribute实现自定义右键菜单
- Unity编辑器下,界面替换NGUI字体以及字号
- Unity + ZXing + 屏幕旋转自动自适应 + 自定义扫码界面
- Unity编辑器扩展-基本界面编写
- Unity 编辑器扩展自定义窗体
- [Unity] Unity3D研究院编辑器之自定义默认资源的Inspector面板
- Unity创建自定义窗口编辑器
- Unity3d 技巧(14) -自定义 UnityEvent 序列化到Editor 界面
- Unity Editor 编辑器扩展 十三 自定义创建资源
- Unity JSON文件的写入(序列化)与读取(反序列化)、以及自定义JSON编辑器