EditorGUILayout 是Unity3D 中用于描绘Inspector类型的编辑器界面的类。提供了一组十分方便实用的方法。
但不知道为什么,Unity却没有把它做好,让他的行为十分怪异。
我们可以做以下实验
建立一个Vector2类型的属性,通过EditorGUILayout.PropertyField来描画
- EditorGUILayout.PropertyField(Offset);
结果
我们得到了一个可以折叠的箭头,但却打不开,它没有包含子节点。可以看出,Unity中把Vector2的两个变量x、y当作了子节点处理。
那么
- EditorGUILayout.PropertyField(Offset,true);
我们再来看看Vector3
- EditorGUILayout.PropertyField(Vector2Text);
如果我们想要一个vector2怎么办可以通过EditorGUILayout.Vector2Field方法实现
- Offset.vector2Value = EditorGUILayout.Vector2Field("Pixel Offset", Offset.vector2Value, MarginTypeWidth);
我们再做稍稍复杂的尝试
假设我们需要描画一组水平组合的UI,先试试Vector3
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.PropertyField(Vector2Text, GUIContent.none,MarginTypeWidth);
- EditorGUILayout.PropertyField(MarginType, GUIContent.none, LabelWidth);
- EditorGUILayout.EndHorizontal();
再试试Vector2
- EditorGUILayout.BeginHorizontal();
- Offset.vector2Value = EditorGUILayout.Vector2Field("Pixel Offset", Offset.vector2Value);
- EditorGUILayout.PropertyField(MarginType, GUIContent.none, LabelWidth);
- EditorGUILayout.EndHorizontal();
最后来试试Vector4是什么样子的
- EditorGUILayout.PropertyField(Vector4Text,true);
很不幸,和Vector2一样。搞不懂这是为啥。
本来只是想做一个用来定义UI控件相对屏幕定位坐标的UI,结果最后只能做成
介个样子。
还有一个很郁闷的
这是一个关于Size的定义框。
其实放在一个行内即可。问题是一个行内的格式却是
代码如下
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.PropertyField(Size.FindPropertyRelative("Width"));
- EditorGUILayout.PropertyField(Size.FindPropertyRelative("Height"));
- EditorGUILayout.EndHorizontal();
尝试添加宽度定义
- private static GUILayoutOption SizeWidth = GUILayout.MaxWidth(80f);
- ……
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.PropertyField(Size.FindPropertyRelative("Width"), SizeWidth);
- EditorGUILayout.PropertyField(Size.FindPropertyRelative("Height"), SizeWidth);
- EditorGUILayout.EndHorizontal();
彻底乱了。
很郁闷的发现,前面的标签,宽度不能完美的随着控件整体的宽度定义变化而变化。虽然可以隐藏前面的标签自己添加,但数值类型的编辑框,其标签带有拖拽功能,这个是自己添加的标签没有的,所以只能郁闷使用两行的样子了。
以上这些,虽然和技术本身无关,但用户体验上,同类的数据或者行为,其表现应该一致或接近。Unity显然没有做到,而且对于一些常见的情况,Unity甚至没有做出很好的考虑,直接排版出错了。很显然,Uinty还有很多细节需要完善。