|
加速游戏开发的关键是创建常用组件的自定义编辑。对例子的缘故,我们会使用这个非常简单的脚本,总是寻找一个物体在一个点。将此脚本添加到您的项目,并把它放在你的场景中的一个立方体的游戏对象。脚本应该命名为“lookatpoint”
//C# Example (LookAtPoint.cs)
using UnityEngine;
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
//JS Example (LookAtPoint.js)
#pragma strict
var lookAtPoint = Vector3.zero;
function Update()
{
transform.LookAt(lookAtPoint);
}
这将保持物体朝向世界空间点。目前这个脚本只会变得活跃播放模式,即当游戏运行。当文字编辑脚本通常很有用的脚本的执行过程中有一定的编辑模式太,而游戏没有运行。你可以通过添加一个属性,它executeineditmode:
//C# Example (LookAtPoint.cs)
using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
//JS Example (LookAtPoint.js)
#pragma strict
@script ExecuteInEditMode()
var lookAtPoint = Vector3.zero;
function Update()
{
transform.LookAt(lookAtPoint);
}
现在如果你将具有该脚本在对象编辑器中,或者改变价值观的“看”的检验员,即使不在播放模式中的对象将更新其定位相应的所以它仍然是在世界空间目标点。
制作自定义编辑器
以上说明了如何获得简单的脚本运行时编辑时间,然而这就不允许你创建自己的编辑工具。下一步是创建一个自定义编辑器我们刚刚创建的脚本。
当你创建统一的脚本,它默认继承MonoBehaviour,因此是一个组件它可以被放置在一个游戏对象。当放置在一个游戏对象,检查显示用于查看和编辑所有的公共变量,可以显示如整数,浮点数,字符串,Vector3的默认界面,等。
这里是默认的检查员找我们的脚本上面:
A default inspector with a public Vector3 field
一个公共字段默认检查员到
自定义编辑器是一个独立的脚本取代这个默认的布局,那你选择的任何编辑控件。
开始创建我们的lookatpoint脚本自定义编辑器,你应该使用相同的名称创建一个脚本,但“编辑器”添加。所以我们的例子:“lookatpointeditor”。
//c# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
}
}
//JS Example (LookAtPointEditor.js)
#pragma strict
@CustomEditor(LookAtPoint)
@CanEditMultipleObjects
class LookAtPointEditor extends Editor {
var lookAtPoint : SerializedProperty;
function OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
function OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
}
}
这个班有来自编辑。这个CustomEditor属性通知统一应该作为一个编辑的组件。这个caneditmultipleobjects属性告诉统一,你可以选择多个对象的编辑和改变他们在同一时间。
在代码执行时里OnInspectorGUI统一显示编辑员。你可以把任何GUI代码,在这里,它就像OnGUI做游戏,但内部运行的督察。编辑定义可以用来访问被检查的对象的目标属性。这就是我们的海关检查员看起来像:
这是不是很有趣,因为到目前为止我们所做的是重新到现场,就像默认检查员告诉我们,这样的结果看起来很相似(虽然“脚本”字段是现在不存在的,因为我们没有添加任何督察代码显示出来)。
但是现在你已经控制检查员在编辑脚本显示出来,你可以使用你喜欢的任何编码奠定了督察领域,允许用户调整值,甚至显示图形或其他视觉元素。事实上,在Unity编辑器包括更复杂的检查如地形系统和动画导入设置你看到城管,都使用相同的API,你可以创建自己的自定义编辑时。
这是一个简单的例子,延伸你的编辑脚本将显示一个消息指示目标点的上方或下方的物体:
//c# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
}
}
//JS Example (LookAtPointEditor.js)
#pragma strict
@CustomEditor(LookAtPoint)
@CanEditMultipleObjects
class LookAtPointEditor extends Editor {
var lookAtPoint : SerializedProperty;
function OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
function OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
}
}
所以现在我们有一个新的元素,我们的检查员输出信息显示如果目标点的上方或下方的物体。
这是很表面的东西你能做编辑脚本。你有完全访问所有的imgui命令画出任何类型的接口,包括渲染场景编辑窗口内使用相机。
场景视图添加
你可以通过在你的自定义编辑器实现onscenegui到场景中添加额外的代码。
onscenegui就像OnInspectorGUI除了它运行在场景视图。帮助你在场景中让自己的编辑控件,你可以使用定义在函数处理类在那里所有的功能都设计为在三维视图的工作。
//C# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
serializedObject.ApplyModifiedProperties();
}
public void OnSceneGUI()
{
var t = (target as LookAtPoint);
EditorGUI.BeginChangeCheck();
Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Move point");
t.lookAtPoint = pos;
t.Update();
}
}
}
//JS Example (LookAtPointEditor.js)
#pragma strict
@CustomEditor(LookAtPointJS)
@CanEditMultipleObjects
class LookAtPointEditorJS extends Editor {
var lookAtPoint : SerializedProperty;
function OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
function OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
if (lookAtPoint.vector3Value.y > (target as LookAtPointJS).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPointJS).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
}
function OnSceneGUI()
{
var t : LookAtPointJS = (target as LookAtPointJS);
EditorGUI.BeginChangeCheck();
var pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Move point");
t.lookAtPoint = pos;
t.Update();
}
}
}
如果你想把二维图形对象(GUI,EditorGUI和朋友),你需要把他们放在调用处理。begingui()和处理。endgui()。
|
|