【Unity】8.4 扩展UnityGUI
分类:Unity、C#、VS2015
创建日期:2016-04-27
一、简介
有很多种方法可以补充和扩展 UnityGUI 以满足您的需求。你可以混合和创建控件,并且可以有多种方法来规定用户 GUI 输入的处理方法。
二、复合控件
GUI 中可能会出现各种情况,但总是同时出现两种类型的控件。例如,你可能会使用水平滑块创建通过角色控制的屏幕(Character Creation)。此时,所有这些滑块都需要提供一个标签 (Label) 来识别,这样玩家才能知道它们是调节什么的。这种情况下,可以将 GUI.Label() 的每个调用与 GUI.HorizontalSlider() 的调用配对,或者创建一个同时包含标签和滑块的复合控件 (Compound Control) 。
例如:
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");
} float LabelSlider (Rect screenRect, float sliderValue, float sliderMaxValue, string labelText) {
GUI.Label (screenRect, labelText); // <- 将滑块推至标签末端
screenRect.x += screenRect.width; sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0f, sliderMaxValue);
return sliderValue;
}
}
效果如下:

在这个示例中,调用 LabelSlider() 并传递正确的参数将使标签 (Label) 与水平滑动条 (Horizontal Slider) 配对。编写复合控件 (Compound Controls) 时,请务必记住在函数结束时返回正确的值以使其交互。
三、静态复合控件
使用静态 (Static) 函数,你可以为自己创建完备的复合控件集。这样你就不需要在同一脚本中使用函数时声明此函数。
using UnityEngine;
using System.Collections;
public class CompoundControls : MonoBehaviour
{
public static float LabelSlider (Rect screenRect, float sliderValue, float sliderMaxValue, string labelText)
{
GUI.Label (screenRect, labelText);
//将滑块推至标签末端
screenRect.x += screenRect.width;
sliderValue = GUI.HorizontalSlider (screenRect, sliderValue, 0.0f, sliderMaxValue);
return sliderValue;
}
}
通过将上述示例保存至 CompoundControls 脚本,只需简单地键入 CompoundControls.LabelSlider() 并提供变量,就可以从其他任何脚本中调用 LabelSlider()。
四、复杂的复合控件
你还可以将复合控件 (Compound Controls) 变得更具创造力。即让它们按照你喜欢的方式排列和分组。下面的C#代码示例创建一个能够重复使用的 RGB 滑块:
using UnityEngine;
using System.Collections; public class GUITest : MonoBehaviour { public Color myColor; void OnGUI () {
myColor = RGBSlider (new Rect (10,10,200,10), myColor);
} Color RGBSlider (Rect screenRect, Color rgb) {
rgb.r = GUI.HorizontalSlider (screenRect, rgb.r, 0.0f, 1.0f); // <- 将下个控件向下移动一点以避免重叠
screenRect.y += 20;
rgb.g = GUI.HorizontalSlider (screenRect, rgb.g, 0.0f, 1.0f); // <- 将下个控件向下移动一点以避免重叠
screenRect.y += 20; rgb.b = GUI.HorizontalSlider (screenRect, rgb.b, 0.0f, 1.0f);
return rgb;
}
}
效果如下:

为了展示复合控件如何在其他复合控件中使用,现在让我们在它们各自上方创建复合控件。为此,我们将像上面那样创建一个新的 RGB 滑块,但使用“标签滑块”(LabelSlider) 来实现。这样就总有一个标签使我们可以分辨出哪个滑块对应哪种颜色:
using UnityEngine;
using System.Collections; public class GUITest : MonoBehaviour { public Color myColor; void OnGUI () {
myColor = RGBSlider (new Rect (10,10,200,30), myColor);
} Color RGBSlider (Rect screenRect, Color rgb) {
rgb.r = CompoundControls.LabelSlider (screenRect, rgb.r, 1.0f, "Red"); // 将下个控件向下移动一点以避免重叠
screenRect.y += 20;
rgb.g = CompoundControls.LabelSlider (screenRect, rgb.g, 1.0f, "Green"); // 将下个控件向下移动一点以避免重叠
screenRect.y += 20; rgb.b = CompoundControls.LabelSlider (screenRect, rgb.b, 1.0f, "Blue"); return rgb;
}
}
这段代码的效果如下:

【Unity】8.4 扩展UnityGUI的更多相关文章
- unity shader 编辑器扩展类 ShaderGUI
这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下. 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现的,形式比较 ...
- Unity 5.X扩展编辑器之打包assetbundle
5.x的assetbundle与4.x以及之前的版本有些不同,不过本质是一样的,只不过5.x打包assetbundle更为简单和人性化了,总体来说只需要三个步骤: 第一步:创建打包资源 //这里是一个 ...
- Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...
- Unity 3D编辑器扩展介绍、教程(一) —— 创建菜单项
Unity编辑器扩展教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introduct ...
- Unity中自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...
- Unity编辑器的扩展:IMGUI
IMGUI 介绍 所有关于 Editor 的相关 UI,包括 Inspector.Hierarchy.Window.Game 视图上动态创建的那些半透明 UI.还有 Scene 视图上可添加的辅助显示 ...
- Unity中使用扩展方法解决foreach导致的GC
对于List这种顺序表,我们解决的时候还是可以使用for代替foreach即可.但是对于非顺序表,比如Dictionary或者Set之类,我们可以扩展方法Foreach,ForeachKey和Fore ...
- Unity编辑器扩展
在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...
- Unity插件扩展中组件常用的几个方法
最近为美术编写一个Unity编辑器的扩展,主要为了减轻美术在修改预制对象时的机械化操作的繁琐和出错.具体实现的几个功能: 1.删除指定组件: 2.复制.粘贴指定的组件: 3.重新关联新的属性: 4.重 ...
随机推荐
- django之创建第11个项目-页面整合
目的:将如下众多html页面整合到一个index.html页面中. 百度云盘:django之创建第11个项目-页面整合 用下面的方式实现: <!DOCTYPE html> <head ...
- KMS11激活Window系列
运行状态图 download: kms11
- 转:extern "C"的用法解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言, C++保留了一部分过程式 ...
- Retrofit使用指南
Retrofit is a type-safe HTTP client for Android and Java. Retrofit是面向Android和Java平台的一个类型安全的HTTP客户端. ...
- 使用Docker运行Java Web应用
前言 Tomcat是目前比较流行的Web应用服务器,深受Java爱好者的喜爱.通常J2EE应用的产出物是一个war包,这篇文章将为你介绍如何使用Docker运行Tomcat+war包的Java Web ...
- js实现放大缩小页面
<script type="text/JavaScript"> var size = 1.0; function zoomout() { size = size + 0 ...
- [转载]eclipse的远程调试功能配置
原文地址:eclipse的远程调试功能配置作者:我的 用途:web应用部署并运行于外部(区别于eclipse环境中启动的)应用服务器中,当出现问题时,可以使用eclipse工程的源代码进行跟踪调试. ...
- MATLAB 的函数句柄
MATLAB 的函数句柄: 1.何为函数句柄? 函数句柄也是MATLAB中的一种常见的数据类型, 它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或 ...
- POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6448 Accepted: 2654 ...
- 使用Nexus搭建Maven内部服务器
概述 我们在使用maven时,一般通过网络上一些公共的maven仓库来获取jar包,但是有时候会碰到网速比较慢的情况就比较郁闷,Nexus是一个maven的服务器,可以让我们搭建一个本 ...