Custom Editorshtml
加速游戏制做过程的关键是为哪些频繁使用的组件建立自定义的编辑器,为了举例,咱们将会使用下面这个极其简单的脚本进行讲解,它的做用是始终保持一个对象注视某一点。编辑器
public class LookAtPoint : MonoBehaviour { public Vector3 lookAtPoint = Vector3.zero; void Update () { transform.LookAt (lookAtPoint); } }
这个脚本会让一个对象保持面向世界空间中的某一点,让咱们作的更酷一点!ide
第一步是让它在编辑器里面正常工做:即便你没有测试游戏,也能让这个脚本运行。咱们对它添加ExecuteInEditMode属性来作这件事。测试
[ExecuteInEditMode] public class LookAtPoint : MonoBehaviour { public Vector3 lookAtPoint = Vector3.zero; void Update () { transform.LookAt (lookAtPoint); } }
你能够把这个脚本加在main camera上,而后在Scene视图中拖拽相机测试一下。spa
Making a Custom Editor设计
测试发现工做正常表现良好,但咱们能够为它定制一个编辑器使其更加nice。为了实现这个目的,咱们须要为它建立一个编辑器,在名为"Editor"的文件夹里面建立一个LookAtPointEditor的C#脚本。3d
using UnityEngine; using UnityEditor; using System.Collections; [CustomEditor(typeof(LookAtPoint))] public class LookAtPointEditor : Editor { public void OnInspectorGUI() { LookAtPoint lap = (LookAtPoint)target; lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint); if(GUI.changed) EditorUtility.SetDirty(lap); } }
这个类必须继承Editor类。CustomEditor属性告知Unity哪一个组件须要表现为编辑器code
OnInspectorGUI方法中的代码,当Unity在Inspcetor中显示这个编辑器时执行。你能够在这里放入任何GUI代码--它的工做和游戏中的OnGUI方法相似,只不过它是在Inpector中执行,Editor定义了target属性,以便让你可以得到被检视的对象。orm
经过检查GUI.changed,若是发现用户修改了任何值,EditorUtility.SetDirty代码就会执行。其做用是将指定对象标记为脏。htm
[Unity内部使用dirty标记去肯定资源何时被修改,而且须要被存盘。好比,你修改了一个prefab的MonoBehaviour或者ScriptableObject变量,你必须告诉Unity这个值被改变。Unity内置的组件,其内部在属性变化时自动调用SetDirty方法,而像MonoBehaviour或者ScriptableObject却不自动作这件事,因此若是你想让变化的值可以存储下来,你必需要调用SetDirty方法]
在这个例子中,咱们建立了一个相似于Transform编辑器中的3维向量编辑框,以下图:
这儿还能够作更多更多,可是目前就此为止,咱们还要去钓更大的鱼...^~^
Scene View Additions
你能够在你自定义的编辑器中实现OnSceneGUI方法来为Scene视图添加额外代码。在这个例子中,咱们会添加第2个位置处理器,以便让用户能够在Scene视图中拖拽注视点。
using UnityEngine; using UnityEditor; using System.Collections; [CustomEditor(typeof(LookAtPoint))] public class LookAtPointEditor : Editor { public void OnInspectorGUI() { LookAtPoint lap = (LookAtPoint)target; lap.lookAtPoint = EditorGUILayout.Vector3Field("Look At Point", lap.lookAtPoint); if(GUI.changed) EditorUtility.SetDirty(lap); } public void OnSceneGUI() { LookAtPoint lap = (LookAtPoint)target; lap.lookAtPoint = Handles.PositionHandle (lap.lookAtPoint, Quaternion.identity); if(GUI.changed) EditorUtility.SetDirty(lap); }//这个没看到什么效果,还没太懂 }
OnSceneGUI工做就像OnInspectorGUI方法--除了它是在Scene视图中运行。为了帮助你制做编辑接口,你可使用Handles类中定义的方法。里面定义的全部方法都是为了在3D Scene
视图中工做设计的。
若是你想放置2D GUI对象(GUI,EditorGUI或者其它的),你须要将他们包装在Handles.BeginGUI()和Handles.EndGUI()中。