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;
}												
											Unity编辑器 - 自动排版的更多相关文章
- Unity脚本自动添加注释脚本及排版格式
		
Unity脚本自动添加注释脚本及头部注释排版格式 公司开发项目,需要声明版权所有,,,,标注公司名,作者,时间,项目名称及描述等等. 自己总结实现的现成脚本及头部注释排版文本,添加到模版即可. 文件不 ...
 - CKEditor扩展插件:自动排版功能
		
CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站. 如果还没接触过的可以看看, ...
 - 【Unity优化】如何实现Unity编辑器中的协程
		
Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...
 - 【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理
		
一.简介 最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用.其实,在这款触发器编辑器之 ...
 - Android Studio自动排版的两种方法
		
Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ...
 - 【Unity】2.1 初识Unity编辑器
		
分类:Unity.C#.VS2015 创建日期:2016-03-26 一.简介 本节要点:了解Unity编辑器的菜单和视图界面,以及最基本的操作,这是入门的最基础部分,必须掌握. 二.启动界面 双击桌 ...
 - 转载unity编辑器xml数据库插件
		
unity编辑器xml数据库插件 注:9月9日更新,其中MyXML.cs中有一句代码写错,查找功能失误,文中已经修改! 注:9月1日更新说明:xml存储结构,因为在用xml之前不知道正规的xml数据结 ...
 - [Unity] 编辑器运行中动态编译执行C#代码
		
(一)问题 之前写Lua时,修改完代码 reload 就可以热重载代码,调试起来十分方便(重构则十分痛苦). 现在使用 C# 做开发,目前还没找到比较方便地进行热重载的方式.只能退而求其次,在调试上找 ...
 - eclipse自动排版JSP问题
		
eclipse自动排版JSP非常难看,标签每行显示不完整,开发时很难受,下面设置一下这个就好多了: window-->preferences-->Web-->HTML Files-- ...
 
随机推荐
- git忽略文件留存
			
##ignore this file##/target/ .classpath.project.settings /.settings/ ##filter databfile.sln file##*. ...
 - RabbitMQ之五种消息模型
			
首先什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者.消费者模型.生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步的,而 ...
 - 第27章 LTDC/DMA2D—液晶显示
			
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板 ...
 - 用java集合模拟登录和注册功能
			
package com.linkage.login; import java.util.HashMap;import java.util.Iterator;import java.util.Map;i ...
 - Linux中文件函数(一)
			
一.stat.fstat.fstatat.lstat函数 函数的原型为: #include <sys/stat.h> int stat(const char *restrict pathn ...
 - Archlinux下安装微信小程序开发工具
			
由于微信小程序没有Linux版本,所以需要用wine来跑 一.安装wine sudo pacman -S wine 二.安装nwjs-sdk 微信开发工具包基于nwjs-sdk #没有wget就先安装 ...
 - layer 刷新某个页面
			
一:使用layer.open打开的子页面 window.parent.location.reload()//刷新父页面 var index = parent.layer.getFrameIndex(w ...
 - mysql8.0.11的坑早知道
			
1.plugin caching_sha2_password could not be loaded 我在mac上用Sequel Pro连数据库的时候,会报出以上错误,这是应为8.0.11把身份认证插 ...
 - java的值传递机制
			
一.练习:编写Java程序,将二维数组中的行列互调显示出来. 代码1为自己编写: package com.xxgpra.CH6; public class Hangliehudiao_pra4 { p ...
 - pyhton新手学习之增删改查
			
一 .列表的定义 1.列表的定义 names = [ "xiajiqni", "test", "wangwu","oldb ...