• 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;
    }
  • 相关阅读:
    Spring简介和基础
    el表达式
    Spring MVC 文件上传下载
    el表达式的function标签
    JSTL核心标签库使用
    基于注解的SpringMVC
    new一个Object对象占用多少内存?
    leetcode-第k个排列(Java和c++版)
    使用maven构建web项目(简易版)
    leetcode-电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/CloudLiu/p/10746069.html
Copyright © 2020-2023  润新知