Unity编辑器 - 自动排版
使用花括号提高可读性
//一组横向排列的控件
GUILayout.BeginHorizontal();
{
GUILayout.BeginVertical();
{
//横向排列中的第一组竖向控件
}
GUILayout.EndVertical();
GUILayout.BeginVertical();
{
//横向排列中的第二组竖向控件
}
GUILayout.EndVertical();
}
GUILayout.EndHorizontal();
1 一定要这样写的,不然改的痛不欲生。。
2 把冗长的代码按排版区域拆分成模块
坑爹的GUILayoutUtility.GetRect()和GUILayout.BeginArea()
在组织排版和需要实现交互操作时,需要获取控件的Rect,这时候使用GUILayoutUtility.GetRect()比较方便。
然而这里有两点要特别注意:
- 在Event.current.type == EventType.Layout时:
GUILayoutUtility.GetRect() = Rect(0, 0, 1, 1);
- GUILayoutUtility.GetRect()不能给BeginArea使用,因为GUILayout.BeginArea必须在Layout事件时传入正确的Rect,与GUILayoutUtility.GetRect()的结果有冲突:
private void OnGUI() {
Rect r1 = GUILayoutUtility.GetRect(300, 200);
LogRectTest(r1, "r1");
//GUILayout.BeginArea(r1, "错误用法", EditorStyles.helpBox); //错误用法, 区域大小会变成(0,0,1,1)!!!
GUILayout.BeginArea(new Rect(0, 0, 300, 50), "正确用法", EditorStyles.helpBox);//正确用法
{
Rect r2 = GUILayoutUtility.GetRect(GUIContent.none, EditorStyles.label);
var e = Event.current;
ctrlid = GUIUtility.GetControlID(FocusType.Passive);
switch (e.GetTypeForControl(ctrlid)) {
case EventType.MouseDown:
LogRectTest(r2, "r2");
break;
}
}
GUILayout.EndArea();
}
正确效果:
错误效果
小结
- 少用嵌套自动排版,手动计算区域
- 自适应窗口,按区域拆分模块,并且手动算每个区域的Rect
- 在已知区域内,使用BeginArea自动排版
例如:
private Rect listViewRect;
private Rect nameInfoRect;
private Rect EquipInfoRect;
private void OnGUI() {
ComputeRect();//计算区域
DrawListView(listViewRect);//在已知区域内自动排版
DrawNameInfo(nameInfoRect);
DrawEquipInfo(EquipInfoRect);
}
private void DrawEquipInfo(Rect equipInfoRect) {
GUILayout.BeginArea(equipInfoRect);
{
//GUILayout...
}
GUILayout.EndArea();
}
private void DrawNameInfo(Rect nameInfoRect) {
GUILayout.BeginArea(nameInfoRect);
{
//GUILayout...
}
GUILayout.EndArea();
}
private void DrawListView(Rect listViewRect) {
GUILayout.BeginArea(listViewRect);
{
//GUILayout...
}
GUILayout.EndArea();
}
private void ComputeRect() {
listViewRect = this.position;
listViewRect.position = Vector2.zero;
listViewRect.width = 150f;
nameInfoRect = this.position;
nameInfoRect.x += 150f + 1f;
nameInfoRect.width -= 150f + 1f;
nameInfoRect.height = 50f;
EquipInfoRect = nameInfoRect;
EquipInfoRect.y = nameInfoRect.height + 1f;
EquipInfoRect.height = this.position.height - nameInfoRect.height;
EquipInfoRect.width = this.position.width - 151f;
}