- 用户指南
- Components
- 寻路
- 动画组件
- 资源组件
- 音频组件(AudioComponent)
- 音频侦听器(AudioListener)
- 音频源(AudioSource)
- 音频过滤器(AudioFilter)(仅限专业版)
- 混响区域(ReverbZone)
- 麦克风(Microphone)
- 物理组件(PhysicsComponent)
- 箱体碰撞体(BoxCollider)
- 胶囊碰撞体(CapsuleCollider)
- 角色控制器(CharacterController)
- 角色关节(CharacterJoint)
- 可配置关节(ConfigurableJoint)
- 恒定力(ConstantForce)
- 固定关节(FixedJoint)
- 铰链关节(HingeJoint)
- 网格碰撞体(MeshCollider)
- 物理材质(PhysicsMaterial)
- 刚体(Rigidbody)
- (SphereCollider)
- 弹簧关节(SpringJoint)
- 交互布(InteractiveCloth)
- 蒙皮布(SkinnedCloth)
- 车轮碰撞体(WheelCollider)
- 游戏对象(GameObject)
- 图像效果(ImageEffectScripts)
- 高光溢出和镜头光晕(BloomandLensFlare)
- 模糊(Blur)
- 相机运动模糊(MotionBlur)
- 颜色修正曲线(ColorCorrectionCurve)
- 颜色修正(ColorCorrection)
- 颜色修正查找纹理(ColorCorrectionLookupTexture)
- 对比度增强(ContrastEnhance)
- 对比度拉伸(ContrastStretch)
- 起皱(Crease)
- 视野深度(DepthofField)3.4
- 视野深度(DepthofField)
- 边缘检测(EdgeDetection)
- 鱼眼(Fisheye)
- 全局雾(GlobalFog)
- 发光(Glow)
- 灰度(Grayscale)
- 运动模糊(MotionBlur)
- 噪波和颗粒(NoiseAndGrain)
- 噪波(Noise)
- 屏幕叠加(ScreenOverlay)
- 棕褐色调(SepiaTone)
- 边缘检测效应
- 阳光照射(SunShaft)
- 屏幕空间环境光遮蔽(SSAO)(ScreenSpaceAmbientOcclusion(SSAO))
- 倾斜位移(TiltShift)
- 色调映射(Tonemapping)
- 旋转(Twirl)
- 渐晕(Vignetting)(和色差(ChromaticAberration))
- 状态同步详细信息
- 旋涡
- 设置管理器(SettingsManager)
- 网格组件(MeshComponents)
- 网络组
- 效果
- 渲染组件
- 变换组件(TransformComponent)
- UnityGUI组
- 向导
- 地形引擎指南(TerrainEngineGuide)
- 树木创建器指南
- 动画视图指南
- GUI脚本指南
- 网络参考指南
- 移动设备上的网络连接
- 高级网络概念
- Unity中的网络元素
- RPC详细信息
- NetworkLevelLoading
- 主服务器
- 最小化网络带宽
- 社交API
- 内置着色器指南
- Unity的后台渲染
- 着色器参考
- ShaderLab语法:Shader
- ShaderLab语法:Properties
- ShaderLab语法:子着色器(SubShader)
- ShaderLab语法:Pass
- ShaderLabsyntax:Color,Material,Lighting
- ShaderLab语法:剔除和深度测试(Culling&DepthTesting)
- ShaderLab语法:纹理组合器(TextureCombiners)
- ShaderLab语法:雾(Fog)
- ShaderLab语法:Alpha测试(Alphatesting)
- ShaderLab语法:混合(Blending)
- ShaderLab语法:通道标记(PassTags)
- ShaderLab语法:名称(Name)
- ShaderLab语法:绑定通道(BindChannels)
- ShaderLab语法:使用通道(UsePass)
- ShaderLab语法:GrabPass
- ShaderLab语法:子着色器标记(SubShaderTags)
- ShaderLab语法:回退(Fallback)
- ShaderLab语法:自定义编辑器(CustomEditor)
- ShaderLab语法:其他命令
- ShaderLab语法:Pass
- 高级ShaderLab主题
- ShaderLab内置值
- 其他
- 网络视图
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Mecanim 动画系统
- 动画状态机
- 混合树 (Blend Tree)
- 在 Mecanim 中使用动画曲线 (Animation Curves)(仅限专业版 (Pro))
- 循环动画片段
- Animation State Machine Preview (solo and mute)
- 动画参数
- 旧动画系统
- 使用类人动画
- 动画层
- 资源导入与创建
- 音轨模块
- 减少文件大小
- 光照贴图 UV
- 资源准备和导入
- 如何安装或升级标准资源 (Standard Assets)?
- FBX 导出指南
- 从 Maya 中导入对象
- 从 Cinema 4D 中导入对象
- 从 3D Studio Max 中导入对象
- 从 Cheetah3D 中导入对象
- 从 Modo 中导入对象
- 从 Lightwave 中导入对象
- 从 Blender 中导入对象
- 为优化性能建模角色
- 如何使用法线贴图 (NormalMaps)?
- 如何修正已导入模型的旋转?
- 程序材质
- 如何使用水?
- 分析器(仅限专业版)
- 绘制调用批处理
- 遮挡剔除(仅限专业版)
- Unity 中的高动态范围 (High Dynamic Range) 渲染
- 在 Unity 4 中使用 DirectX 11
- 文本场景文件格式(仅限专业版)
- 使用网络播放器模版
- 平台依赖编译
- 日志文件
- 首选项
- 粒子系统曲线编辑器
- 渐变编辑器
- 怎样制作网格粒子发射器?(旧粒子系统)
- 深入了解光照贴图
- 光照贴图快速入门
- 着色器
- 动画脚本(旧版)
- 自定义
- 布局模式
- 扩展编辑器
- 网络实例化
- 材质和着色器
- 如何使用细节纹理?
- 着色器:顶点和片段程序
- Unity 中的阴影
GUI基础
本节讲解了用 UnityGUI 对控件 (Controls) 进行脚本编辑的基本要求。
用 UnityGUI 制作控件
UnityGUI 控件使用一种称为 OnGUI() 的特殊函数。只要包含的脚本已启用,每帧OnGUI() 函数都会被调用 - 正如 Update() 函数。
GUI 控件本身结构很简单。此结构在以下示例中较为清楚。
/* 示例等级加载器 */ // JavaScript function OnGUI () { // 制作背景盒 GUI.Box (Rect (10,10,100,90), "Loader Menu"); // 制作第一个按钮。按下这个按钮将执行 Application.Loadlevel (1) if (GUI.Button (Rect (20,40,80,20), "Level 1")) { Application.LoadLevel (1); } // 制作第二个按钮。 if (GUI.Button (Rect (20,70,80,20), "Level 2")) { Application.LoadLevel (2); } } //C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { void OnGUI () { // Make a background box GUI.Box(new Rect(10,10,100,90), "Loader Menu"); // Make the first button. If it is pressed, Application.Loadlevel (1) will be executed if(GUI.Button(new Rect(20,40,80,20), "Level 1")) { Application.LoadLevel(1); } // Make the second button. if(GUI.Button(new Rect(20,70,80,20), "Level 2")) { Application.LoadLevel(2); } } }
此示例是一个完整的功能性等级加载器。如果您复制/粘贴此脚本并将其贴到游戏对象 (GameObject) 上,则进入播放模式 (Play Mode) 时会看到以下菜单:
由示例代码创建的加载器菜单 (Loader Menu)
我们来看看示例代码的详细信息:
第一行 GUI 命令行 GUI.Box (Rect (10,10,100,90), "Loader Menu"); 显示了带标题文本“Loader Menu”的盒 (Box) 控件。它遵循我们马上要讲解的典型 GUI 控件声明模式。
下一行 GUI 是按钮 控件 (Button Control) 声明。注意它与盒控件 (Box Control) 声明有些许不同。特别是整个按钮 (Button) 声明都置于 if 语句内。如果在运行游戏时单击此按钮 (Button),该 if 语句返回真值并执行 if 块内的任意代码。
由于 OnGUI() 代码在每一帧获得调用,因此您不必明确创建或破坏 GUI 控件。声明该控件 (Control) 的行与创建它的行是同一行。如果您需要在特定时间显示控件 (Control),可使用任何一种脚本逻辑来操作。
/* Flashing button example */ // JavaScript function OnGUI () { if (Time.time % 2 < 1) { if (GUI.Button (Rect (10,10,200,20), "Meet the flashing button")) { print ("You clicked me!"); } } } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { void OnGUI () { if (Time.time % 2 < 1) { if (GUI.Button (new Rect (10,10,200,20), "Meet the flashing button")) { print ("You clicked me!"); } } } }
此处,GUI.Button() 仅每隔一秒获得调用,因此此按钮会出现然后消失。因此,只有在按钮可见时用户才能单击它。
正如您所见,当 GUI 控件 (Control) 显示并可用时,您可使用任何需要的逻辑进行控制。现在我们来探究每个控件 (Control) 声明的详细信息。
控件剖析
声明 GUI 控件 (Control) 时必需有三条关键信息:
类型 (位置、内容) 观察到此结构是一个有两个参数的函数。现在我们来探究此结构的详细信息。
类型
类型 (Type) 是控件类型 (Control Type),而且是通过调用 UnityGUI 类或 GUILayout 类 ,中的一个函数进行声明的。GUILayout 类将在指南的 布局模式 (Layout Modes) 部分进行详细讨论。例如,GUI.Label() 将创建一个非互动式的标签。所有不同的控件类型稍后会在指南的控件部分进行解释。
位置
位置 (Position) 是任何 GUI 控件 (Control) 函数中的第一个参数。参数本身设置有 Rect() 函数。Rect() 定义四种属性:最左端位置、最顶端位置、总宽度和总高度。所有这些值都是整数,这与像素值对应。所有 UnityGUI 控件都在屏幕空间 (Screen Space)中运行,该屏幕空间是以像素为单位的已发布播放器的分辨率
坐标系统以左上角为基点。Rect(10, 20, 300, 100) 定义矩形 (Rectangle),该矩形始于坐标:10,20,结束于坐标 310,120。还要重复一下,Rect() 中的第二对值是总宽度和高度,而非控件的结束坐标。这就是为什么上文提及示例的结束坐标是 310,120 而不是 300,100。
使用Screen.width 和 Screen.height 属性可使屏幕空间的总尺寸在播放器中可用。以下示例可能有助于阐明其完成方式:
/* Screen.width & Screen.height 示例 */ // JavaScript function OnGUI () { GUI.Box (Rect (0,0,100,50), "Top-left"); GUI.Box (Rect (Screen.width - 100,0,100,50), "Top-right"); GUI.Box (Rect (0,Screen.height - 50,100,50), "Bottom-left"); GUI.Box (Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom-right"); } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { void OnGUI(){ GUI.Box (new Rect (0,0,100,50), "Top-left"); GUI.Box (new Rect (Screen.width - 100,0,100,50), "Top-right"); GUI.Box (new Rect (0,Screen.height - 50,100,50), "Bottom-left"); GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom-right"); } }
通过以上示例定位的盒
内容
用于 GUI 控件 (Control) 的第二个参数是用控件 (Control) 显示的实际内容。很多时候您需要在控件 (Control) 上显示某个文本或图像。如需显示文本,请将字符串作为内容 (Content) 参数进行传递,如下所示:
/* 字符串内容示例 */ // JavaScript function OnGUI () { GUI.Label (Rect (0,0,100,50), "This is the text string for a Label Control"); } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { void OnGUI () { GUI.Label (new Rect (0,0,100,50), "This is the text string for a Label Control"); } }
如需显示图像,请声明二维纹理 (Texture2D) 公共变量,并将变量名称作为内容参数进行传递,如下所示:
/* 二维纹理内容示例 */ // JavaScript var controlTexture : Texture2D; function OnGUI () { GUI.Label (Rect (0,0,100,50), controlTexture); } // C# public Texture2D controlTexture; ... void OnGUI () { GUI.Label (new Rect (0,0,100,50), controlTexture); }
这里是一个更接近真实世界场景的示例:
/* 按钮内容示例 */ // JavaScript var icon : Texture2D; function OnGUI () { if (GUI.Button (Rect (10,10, 100, 50), icon)) { print ("you clicked the icon"); } if (GUI.Button (Rect (10,70, 100, 20), "This is text")) { print ("you clicked the text button"); } } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { public Texture2D icon; void OnGUI () { if (GUI.Button (new Rect (10,10, 100, 50), icon)) { print ("you clicked the icon"); } if (GUI.Button (new Rect (10,70, 100, 20), "This is text")) { print ("you clicked the text button"); } } }
由以上示例创建的按钮 (Button)
如需让图像和文本在 GUI 控件 (Control) 上一并显示,还有第三种选择。提供 一个GUIContent 对象作为内容 (Content) 参数,并定义显示在 GUIContent 中的字符串和图像。
/* 使用 GUIContent 显示图像和字符串 */ // JavaScript var icon : Texture2D; function OnGUI () { GUI.Box (Rect (10,10,100,50), GUIContent("This is text", icon)); } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { public Texture2D icon; void OnGUI () { GUI.Box (new Rect (10,10,100,50), new GUIContent("This is text", icon)); } }
您还可以在 GUIContent 中定义工具提示 (Tooltip)。当鼠标在工具提示上方悬停时,可将其显示在 GUI 中的其他地方。
/* 使用 GUIContent 显示工具提示*/ // JavaScript function OnGUI () { // 该行向 GUI 工具提示输入“This is the tooltip” GUI.Button (Rect (10,10,100,20), GUIContent ("Click me", "This is the tooltip")); // 该行读取并显示 GUI 工具提示的内容 GUI.Label (Rect (10,40,100,20), GUI.tooltip); } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { void OnGUI () { // 该行向 GUI 工具提示输入“This is the tooltip” GUI.Button (new Rect (10,10,100,20), new GUIContent ("Click me", "This is the tooltip")); // 该行读取并显示 GUI 工具提示的内容 GUI.Label (new Rect (10,40,100,20), GUI.tooltip); } }
如果您有足够胆量,还可以使用 GUIContent 显示字符串、图标和工具提示!
/* 使用 GUIContent 显示图像、字符串和工具提示 */ // JavaScript var icon : Texture2D; function OnGUI () { GUI.Button (Rect (10,10,100,20), GUIContent ("Click me", icon, "This is the tooltip")); GUI.Label (Rect (10,40,100,20), GUI.tooltip); } // C# using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { public Texture2D icon; void OnGUI () { GUI.Button (new Rect (10,10,100,20), new GUIContent ("Click me", icon, "This is the tooltip")); GUI.Label (new Rect (10,40,100,20), GUI.tooltip); } }
丰富示例列表的 GUIContent 构造函数 的脚本参考页面。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论