文章目录

  • 自动布局和固定布局交叉使用
    • 预留布局位置——`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("我是下一个控件");

通过反编译来取证

  • 我一开始怀疑GetControlRectGetRect函数内部调用了相同的函数
  • 所以我就通过反编译(使用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 编辑器 混合使用固定布局和自动布局(二)相关推荐

  1. Unity编辑器知识

    Unity编辑器知识 一.新建项目 二.界面布局 1)工具栏 2)菜单栏 三.视图 1)Project视图 2)Hierarchy视图 3)Inspector视图 4)Scene视图 5)Game视图 ...

  2. unity2d游戏开发系列教程:二、新建工程并熟悉Unity编辑器常用功能

    目录 unity2d游戏开发系列教程:一.环境安装 第一步.打开项目 耐心等待一小会 工程界面 第二步.创建第一个场景(第一关)进行试玩 点击图中标号1的运行按钮,即可简单试玩感受,操作如下 移动A, ...

  3. 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )

    文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...

  4. 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

    书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...

  5. Unity面试题加强版之二《unity编辑器基础》

    Unity面试题加强版之二Unity编辑器基础 unity超全面试题,掌握轻轻松松拿Offer,码住学习 40.请描述游戏动画有几种,以及其原理. 主要有关节动画.单一网格模型动画(关键帧动画).骨骼 ...

  6. Unity编辑器UnityEditor基础(二)

    Unity编辑器UnityEditor基础(二) 终极目标 利用学到的东西制作自己的工具(自定义的窗口.Inspector.菜单.插件等等). 准备工作 还是使用上一篇的 Unity 工程,然后在 S ...

  7. 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用

    [Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...

  8. unity编辑器详细介绍

    你好!欢迎来到UNITY(2021)世界,这里将会详细为您介绍UNITY基本操作工具! 目录 一.工具栏 二.菜单栏 1.File(文件)菜单 2.Edit(编辑)菜单 3.Assets(资源)菜单 ...

  9. 基于Unity编辑器开发技能编辑器(一)

    编辑器拓展介绍 常见的Unity编辑器拓展使用主要是创建自定义的窗体进行使用,包括剧情编辑器,动画编辑器,技能编辑器等等.最常使用的就是 EditorGUI,EditorGUILayout,GUI. ...

  10. Unity 初识:认识Unity编辑器

    常用工作视图 场景视图(Scene View): 用于设置场景以及放置游戏对象,是构造游戏场景的地方,用户可以在这个视图中对游戏对象进行操作. 旋转:Alt+左键 移动:按住滚轮键/Q键 缩放:滚轮键 ...

最新文章

  1. linux qt creator git,Building Qt Creator from Git/zh
  2. linux常用命令:wget 命令
  3. 2020年12月份学习总结,PMP与信息系统项目管理师的回顾
  4. Leetcode之仅仅反转字母
  5. activemq消息持久化_ActiveMQ 5.x中的消息持久性
  6. JAVA 测试日期的不同显示格式
  7. java 安全认证_restful安全认证
  8. php 封装的调试方法,关于php面向的特性之封装
  9. 无人驾驶虚拟仿真(十五)--障碍物检测与识别1
  10. 时空序列预测模型之PredRNN(用ST-LSTM的预测学习循环神经网络)
  11. python的pth打开方式_python .pth 文件 和 site 模块
  12. circos 作图简介
  13. 《MySQL DBA修炼之道》——1.3 查询执行过程概述
  14. 短视频源码APP开发——短视频的功能
  15. pandas 的基本使用
  16. 小米蓝牙温度计2接入home assistant
  17. 组件化、模块化、Composing Builds
  18. unix/linux io监控
  19. 正则化,岭回归Shrinkage,lasso稀疏性推导和论文总结
  20. 网络封包截取工具Charles

热门文章

  1. OpenCV waitKey 无法正常捕捉方向键(上下左右),总结和解决方案,可以用waitKeyEx...
  2. Dynamics CRM - 使用 JavaScript 操作 Business Process Flow
  3. Django模板语言(DTL)
  4. Microsoft.Office.Interop.Excel 报错
  5. Chapter eight Data Structure(数据结构)
  6. js中map和python中的map
  7. 刪除主表中不存在記錄的從表資料
  8. web安全day33:人人都要懂的LNMP--nginx的配置和文件理解
  9. 解决CocosCreator2.3.1使用VideoPlayer加载视频黑屏问题(修改底层代码)
  10. KVM详解(一)——KVM基础知识