Unity编辑器 - 自动排版

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;
}

猜你喜欢

转载自blog.csdn.net/ltycloud/article/details/79291564