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编辑器 - 自动排版的更多相关文章

  1. Unity脚本自动添加注释脚本及排版格式

    Unity脚本自动添加注释脚本及头部注释排版格式 公司开发项目,需要声明版权所有,,,,标注公司名,作者,时间,项目名称及描述等等. 自己总结实现的现成脚本及头部注释排版文本,添加到模版即可. 文件不 ...

  2. CKEditor扩展插件:自动排版功能

    CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站. 如果还没接触过的可以看看, ...

  3. 【Unity优化】如何实现Unity编辑器中的协程

    Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...

  4. 【Unity编辑器】UnityEditor多重弹出窗体与编辑器窗口层级管理

    一.简介 最近马三为公司开发了一款触发器编辑器,对于这个编辑器策划所要求的质量很高,是模仿暴雪的那个触发器编辑器来做的,而且之后这款编辑器要作为公司内部的一个通用工具链使用.其实,在这款触发器编辑器之 ...

  5. Android Studio自动排版的两种方法

    Android Studio这样的集成开发环境虽然代码自动化程度很高,但是自动化程度高导致人的自主性就下降了,而且总是依赖编辑器的功能也会搞得代码排版很别扭. 最难受的是你在Android Studi ...

  6. 【Unity】2.1 初识Unity编辑器

    分类:Unity.C#.VS2015 创建日期:2016-03-26 一.简介 本节要点:了解Unity编辑器的菜单和视图界面,以及最基本的操作,这是入门的最基础部分,必须掌握. 二.启动界面 双击桌 ...

  7. 转载unity编辑器xml数据库插件

    unity编辑器xml数据库插件 注:9月9日更新,其中MyXML.cs中有一句代码写错,查找功能失误,文中已经修改! 注:9月1日更新说明:xml存储结构,因为在用xml之前不知道正规的xml数据结 ...

  8. [Unity] 编辑器运行中动态编译执行C#代码

    (一)问题 之前写Lua时,修改完代码 reload 就可以热重载代码,调试起来十分方便(重构则十分痛苦). 现在使用 C# 做开发,目前还没找到比较方便地进行热重载的方式.只能退而求其次,在调试上找 ...

  9. eclipse自动排版JSP问题

    eclipse自动排版JSP非常难看,标签每行显示不完整,开发时很难受,下面设置一下这个就好多了: window-->preferences-->Web-->HTML Files-- ...

随机推荐

  1. Mac python3.5 + Selenium 开发环境配置

    一. python 3.5 1. 下载 2. Mac默认为2.7,所以这里主要介绍如何将系统Python默认修改为3.5. 原理: 1)Mac自带的python环境在: python2.7: /Sys ...

  2. 手工检测SQL注入(安全性测试)

    手动你的ASP站可否注入: http://127.0.0.1/xx?id=11 and 1=1 (正常页面) http://127.0.0.1/xx?id=11 and 1=2 (出错页面) 检测表段 ...

  3. Subnet Routing Examples

    Routing Table Each row in routing table contains: Destination IP address IP address of next-hop rout ...

  4. EF Core中如何通过实体集合属性删除从表的数据

    假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...

  5. Dynamic Ambient Occlusion and Indirect Lighting

    This sample was presented on the Nvida witesite, which detail a new idea to calculate the ambient oc ...

  6. iOS | NSProxy

    Objective-C作为一种动态消息型语言,其机制不同于Java ,C#等编译型语言. 它将数据类型的确定等工作推迟到了运行时期来执行,并且它调用方法的方式实质是像对象发送消息,根据selector ...

  7. OC录制小视频

    OC录制小视频 用 AVCaptureSession + AVCaptureMovieFileOutput 来录制视频,并通过AVAssetExportSeeion 手段来压缩视频并转换为 MP4 格 ...

  8. 【HDOJ 1285】确定比赛名次(拓扑排序+优先队列)

    Problem Description有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员 ...

  9. Windows远程常见问题

    1.window2003远程桌面“已达最大连接数”解决:1)mstsc /v:(此处为服务器IP) /console   任务管理器注销已断开用户 mstsc /v:192.168.4.3 /cons ...

  10. 【读书笔记 - Effective Java】05. 避免创建不必要的对象

    1. 如果对象是不可变的(immutable),它就始终可以被重用. (1) 特别是String类型的对象. String str1 = new String("str"); // ...