在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽。用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简单了解下UnityEditor部分的内容。
编辑器最最基本的用法呢就是编辑Inspector。
而Inspector中最最基本的就是把字段显示出来。给几个例子:
[code]csharpcode:
using UnityEngine; using System.Collections; // 这里没有添加其他引用 public class Editor0 : MonoBehaviour { // 很简单的,仅仅是用public关键字来修饰而已,然后把脚本放到某个物体上 public int IntValue; public float FloatValue; public GameObject GameObjectValue; public GameObject[] GameObjectValueList; public Vector3 Vector3Value; public enum EnumValue { Value0 = 0, Value1 = 1, Value2 = 2 }; // ...... }
然后就出现了这些东西,各种类型自己去对应。
这是最最基础的编辑器应用,接下去我们使用其他的方法。看下代码:
[code]csharpcode:
using UnityEngine; using System.Collections; // 这里没有添加其他引用 public class Editor1 : MonoBehaviour { [SerializeField] // 这是强制序列化,就是它让私有变量也显示在了Inspector中 private int IntValue; // 下面的字段都是私有的 [SerializeField] private float FloatValue; [SerializeField] private GameObject GameObjectValue; [SerializeField] private GameObject[] GameObjectValueList; [SerializeField] private Vector3 Vector3Value; private enum EnumValue { Value0 = 0, Value1 = 1, Value2 = 2 }; [SerializeField] private EnumValue Ev = EnumValue.Value0; // ...... }
这里我们发现,即便是私有的字段,也被显示出来了,就是因为[SerializeField]的存在。像[SerializeField]这样的还有[NonSerialized]、[HideInInspector]、[AddComponentMenu("XXX/XX/XXX")] 等等,今天讲的不是这个话题,就不多做解释了。下面我们更深入了解一下。
1. 写一个自定义的编辑器窗口
[code]csharpcode:
using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorWindow // 编辑器类 { [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单 static void CreateWindow() // 下面这个函数必须是***静态的*** { // 在这里面创建窗口 } }
上面是创建一个自定义窗口的基本框架,这里要注意的是MenuItem中的菜单名,可以在现有的菜单中添加,也可以新建一个菜单,但必须至少有一个子菜单。继续添加内容:
[code]csharpcode:
using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorWindow // 编辑器类 { [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单 static void CreateWindow() // 下面这个函数必须是***静态的*** { // 在这里面创建窗口 EditorWindow.GetWindow(typeof(Editor2), false, "EditorWindow", true); } }
我们添加了一句EditorWindow.GetWindow()来创建一个窗口,其中的参数(1)t:窗口类型;(2)utility:标准窗口(true)/内嵌窗口(false);(3)title:窗口的名称;(4)focus:焦点。标准窗口和内嵌窗口的区别我的理解是是否嵌入Unity的窗口中。
这样的话,点击EditorDemo那个菜单里的CreateWindow,就会出现一个空白窗口了。之后就应该要往窗口中添加内容。在编辑器类中也包括像MonoBehavior类里Start,Awake,Update之类的函数,其中OnGUI就用来绘制编辑器内容,看一段代码:
[code]csharpcode:
using UnityEngine; using System.Collections; using UnityEditor; // 编辑器命名空间的引用 public class Editor2 : EditorWindow // 编辑器类 { bool toggle; Color color; AnimationCurve animationCurve = new AnimationCurve(); float floatValue = 0f; bool foldOut; enum EnumList { enum0 = 0, enum1 = 1, enum2 = 2 }; EnumList enumValue = EnumList.enum0; [MenuItem("EditorDemo/CreateWindow")] // 在编辑器中添加一个菜单 static void CreateWindow() // 下面这个函数必须是***静态的*** { // 在这里面创建窗口 EditorWindow.GetWindow(typeof(Editor2), false, "EditorWindow", true); } void OnGUI() { toggle = EditorGUILayout.Toggle("Toggle", toggle); EditorGUILayout.LabelField("This is a labelField"); color = EditorGUILayout.ColorField("Color", color); animationCurve = EditorGUILayout.CurveField("AnimationCurve", animationCurve); floatValue = EditorGUILayout.FloatField("FloatField", floatValue); foldOut = EditorGUILayout.Foldout(foldOut, "FoldOut"); enumValue = (EnumList)EditorGUILayout.EnumPopup("EnumPopup", enumValue); // ...... 功能还有很多,在之后的文章中,小贱会分多次讲解每个的具体用法,现在了解就可以了 } }
Unity中自带的编辑器功能真的有很多,滑块,字符串输入,密码框,下拉框等等,制作简单的插件用于工程项目中已经是绰绰有余了。当然了,今天因为时间有限,Unity编辑器方面的内容也是大有讲究,所以我们只是做了简单的了解。之后的文章中,我会单个功能详细的去讲解。