工作原理和主要作用 GUI是什么
全称,即时模式游戏用户交互界面(IMGUI)
Unity中简称为GUI
它是一个代码驱动的UI系统
GUI的主要作用
1.作为程序员的调试工具,创建游戏内调试工具
2.为脚本组件创建自定义检视面板
3.创建新的编辑器窗口和工具以拓展Unity本身(一般作为内置游戏工具)
不要用它为玩家制作UI功能
1 2 3 4 private void OnGUI (){ }
OnGUI每帧执行
一般只在其中执行GUI相关界面绘制和逻辑操作
该函数在OnDisable之前,LateUpdate之后
只要是继承Mono的脚本,都可以在OnGUI中绘制UI
重要参数及文本和按钮 GUI绘制的共同点 1.都是GUI公共类中提供的静态函数,直接调用即可
2.他们的参数都大同小异
3.每一种控件都有多种重载,都是各个参数的排列组合
文本控件 1 2 3 4 5 private void OnGUI (){ GUI.Label(new Rect(0 ,0 ,100 ,20 ),"大家好我叫紫地丁" ); }
将脚本挂到MainCamera上,运行游戏
GUI的原点是屏幕的左上角
使用图片
1 2 3 4 5 6 7 public Texture tex; public Rect rect; private void OnGUI () { GUI.Label(new Rect(0 ,0 ,100 ,20 ),"大家好我叫紫地丁" ); GUI.Label(rect,tex); }
我们可以在检视器中调整图片的位置和宽高
综合使用
1 2 3 4 5 6 7 8 9 public Texture tex; public Rect rect; public GUIContent content; private void OnGUI () { GUI.Label(new Rect(0 ,0 ,100 ,20 ),"大家好我叫紫地丁" ); GUI.Label(rect,tex); GUI.Label(rect,content); }
GUI.tooltip可以获取此时鼠标所在的GUI的Tooltip信息
自定义样式
GUIStyle类用来自定义GUI样式
1 2 3 4 5 6 7 8 9 10 11 public Texture tex; public Rect rect; public GUIContent content; public GUIStyle style; private void OnGUI () { GUI.Label(new Rect(0 ,0 ,100 ,20 ),"大家好我叫紫地丁" ,style); GUI.Label(rect,tex,style); GUI.Label(rect,content,style); Debug.Log(GUI.tooltip); }
按钮控件 1 2 3 4 5 6 7 public Rect btnRect; public GUIContent btnContent; public GUIStyle btnStyle; private void OnGUI () { GUI.Button(btnRect, btnContent, btnStyle); }
监听按钮的点击
GUI.Button有返回值,返回按钮是否被点击
1 2 3 4 5 6 7 8 9 10 public Rect btnRect; public GUIContent btnContent; public GUIStyle btnStyle; private void OnGUI () { if (GUI.Button(btnRect,btnContent, btnStyle)) { Debug.Log("点击" ); } }
制作一个长按按钮
使用GUI.RepeatButton
1 2 3 4 5 6 7 8 9 10 11 public Rect btnRect; public GUIContent btnContent; public GUIStyle btnStyle; private void OnGUI () { if (GUI.RepeatButton(btnRect, btnContent)) { Debug.Log("长按点击" ); } }
多选框和单选框 多选框 普通样式
1 2 3 4 private void OnGUI () { GUI.Toggle(new Rect(0 , 0 , 100 , 20 ), true , "效果开关" ); }
切换状态
GUI.Toggle会返回当前帧的状态
1 2 3 4 5 private bool _isSel;private void OnGUI (){ _isSel = GUI.Toggle(new Rect(0 , 0 , 100 , 20 ), _isSel, "效果开关" ); }
自定义样式
解决图片大小问题:改变FixedWidth和FixedHeight的值
改变状态:改变Normal和OnNormal的值
修改从GUIStyle到内容起始处的空间:padding
单选框 单选框是基于多选框实现的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using UnityEngine;public class Lesson_3 : MonoBehaviour { private int _nowSelIndex=1 ; private void OnGUI () { if (GUI.Toggle(new Rect(0 , 0 , 100 , 30 ), _nowSelIndex == 1 , "选项1" )) { _nowSelIndex = 1 ; } if (GUI.Toggle(new Rect(0 , 150 , 100 , 30 ), _nowSelIndex == 2 , "选项2" )) { _nowSelIndex = 2 ; } if (GUI.Toggle(new Rect(0 , 300 , 100 , 30 ), _nowSelIndex == 3 , "选项3" )) { _nowSelIndex = 3 ; } } }
输入框和拖动条 输入框 普通输入
1 2 3 4 5 private string inputStr = "请输入内容" ;private void OnGUI (){ inputStr = GUI.TextField(new Rect(0 , 0 , 100 , 30 ), inputStr); }
也有可以限制字符数量的重载
1 inputStr = GUI.TextField(new Rect(0 , 0 , 100 , 30 ), inputStr,5 );
密码输入
1 2 3 4 5 private string inputPw;private void OnGUI (){ inputPw = GUI.PasswordField(new Rect(0 , 50 , 100 , 30 ), inputPw, '*' ); }
拖动条 水平拖动条
1 2 3 4 5 6 7 8 public class Lesson4 : MonoBehaviour { private float _nowValue; private void OnGUI () { _nowValue = GUI.HorizontalScrollbar(new Rect(0 ,100 ,100 ,50 ),_nowValue,0.1f ,0f ,1f ); } }
竖直拖动条
1 _nowValue = GUI.VerticalScrollbar(new Rect(0 , 100 , 100 , 50 ), _nowValue, 0.1f , 0f , 1f );
图片绘制和框 图片绘制 1 2 3 4 5 6 7 8 9 public class Lesson4 : MonoBehaviour { public Rect texPos; public Texture texture; private void OnGUI () { GUI.DrawTexture(texPos,texture); } }
通过重载可以规定图片的拉伸模式、宽高比和是否开启透明等
框绘制 1 2 3 4 5 6 7 8 public class Lesson4 : MonoBehaviour { public Rect texPos; private void OnGUI () { GUI.Box(texPos,"123" ); } }
工具栏和选择网格 工具栏 1 2 3 4 5 6 7 8 9 10 public class Lesson6 : MonoBehaviour { public Rect pos; private int toolbarIndex = 0 ; private string [] toolbarInfos ={ "选项1" , "选项2" , "选项3" }; private void OnGUI () { toolbarIndex = GUI.Toolbar(pos, toolbarIndex, toolbarInfos); } }
选择网格 1 2 3 4 5 6 7 8 9 10 public class Lesson6 : MonoBehaviour { public Rect pos; private int selGridIndex = 0 ; private string [] selGridInfos ={ "选项1" , "选项2" , "选项3" ,"选项4" }; private void OnGUI () { selGridIndex = GUI.SelectionGrid(pos, selGridIndex, selGridInfos, 2 ); } }
滚动视图和分组 分组 分组用于批量控制控件位置,可以理解为控件加了一个父对象
1 2 3 4 5 6 7 8 9 10 public class Lesson7 : MonoBehaviour { public Rect pos; private void OnGUI () { GUI.BeginGroup(pos); GUI.Button(new Rect(0 , 0 , 100 , 50 ), "测试" ); GUI.EndGroup(); } }
以pos,也就是为左上角锚点,批量控制GUI
滚动列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Lesson7 : MonoBehaviour { public Rect scPos,showPos; private Vector2 nowPos; private string [] strs = { "132" , "321" , "123" }; private void OnGUI () { nowPos = GUI.BeginScrollView(scPos, nowPos, showPos); GUI.Toolbar(new Rect(0 , 0 , 300 , 50 ), 0 ,strs); GUI.Toolbar(new Rect(0 , 60 , 300 , 50 ), 0 ,strs); GUI.Toolbar(new Rect(0 , 120 , 300 , 50 ), 0 ,strs); GUI.Toolbar(new Rect(0 , 180 , 300 , 50 ), 0 ,strs); GUI.Toolbar(new Rect(0 , 240 , 300 , 50 ), 0 ,strs); GUI.EndScrollView(); } }
窗口 窗口 1 2 3 4 5 6 7 8 9 10 11 public class Lesson8 : MonoBehaviour { private void OnGUI () { GUI.Window(1 , new Rect(100 , 100 , 200 , 150 ), DrawWinddow, "测试窗口" ); } private void DrawWinddow (int id ) { GUI.Button(new Rect(40 , 40 , 30 , 20 ),"测试" ); } }
模态窗口 只要模态窗口出现,只能与模态窗口交互,不能和其他UI交互
1 2 3 4 5 6 7 8 9 10 11 public class Lesson8 : MonoBehaviour { private void OnGUI () { GUI.ModalWindow(2 , new Rect(100 , 100 , 200 , 150 ), DrawWinddow, "测试窗口" ); } private void DrawWinddow (int id ) { GUI.Button(new Rect(40 , 40 , 30 , 20 ),"测试" ); } }
拖动窗口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Lesson8 : MonoBehaviour { private Rect dragWinPos = new Rect(400 , 400 , 200 , 150 ); private void OnGUI () { dragWinPos = GUI.Window(1 , dragWinPos, DrawWinddow, "测试窗口" ); } private void DrawWinddow (int id ) { GUI.Button(new Rect(40 , 40 , 30 , 20 ),"测试" ); if (id == 1 ) { GUI.DragWindow(); } } }
自定义皮肤样式 全局颜色 1 2 3 4 5 6 7 8 9 10 public class Lesson6 : MonoBehaviour { private void OnGUI () { GUI.color = Color.cyan; GUI.contentColor = Color.red; GUI.Button(new Rect(100 , 100 , 100 , 30 ), "测试" ); GUI.Label(new Rect(0 ,50 ,200 ,200 ),"测试" ); } }
整体皮肤样式 1 2 3 4 5 6 7 8 9 10 public class Lesson6 : MonoBehaviour { public GUIStyle style; public GUISkin skin; private void OnGUI() { GUI.skin = skin; GUI.Button(new Rect(0, 0, 100, 30), "测试"); } }
如果GUI设置了style,style会覆盖skin的设置
GUILayout自动布局 GUILayout自动布局 1 2 3 4 5 6 7 8 9 public class Lesson6 : MonoBehaviour { private void OnGUI () { GUILayout.Button("123" ); GUILayout.Button("1234" ); GUILayout.Button("12345" ); } }
自动布局主要用于编辑器开发
也可以自定义一些布局规则
1 2 3 4 5 6 7 8 9 10 11 12 13 public class Lesson6 : MonoBehaviour { private void OnGUI () { GUI.BeginGroup(new Rect(100 ,100 ,100 ,100 )); GUILayout.BeginHorizontal(); GUILayout.Button("123" ); GUILayout.Button("1234" ); GUILayout.Button("12345" ); GUILayout.EndHorizontal(); GUI.EndGroup(); } }
GUILayoutOption布局选项 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class Lesson6 : MonoBehaviour { private void OnGUI () { GUI.BeginGroup(new Rect(100 ,100 ,100 ,100 )); GUILayout.BeginHorizontal(); GUILayout.Button("123" ); GUILayout.Button("1234" ); GUILayout.Button("12345" ); GUILayout.EndHorizontal(); GUI.EndGroup(); GUILayout.Width(300 ); GUILayout.Height(300 ); GUILayout.MinHeight(50 ); GUILayout.MinWidth(50 ); } }
GUI总结
优点:简单快捷、代码控制
缺点:重复工作量繁多、控制绘制相关代码很多、运行时才能查看结果、不支持分辨率自适应
可以封装一些功能解决GUI的问题