行为怪异的Unity编辑器类 EditorGUILayout

 
分类: Unity3D   2410人阅读  评论(0)  收藏  举报

EditorGUILayout 是Unity3D 中用于描绘Inspector类型的编辑器界面的类。提供了一组十分方便实用的方法。

但不知道为什么,Unity却没有把它做好,让他的行为十分怪异。

我们可以做以下实验

建立一个Vector2类型的属性,通过EditorGUILayout.PropertyField来描画

[csharp]  view plain copy print ?
  1. EditorGUILayout.PropertyField(Offset);  

结果 

我们得到了一个可以折叠的箭头,但却打不开,它没有包含子节点。可以看出,Unity中把Vector2的两个变量x、y当作了子节点处理。

那么

[csharp]  view plain copy print ?
  1. EditorGUILayout.PropertyField(Offset,true);  
这样我们就描画了它的子节点


我们再来看看Vector3

[csharp]  view plain copy print ?
  1. EditorGUILayout.PropertyField(Vector2Text);  
结果如下,可以看出vector的排版很好,这个才是我们需要的。经过试验,发现,无论是否指定显示子节点,其格式都是一样的。


如果我们想要一个vector2怎么办可以通过EditorGUILayout.Vector2Field方法实现

[csharp]  view plain copy print ?
  1. Offset.vector2Value = EditorGUILayout.Vector2Field("Pixel Offset", Offset.vector2Value, MarginTypeWidth);  


我们再做稍稍复杂的尝试

假设我们需要描画一组水平组合的UI,先试试Vector3

[html]  view plain copy print ?
  1. EditorGUILayout.BeginHorizontal();  
  2. EditorGUILayout.PropertyField(Vector2Text, GUIContent.none,MarginTypeWidth);  
  3. EditorGUILayout.PropertyField(MarginType, GUIContent.none, LabelWidth);  
  4. EditorGUILayout.EndHorizontal();  
我们得到了想要的样式,一个Vector3和一个枚举的单选List


再试试Vector2

[csharp]  view plain copy print ?
  1. EditorGUILayout.BeginHorizontal();  
  2. Offset.vector2Value = EditorGUILayout.Vector2Field("Pixel Offset", Offset.vector2Value);  
  3. EditorGUILayout.PropertyField(MarginType, GUIContent.none, LabelWidth);  
  4. EditorGUILayout.EndHorizontal();  
结果却是这个样子,因为使用EditorGUILayout.Vector2Field不能使用GUIContent.none来定义空标签,结果就杯具了。而且我暂时没找到解决办法。



最后来试试Vector4是什么样子的

[csharp]  view plain copy print ?
  1. EditorGUILayout.PropertyField(Vector4Text,true);  

很不幸,和Vector2一样。搞不懂这是为啥。


本来只是想做一个用来定义UI控件相对屏幕定位坐标的UI,结果最后只能做成

介个样子。


还有一个很郁闷的

这是一个关于Size的定义框。

其实放在一个行内即可。问题是一个行内的格式却是


代码如下

[csharp]  view plain copy print ?
  1. EditorGUILayout.BeginHorizontal();  
  2. EditorGUILayout.PropertyField(Size.FindPropertyRelative("Width"));  
  3. EditorGUILayout.PropertyField(Size.FindPropertyRelative("Height"));  
  4. EditorGUILayout.EndHorizontal();  

尝试添加宽度定义

[html]  view plain copy print ?
  1. private static GUILayoutOption  SizeWidth = GUILayout.MaxWidth(80f);  
  2.   
  3. ……  
  4.   
  5. EditorGUILayout.BeginHorizontal();  
  6. EditorGUILayout.PropertyField(Size.FindPropertyRelative("Width"), SizeWidth);  
  7. EditorGUILayout.PropertyField(Size.FindPropertyRelative("Height"), SizeWidth);  
  8. EditorGUILayout.EndHorizontal();  
结果

彻底乱了。

很郁闷的发现,前面的标签,宽度不能完美的随着控件整体的宽度定义变化而变化。虽然可以隐藏前面的标签自己添加,但数值类型的编辑框,其标签带有拖拽功能,这个是自己添加的标签没有的,所以只能郁闷使用两行的样子了。

以上这些,虽然和技术本身无关,但用户体验上,同类的数据或者行为,其表现应该一致或接近。Unity显然没有做到,而且对于一些常见的情况,Unity甚至没有做出很好的考虑,直接排版出错了。很显然,Uinty还有很多细节需要完善。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值