Unity IMGUI之避坑排雷
下文主要探讨一些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之避坑排雷相关推荐
- 树莓派+双麦克风扩展板实现snowboy热词唤醒(避坑排雷)
硬件准备: 树莓派4b x1 树莓派双麦克风扩展板(或者4mics 8mics都可以) x1 任意一个支持树莓派的音频输出设备(3.5mm孔的 或者一些蓝牙设备) 本文最终要实现的就是对着麦克说你的唤 ...
- MySql 之 left join 避坑指南
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:MageekChiu https://segmentfaul ...
- MySQL:left join 避坑指南
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:MageekChiu segmentfault.com/a/ ...
- 新人赛《金融风控贷款违约》避坑指南!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陶旭东,北京师范大学,Datawhale成员 一.背景介绍 本文以 ...
- Linux重定向和管道符使用避坑指南
本文就分享一下我在实践中使用重定向和管道符遇到的一些坑,搞明白一些底层原理,写脚本的效率能提升不少. 我很喜欢 Linux 系统,尤其是 Linux 的一些设计很漂亮,比如可以将一些复杂的问题分解成若 ...
- 完美避坑!记一次Elasticsearch集群迁移架构实战
作者介绍 李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发.架构.运维等方面有深入体验,实践 ...
- 医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理
医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理 讲解视频内容请移步Bilibili: https://space.bilibili.com/542601735 入群讨论请加v ho ...
- 17条避坑指南:一份来自谷歌的数据库经验贴
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://medium.com/@rak ...
- 怎么把原来的墙拆掉_电视墙避坑指南要收好!拆掉重装太心累...
电视墙是家里装修最为重要的一个地方. 相信很多人都想要把电视墙装修得简单又大气,而且还是容易搞卫生的整洁类型~但是,电视墙贴砖过程中,有很多坑需要注意,一不小心就要像下面的业主一样,拆掉重装. 业主反 ...
最新文章
- 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!...
- 中文.TW台湾域名首度向大陆开放
- 用时间换才华:李开复给创业者的7条时间管理建议 【转载】
- 转: jdbc连接数据库需要注意和出错的地方
- 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
- python对操作系统的目录和文件操作
- centos7安装MySQL 5.7
- 伪静态php空间,Win空间上如何实现WordPress博客的完美伪静态
- 免费创建GOOGLE共享网盘
- z反变换计算机控制,计算机控制4.Z变换.ppt
- 不入世的天才: 尼古拉·特斯拉
- 【BZOJ】【P3110】【Zjoi2013】【K大数查询】【题解】【整体二分】
- 震动活塞式柱状取样器的使用
- 在线 Python运行工具
- 全国计算机缴费时间江苏,2018年3月江苏全国计算机等级考试报名时间
- 【车牌识别】模板匹配车牌库识别【含GUI Matlab源码 416期】
- centos7查看进程ps_centos如何查看进程
- 星起航:短视频内容的流量迸发让电商渠道看到了新的趋势
- 键盘研究:按键,键码,键符号
- 网段、网络地址、广播地址、子网掩码的计算方法
热门文章
- 凌吾修复代挂网全新界面源码
- 商业图表软件--SmartDraw 7
- Aed电子文档与无纸化办公
- 大数据分析师的就业前景如何?
- wireshark抓tcp三次握手四次挥手包
- dell服务器增加磁盘阵列,Dell PowerEdge服务器如何通过联机容量扩充的方式实现磁盘阵列扩容?...
- 分析论坛数据库设计分析
- 金融财务工作汇报PPT模板
- php websocket udp,swoole创建websocket服务并且支持https服务,同时监听tcp,udp端口
- 工具分享:eclipse-java-2019-09版windows64位正版最新(附下载链接)