🏈

编辑器控件自适应

之前已经尝试分析 EditorGUILayoutEditorGUI 两个类的区别和适用情况。但在实际代码中可以发现几个问题:

如何自适应

通过 Unity 提供的内部方法或者开发者自行实现,控件的自适应可以有很多种实现方式。以如何扩展出网格样式为例:

上述实现方法各有特点:

手动实现利用了 EditorGUIGUI 类的灵活性,只要计算好网格中每个按钮的具体位置,然后传入对应的方法中,就可以实现各种样式。但是布局和样式有可能多变而且不具规律性,所以需要考虑并计算多种情况下的位置和尺寸,往往会导致代码规模变大,而且各种数字使得代码的可读性和可维护性变差。

为了提高手动实现的效率和代码的质量,可以考虑维护一些全局的变量和方法,自动计算下一个控件的位置和尺寸。个人认为自动布局的 GUILayout 类就是这么处理的。

EditorGUILayoutGUILayout 则是已经计算好了各个按钮的位置和尺寸,只需代码简单定义绘制的样式即可。可以看出,EditorGUILayoutGUILayout 默认是不会在垂直方向上填充整个窗口的,每个按钮都有固定的高度(除非通过代码明确修改其高度)。另外,按钮还有一个固定的最小宽度,一般会保证内部的文本都可以显示,如果窗口过于窄,部分按钮就会被截断。

SelectionGrid 则是已经封装好的专门绘制网格的方法,最少只需要传入两个参数:显示在按钮中的 GUIContent 数组,和网格中每一行显示多少个按钮。SelectionGrid 生成的窗口效果和 GUILayout 一样,只是不具有固定的最小宽度,会讲所有按钮都显示在窗口中,即使文本有所扭曲。

如何选择

以往的例子中,EditorGUILayoutEditorGUIGUILayoutGUI 交替出现,究竟是否存在一个明确的取舍,即什么时候选用哪个类更合适。笔者认为这是一个误区,从开发工具的角度上说,更应该从需求的角度思考,也就是只要可以达成目标,没有必要说必须使用哪一个类,开发者可以进行各种尝试,然后按照需要选择一个最合适的。

不过根据名字和经验,我们可以得出一些大致上的结论: