unity 编辑器 混合使用固定布局和自动布局(二)
文章目录
- 自动布局和固定布局交叉使用
- 预留布局位置——`GetRect|GetControlRect`
- 通过反编译来取证
- 获取上一个控件的rect位置——`GetLastRect`
- 使用案例
- 两个接口在绘制背景时候的使用
- 在绘制同一行的时候使用
自动布局和固定布局交叉使用
预留布局位置——GetRect|GetControlRect
- 这也是我经常会遇到的问题,我想把自动布局和固定布局交替使用,所以需要获取
rect
数据 - 需要注意的是,
GetRect
函数本身就是预留空间,无论你是否在该空间绘制东西,这片空间都会占用
Rect rect = GUILayoutUtility.GetRect(10, EditorGUIUtility.singleLineHeight*5);GUILayout.Button("我是下面的控件", GUILayout.Width(100), GUILayout.Height(100));
- 可以看到,这片空间是空着的,接下来绘制的
button
按钮也是在其后的
GetControlRect
和他的作用差不多
var rect = EditorGUILayout.GetControlRect(GUILayout.height(50));GUILayout.Button("我是下一个控件");
通过反编译来取证
- 我一开始怀疑
GetControlRect
和GetRect
函数内部调用了相同的函数 - 所以我就通过反编译(使用DnSpy)
UnityEditor.dll
发现果然如此 - 结果如下
- 可以看到
GetControlRect
函数内部还是调用了GUILayoutUtility.GetRect
GUILayout.GetRect()
函数内部又调用了自身的DoGetRect
- 可以看到
DoGetRect
本身是一个私有方法,没有暴露出来。所以我们没法使用
获取上一个控件的rect位置——GetLastRect
- 这个接口也是经常使用的一个,代码如下
GUILayout.Button("My button");if (Event.current.type == EventType.Repaint &&GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)){GUILayout.Label("Mouse over!");}else{GUILayout.Label("Mouse somewhere else");}
- 可以看到,当鼠标移动到
MyButton
按钮区域的时候,下方的字体就会显示为MouseOver
使用案例
两个接口在绘制背景时候的使用
- 因为绘制背景需要重叠绘制,即一个控件绘制背景,另一个要绘制在它上面,所以我们无可避免的要使用上面两个接口
- 有时候需要在自动布局的时候,绘制背景,就可以使用上面两个接口
- 第一种方法,首先使用
GetLastRect
获得上个自动布局控件的位置,然后计算下一个控件的位置,用GUI
绘制的控件,不会占据GUILayout
绘制的位置,所以可以重叠,实现背景
var lastRect = GUILayoutUtility.GetLastRect();//额外+2是因为我发现自动布局的控件在y轴上都有很细微的间隙,导致button和背景无法完全重叠var newLastRect = new Vector2(lastRect.x, lastRect.y + lastRect.height+2);EditorGUI.DrawRect(new Rect(newLastRect, new Vector2(lastRect.width, 30)), Color.green);//新建style也是这个原因,需要把外边距全部设置为0,才能让button和背景起始点全部重合GUILayout.Button("我是下面的控件", new GUIStyle("button") { margin = new RectOffset(0, 0, 0, 0) }, GUILayout.Width(100), GUILayout.Height(30));
- 可以看到我绘制的绿色背景
- 第二种方法,其实和第一种差不多,只不过他是用
GetRect
函数来计算获得下一个控件的位置,相当于把我GetLastRect+height
这一步省略了,代码如下
//注意 我这里本来想省略为 GUILayoutUtility.GetRect(0,height);//但是会导致问题,GetRect是用来保留空间的,我们保留一个宽高为0的空间,//然后再改变rect的height不会占用高度空间//但是一开始就在GetRect里面分配这个高度,就会影响后续的绘制,无法达到背景的效果Rect rect = GUILayoutUtility.GetRect(0, 0).ResizeHeight(height);GUI.Box(rect, "",EditorStyles.textArea);
- 如果把代码改成
GUILayoutUtility.GetRect(0,height)
就会变成下面情况,高度占用了空间
在绘制同一行的时候使用
GUILayout.BeginHorizontal();GUILayout.Label("我是第一个位置",GUILayout.ExpandWidth(false));var rect = EditorGUILayout.GetControlRect();//也可以使用下面的函数//var rect = GUILayoutUtility.GetRect(0,18);GUILayout.Button("我是第三个");GUI.Button(rect, new GUIContent("我是下一个"));GUILayout.EndHorizontal();
- 可以看到,即使在同一行中,使用这个函数同样有效
- 另外我想说
- 如果你不指明控件的宽度和高度,他会自动使用
EditorGUIUtility.singleLineHeight
,这个高度就是18,而宽度则会默认取尽可能扩展的宽度
GetControlRect()== GUILayoutUtility.GetRect(0,18);
unity 编辑器 混合使用固定布局和自动布局(二)相关推荐
- Unity编辑器知识
Unity编辑器知识 一.新建项目 二.界面布局 1)工具栏 2)菜单栏 三.视图 1)Project视图 2)Hierarchy视图 3)Inspector视图 4)Scene视图 5)Game视图 ...
- unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能
目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...
- 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )
文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...
- 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出
书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...
- Unity面试题加强版之二《unity编辑器基础》
Unity面试题加强版之二Unity编辑器基础 unity超全面试题,掌握轻轻松松拿Offer,码住学习 40.请描述游戏动画有几种,以及其原理. 主要有关节动画.单一网格模型动画(关键帧动画).骨骼 ...
- Unity编辑器UnityEditor基础(二)
Unity编辑器UnityEditor基础(二) 终极目标 利用学到的东西制作自己的工具(自定义的窗口.Inspector.菜单.插件等等). 准备工作 还是使用上一篇的 Unity 工程,然后在 S ...
- 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用
[Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...
- unity编辑器详细介绍
你好!欢迎来到UNITY(2021)世界,这里将会详细为您介绍UNITY基本操作工具! 目录 一.工具栏 二.菜单栏 1.File(文件)菜单 2.Edit(编辑)菜单 3.Assets(资源)菜单 ...
- 基于Unity编辑器开发技能编辑器(一)
编辑器拓展介绍 常见的Unity编辑器拓展使用主要是创建自定义的窗体进行使用,包括剧情编辑器,动画编辑器,技能编辑器等等.最常使用的就是 EditorGUI,EditorGUILayout,GUI. ...
- Unity 初识:认识Unity编辑器
常用工作视图 场景视图(Scene View): 用于设置场景以及放置游戏对象,是构造游戏场景的地方,用户可以在这个视图中对游戏对象进行操作. 旋转:Alt+左键 移动:按住滚轮键/Q键 缩放:滚轮键 ...
最新文章
- linux qt creator git,Building Qt Creator from Git/zh
- linux常用命令:wget 命令
- 2020年12月份学习总结,PMP与信息系统项目管理师的回顾
- Leetcode之仅仅反转字母
- activemq消息持久化_ActiveMQ 5.x中的消息持久性
- JAVA 测试日期的不同显示格式
- java 安全认证_restful安全认证
- php 封装的调试方法,关于php面向的特性之封装
- 无人驾驶虚拟仿真(十五)--障碍物检测与识别1
- 时空序列预测模型之PredRNN(用ST-LSTM的预测学习循环神经网络)
- python的pth打开方式_python .pth 文件 和 site 模块
- circos 作图简介
- 《MySQL DBA修炼之道》——1.3 查询执行过程概述
- 短视频源码APP开发——短视频的功能
- pandas 的基本使用
- 小米蓝牙温度计2接入home assistant
- 组件化、模块化、Composing Builds
- unix/linux io监控
- 正则化,岭回归Shrinkage,lasso稀疏性推导和论文总结
- 网络封包截取工具Charles
热门文章
- OpenCV waitKey 无法正常捕捉方向键(上下左右),总结和解决方案,可以用waitKeyEx...
- Dynamics CRM - 使用 JavaScript 操作 Business Process Flow
- Django模板语言(DTL)
- Microsoft.Office.Interop.Excel 报错
- Chapter eight Data Structure(数据结构)
- js中map和python中的map
- 刪除主表中不存在記錄的從表資料
- web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
- 解决CocosCreator2.3.1使用VideoPlayer加载视频黑屏问题(修改底层代码)
- KVM详解(一)——KVM基础知识