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

创建一个编辑器列表

在查看器里使用自己定义的列表,我们用另一种方式实现PropertyField方法。此方法名字就叫Show,并将其放到自己的静态功能类中,这样我们就可以随时使用了。类名就叫EditorList,我们将其放到Editor文件夹里。

 

1
2
3
4
5
6
7
8
<strong>using UnityEditor;
using UnityEngine;
 
public static class EditorList {
 
public static void Show (SerializedProperty list) {
}
}</strong>

 

EditorList脚本

此函数现在还没有什么操作,但我们已经在自定义编辑器中使用了,并多次在我们的空查看器中生成。

1
2
3
4
5
6
7
8
public override void OnInspectorGUI () {
serializedObject.Update();
EditorList.Show(serializedObject.FindProperty("integers"));
EditorList.Show(serializedObject.FindProperty("vectors"));
EditorList.Show(serializedObject.FindProperty("colorPoints"));
EditorList.Show(serializedObject.FindProperty("objects"));
serializedObject.ApplyModifiedProperties();
}

显示的列表有三部分组成:层级,尺寸和元素。我们可以使用EditorGUILayout.PropertyField显示其层级,并将在列表中隐藏其子列表。然后我们可以利用arraySize和SerializedProperty的GetArrayElementAtIndex函数显示其列表元素。我们暂时忽略列表的尺寸。

1
2
3
4
5
6
public static void Show (SerializedProperty list) {
EditorGUILayout.PropertyField(list);
for (int i = 0; i < list.arraySize; i++) {
EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i));
}
}

不含缩进元素的列表

适当缩进

现在我们的列表元素是不缩进的。我们可以在显示元素之前,通过增加缩进比例来解决此问题,当然也可以之后减少缩进。

1
2
3
4
5
6
7
8
public static void Show (SerializedProperty list) {
EditorGUILayout.PropertyField(list);
EditorGUI.indentLevel += 1;
for (int i = 0; i < list.arraySize; i++) {
EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i));
}
EditorGUI.indentLevel -= 1;
}

混乱的缩进

现在的缩进就好多了,但是我们的颜色点列表在第一个元素之后还是出差了。这是因为我们在自定义抽屉中将缩进设为了零。有两种方式可以修复此问题。可以挨个元素设置正确的尺寸,也可以保证缩进尺寸不被修改。来查看下ColorPointDrawer是否运行正常吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) {
int oldIndentLevel = EditorGUI.indentLevel;
label = EditorGUI.BeginProperty(position, label, property);
Rect contentPosition = EditorGUI.PrefixLabel(position, label);
if (position.height > 16f) {
position.height = 16f;
EditorGUI.indentLevel += 1;
contentPosition = EditorGUI.IndentedRect(position);
contentPosition.y += 18f;
}
contentPosition.width *= 0.75f;
EditorGUI.indentLevel = 0;
EditorGUI.PropertyField(contentPosition, property.FindPropertyRelative("position"), GUIContent.none);
contentPosition.x += contentPosition.width;
contentPosition.width /= 3f;
EditorGUIUtility.labelWidth = 14f;
EditorGUI.PropertyField(contentPosition, property.FindPropertyRelative("color"), new GUIContent("C"));
EditorGUI.EndProperty();
EditorGUI.indentLevel = oldIndentLevel;
}

缩进正确,但是没有折叠

列表折叠

现在缩进正常了,我们需要看下一个问题。层级应该可以折叠和扩展列表,但是当前却不行。简单的检查我们列表中的isExpanded属性即可修复。

1
2
3
4
5
6
7
8
9
10
public static void Show (SerializedProperty list) {
EditorGUILayout.PropertyField(list);
EditorGUI.indentLevel += 1;
if (list.isExpanded) {
for (int i = 0; i < list.arraySize; i++) {
EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i));
}
}
EditorGUI.indentLevel -= 1;
}

折叠正确

原文链接:http://catlikecoding.com/unity/tutorials/editor/custom-list/


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

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