AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Unity3D

【Unity C#编程】制作星星(二)

51自学网 2014-05-24 http://www.51zixue.net

改进查看器

现在我们可以制作漂亮的星星了,现在需要集中精力到我们组建的查看器上。多亏了ColorPoint绘制器的特性,才使得查看器看起来很得体,但我们可以通过使用属性来自定义修改外观来改进它。

为了经常使用我们使用一个滑块。范围是1到20之间。同时使用列表属性来添加按钮到点列表以此来让它更加紧凑。

1
2
3
4
5
[List(showSize = false, showElementLabels = false)]
public ColorPoint[] points;
 
[Range(1, 20)]
public int frequency = 1;

处理属性

看起来不错,但是我们可以通过我们的组件创建自定义编辑器来使它更好。在编辑器文件夹里创建一个叫StarInspector的C#脚本。,让它继承UnityEditor.Editor,应用UnityEditor.CustormEditor属性来告知Unity我们希望它为我们组件进行绘制操作。

1
2
3
4
5
6
using UnityEditor;
using UnityEngine;
 
[CustomEditor(typeof(Star))]
public class StarInspector : Editor {
}

自定义编辑器

现在我们的星星的编辑器还是现实相同的信息,但看起来更加丑陋了。因为现在设置它看起来像是控制而不是一个查看器。为此,我们覆盖了Editor类的OnInspectorGUI函数,将它创建成更像一个查看器,之后使用默认方法绘制。我们的组件就跟之前看起来一样了。

1
2
3
4
public override void OnInspectorGUI () {
EditorGUIUtility.LookLikeInspector();
DrawDefaultInspector();
}

属性绘制器和编辑器有三个重要的不同地方。首先,在编辑器里我们跟整个SerializedObject打交道而不是一个SerializedProperty。其次,只要对象保持选中,编辑器的实例就一直存在,因此保持状态是可以的。最后,由于自定义编辑器已经有很长时间了,甚至比SerializedObject存在都早,它们有一些过时的功能。

首先需要做的就是算出我们的查看器显示时候哪个星星已经选中。编辑器为此提供一个通用目标属性,但它不是一个SerializedObject。我们需要自己用一个SerializedObject来包装它。虽然这不是很必须,但还是很方便的,因为它能为编辑器简化很多东西,并且是稳定的。

由于我们的编辑器以及存在好久了。我们需要换成我们的序列对象以及对其属性的引用。我们在OnEnabled Unity事件方法中初始化它们。

1
2
3
4
5
6
7
8
9
private SerializedObject star;
private SerializedProperty center, points, frequency;
 
void OnEnable () {
star = new SerializedObject(target);
center = star.FindProperty("center");
points = star.FindProperty("points");
frequency = star.FindProperty("frequency");
}

每次调用我们的查看器方法,我们需要确保SerializedObject是最新的。这是我们在OnInspectorGUI中做的第一件事情。之后我们通过一个简单调用EditorGUILayout.PropertyField来展示我们的属性。之后,通过应用所选组件的属性修改来结束。

1
2
3
4
5
6
7
8
9
public override void OnInspectorGUI () {
EditorGUIUtility.LookLikeInspector();
star.Update();
EditorGUIUtility.LookLikeInspector();
EditorGUILayout.PropertyField(center);
EditorGUILayout.PropertyField(points);
EditorGUILayout.PropertyField(frequency);
star.ApplyModifiedProperties();
}

只有属性

现在看起了还是一样,处理在上面没有脚本域外,这就是一个改进啊。作为一项额外添加的特性,我们可以显示有多少星星,在没有足够点处显示一个警告。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public override void OnInspectorGUI () {
EditorGUIUtility.LookLikeInspector();
star.Update();
EditorGUIUtility.LookLikeInspector();
EditorGUILayout.PropertyField(center);
EditorGUILayout.PropertyField(points);
EditorGUILayout.PropertyField(frequency);
int totalPoints = frequency.intValue * points.arraySize;
EditorGUI.indentLevel -= 1;
if (totalPoints < 3) {
EditorGUILayout.HelpBox("At least three points are needed.", MessageType.Warning);
}
else {
EditorGUILayout.HelpBox(totalPoints + " points in total.", MessageType.Info);
}
EditorGUI.indentLevel += 1;
star.ApplyModifiedProperties();
}

number of points not enough points

额外信息

原文链接:http://catlikecoding.com/unity/tutorials/editor/star/


建议使用电驴(eMule)下载分享的资源。

说明
:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。
 
上一篇:【Unity C#编程】制作星星(三)  下一篇:【Unity C#编程】制作星星(一)