下文主要探讨一些Unity IMGUI中自己遇到的一些坑点

Last Edit: 2020.10.15

Language: C#


IMGUI

首先看一下官方文档介绍:Unity IMGUI
刚刚入门UI,看了一下网上的很多教程,个人认为学习UI模块,看Unity Manual和tutorials学习效率会比较高,能Get到的点也比较全面。
由于OnGUI()是运行时每帧执行,所以也就限定了IMGUI的周期只能在运行时;

目前还没有总结出IMGUI的具体使用场景,待后续跟进------


复合控件

复合控件按我的理解就是控件的嵌套;

一般使用单个控件的时候我们大致会使用下面这种格式:

/* GUI.Label example */using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour
{void OnGUI () {GUI.Label (new Rect (25, 25, 100, 30), "Label");}}

或者

/* GUI.Button example */using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour
{void OnGUI () {if (GUI.Button (new Rect (25, 25, 100, 30), "Button")) {// This code is executed when the Button is clicked}}}

因为GUI.Button()是要返回一个Boolean值的,所以可以直接嵌入if()(很佩服这个代码的设计)

而复合控件就是把两个函数合并到一个里:

// C#
using UnityEngine;
using System.Collections;public class GUITest : MonoBehaviour {private float mySlider = 1.0f;void OnGUI () {mySlider = LabelSlider (new Rect (10, 100, 100, 20), mySlider, 5.0f, "Label text here");}//OnGUI()//Compound Controls belowfloat LabelSlider (Rect screenRect, float sliderValue, float sliderMaxValue, string labelText) {GUI.Label (screenRect, labelText);// <- 将 Slider 推到 Label 的末尾screenRect.x += screenRect.width; sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0f, sliderMaxValue);return sliderValue;}}

这样的话突兀的滑动条就被“打包”成了一个带String Label的“高级”滑动条了,简洁实用!

再来说说我的坑点吧:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
using Image = UnityEngine.UI.Image;public class ShowOnScreen : MonoBehaviour
{// import img from the Inspectorpublic  Image img;public Color myColor;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// Change the RGB value of the img.colorimg.color = new Color(myColor.r, myColor.g, myColor.b);}private void OnGUI(){   //  color SildermyColor = RgbSlider(myColor, new Rect(30, 300, 250, 50));}//Double nesting, a bit complicatedpublic static Color RgbSlider(Color rgb, Rect rgbRect){rgb.r = LableSlider(rgbRect, rgb.r, 1.0f, "Red");rgbSliderRect.y += rgbRect.height;     rgb.g = LableSlider(rgbRect, rgb.g, 1.0f, "Green");rgbSliderRect.y += rgbRect.height;    rgb.b = LableSlider(rgbRect, rgb.b, 1.0f, "Blue");return rgb;}public static float LableSlider(Rect labelRect, float sliderValue, float sliderValueMax, string lableName){GUI.Label(labelRect, lableName);labelRect.x += labelRect.width;GUI.HorizontalSlider(labelRect, sliderValue, 0.0f,sliderValueMax);return sliderValue;}
}

乍一看结构清晰,嵌套的也很完美,一运行就GG!


可视效果是有了,但是交互性就仅仅点击handle的时候有反馈(类似于Button),并不能实时拖动handle,重新检查发现代码逻辑结构也没有问题。
于是我又重写了脚本(为了排除问题我还去掉了public static的修饰),运行,滑动条可以动了!

比对代码,终于发现了问题:

float LableSlider(Rect screenRect, float sliderValue, float sliderValueMax, string lableName){GUI.Label(screenRect, lableName);screenRect.x += screenRect.width;//  Missing "sliderValue = "sliderValue = GUI.HorizontalSlider(screenRect, sliderValue, 0.0f,sliderValueMax);return sliderValue;}

其实在潜意识里这个GUI.***应该是一个无返回值、只包含创建控件操作的函数,所以按照这个逻辑,再加上上面使用GUI.Label()时也不需要返回值,我在写滑动条函数的时候也漏掉了返回值(没有返回值当然就不能将值传出,更不能实时交互了!)
所以总结一下,交互性是和返回值挂钩的,这也是这种复合嵌套的内在联系。

后续在UI中遇到其他问题会即时更新。

Unity IMGUI之避坑排雷相关推荐

  1. 树莓派+双麦克风扩展板实现snowboy热词唤醒(避坑排雷)

    硬件准备: 树莓派4b x1 树莓派双麦克风扩展板(或者4mics 8mics都可以) x1 任意一个支持树莓派的音频输出设备(3.5mm孔的 或者一些蓝牙设备) 本文最终要实现的就是对着麦克说你的唤 ...

  2. MySql 之 left join 避坑指南

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:MageekChiu https://segmentfaul ...

  3. MySQL:left join 避坑指南

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:MageekChiu segmentfault.com/a/ ...

  4. 新人赛《金融风控贷款违约》避坑指南!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陶旭东,北京师范大学,Datawhale成员 一.背景介绍 本文以 ...

  5. Linux重定向和管道符使用避坑指南

    本文就分享一下我在实践中使用重定向和管道符遇到的一些坑,搞明白一些底层原理,写脚本的效率能提升不少. 我很喜欢 Linux 系统,尤其是 Linux 的一些设计很漂亮,比如可以将一些复杂的问题分解成若 ...

  6. 完美避坑!记一次Elasticsearch集群迁移架构实战

    作者介绍 李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发.架构.运维等方面有深入体验,实践 ...

  7. 医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理

    医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理 讲解视频内容请移步Bilibili: https://space.bilibili.com/542601735 入群讨论请加v ho ...

  8. 17条避坑指南:一份来自谷歌的数据库经验贴

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://medium.com/@rak ...

  9. 怎么把原来的墙拆掉_电视墙避坑指南要收好!拆掉重装太心累...

    电视墙是家里装修最为重要的一个地方. 相信很多人都想要把电视墙装修得简单又大气,而且还是容易搞卫生的整洁类型~但是,电视墙贴砖过程中,有很多坑需要注意,一不小心就要像下面的业主一样,拆掉重装. 业主反 ...

最新文章

  1. 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!...
  2. 中文.TW台湾域名首度向大陆开放
  3. 用时间换才华:李开复给创业者的7条时间管理建议 【转载】
  4. 转: jdbc连接数据库需要注意和出错的地方
  5. 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
  6. python对操作系统的目录和文件操作
  7. centos7安装MySQL 5.7
  8. 伪静态php空间,Win空间上如何实现WordPress博客的完美伪静态
  9. 免费创建GOOGLE共享网盘
  10. z反变换计算机控制,计算机控制4.Z变换.ppt
  11. 不入世的天才: 尼古拉·特斯拉
  12. 【BZOJ】【P3110】【Zjoi2013】【K大数查询】【题解】【整体二分】
  13. 震动活塞式柱状取样器的使用
  14. 在线 Python运行工具
  15. 全国计算机缴费时间江苏,2018年3月江苏全国计算机等级考试报名时间
  16. 【车牌识别】模板匹配车牌库识别【含GUI Matlab源码 416期】
  17. centos7查看进程ps_centos如何查看进程
  18. 星起航:短视频内容的流量迸发让电商渠道看到了新的趋势
  19. 键盘研究:按键,键码,键符号
  20. 网段、网络地址、广播地址、子网掩码的计算方法

热门文章

  1. 凌吾修复代挂网全新界面源码
  2. 商业图表软件--SmartDraw 7
  3. Aed电子文档与无纸化办公
  4. 大数据分析师的就业前景如何?
  5. wireshark抓tcp三次握手四次挥手包
  6. dell服务器增加磁盘阵列,Dell PowerEdge服务器如何通过联机容量扩充的方式实现磁盘阵列扩容?...
  7. 分析论坛数据库设计分析
  8. 金融财务工作汇报PPT模板
  9. php websocket udp,swoole创建websocket服务并且支持https服务,同时监听tcp,udp端口
  10. 工具分享:eclipse-java-2019-09版windows64位正版最新(附下载链接)