当前位置:   article > 正文

Unity中UI系统——IMGUI(GUI)_unity imgui

unity imgui

1.工作原理和主要作用

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson1 : MonoBehaviour
  5. {
  6. #region GUI是什么
  7. //全称 即时模式游戏用户交互界面(IMGUI)
  8. //在Unity中一般简称为GUI
  9. //它是一个代码驱动的UI系统
  10. #endregion
  11. #region GUI的主要作用
  12. //1.作为程序员的调试工具 创建游戏内调试工具
  13. //2.为脚本组件创建自定义检视面板
  14. //3.创建新的编辑器窗口和工具以拓展Unity本身(一般用作内置游戏工具)
  15. //注意:不要用它为玩家制作UI功能
  16. #endregion
  17. #region GUI的工作原理
  18. //在继承MonoBehaviour的脚本中的特殊函数里
  19. //调用GUI提供的方法
  20. //类似生命周期函数
  21. private void OnGUI()
  22. {
  23. //在其中书写 GUI相关代码 即可显示GUI内容
  24. }
  25. //注意:
  26. //1.它每帧执行 相当于是用于专门绘制GUI界面的函数
  27. //2.一般只在其中执行GUI相关界面绘制和操作逻辑
  28. //3.该函数 在 OnDisable之前 LateUpdate之后执行
  29. //4.只要是继承Mono的脚本 都可以在OnGUI中绘制GUI
  30. #endregion
  31. }

2.文本和按钮控件

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson2 : MonoBehaviour
  5. {
  6. public Texture tex;
  7. public Rect rect;
  8. public Rect rect1;
  9. public GUIContent content;
  10. public GUIStyle style;
  11. public Rect btnRect;
  12. public GUIContent btnContent;
  13. public GUIStyle btnStyle;
  14. private void OnGUI()
  15. {
  16. #region GUI控件绘制的共同点
  17. //1.他们都是GUI公共类中提供的静态函数 直接调用即可
  18. //2.他们的参数都大同小异
  19. // 位置参数:Rect参数 x y位置 w h尺寸
  20. // 显示文本:string参数
  21. // 图片信息:Texture参数
  22. // 综合信息:GUIContent参数
  23. // 自定义样式:GUIStyle参数
  24. //3.每一种控件都有多种重载,都是各个参数的排列组合
  25. // 必备的参数内容 是 位置信息和显示信息
  26. #endregion
  27. #region 文本控件
  28. //基本使用
  29. GUI.Label(new Rect(0,0,100,20),"欢迎你!!!");//显示文本
  30. GUI.Label(rect, tex);//显示图片
  31. //综合使用
  32. GUI.Label(rect1, content);
  33. //可以获取当前鼠标或者键盘选中的GUI控件 对应的 tooltip信息
  34. Debug.Log(GUI.tooltip);
  35. //自定义样式
  36. GUI.Label(new Rect(0, 0, 100, 20), "欢迎你!!!",style);
  37. #endregion
  38. #region 按钮控件
  39. //基本使用
  40. //综合使用
  41. //自定义样式
  42. //鼠标在按钮内 按下并抬起 才会返回true
  43. if (GUI.Button(btnRect, btnContent, btnStyle))
  44. {
  45. //处理我们按钮点击的逻辑
  46. Debug.Log("按钮被点击");
  47. }
  48. //只要在长按按钮 就会一直返回true
  49. if (GUI.RepeatButton(btnRect, btnContent, btnStyle))
  50. {
  51. Debug.Log("长按按钮");
  52. }
  53. #endregion
  54. }
  55. }

3.多选框和单选框

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson3 : MonoBehaviour
  5. {
  6. private bool isSel;
  7. private bool isSel2;
  8. private GUIStyle style;
  9. private int nowSelIndex = 1;
  10. private void OnGUI()
  11. {
  12. #region 多选框
  13. #region 普通样式
  14. isSel = GUI.Toggle(new Rect(0, 0, 100, 30), isSel, "效果开关");
  15. #endregion
  16. #region 自定义样式 显示问题
  17. //修改固定宽高 fixedWidth和fixedHeight
  18. //修改从GUIStyle边缘到内容起始处的空间 padding
  19. isSel2 = GUI.Toggle(new Rect(0, 40, 100, 30), isSel2, "音效开关",style);
  20. #endregion
  21. #endregion
  22. #region 单选框
  23. //单选框是基于 多选框的实现
  24. if (GUI.Toggle(new Rect(0, 100, 100, 30), nowSelIndex == 1, "选项一"))
  25. {
  26. nowSelIndex = 1;
  27. }
  28. if (GUI.Toggle(new Rect(0, 140, 100, 30), nowSelIndex == 2, "选项二"))
  29. {
  30. nowSelIndex = 2;
  31. }
  32. if (GUI.Toggle(new Rect(0, 180, 100, 30), nowSelIndex == 3, "选项三"))
  33. {
  34. nowSelIndex = 3;
  35. }
  36. #endregion
  37. }
  38. }

4.输入框和拖动条

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson4 : MonoBehaviour
  5. {
  6. private string inputStr="";
  7. private string inputPW="";
  8. private float nowValue = 0.5f;
  9. private void OnGUI()
  10. {
  11. #region 输入框
  12. #region 普通输入
  13. //输入框 重要参数
  14. //参数二:内容 string
  15. //参数三:可输入长度
  16. inputStr = GUI.TextField(new Rect(0, 0, 100, 30), inputStr,5);
  17. #endregion
  18. #region 密码输入
  19. //参数二:密码
  20. //参数三:可输入长度
  21. inputPW = GUI.PasswordField(new Rect(0, 50, 100, 30), inputPW, '*', 5);
  22. #endregion
  23. #endregion
  24. #region 拖动条
  25. #region 水平拖动条
  26. //当前的值
  27. //参数三:最小值
  28. //参数四:最大值
  29. //可以加三个样式
  30. nowValue = GUI.HorizontalSlider(new Rect(0, 100, 100, 50), nowValue, 0, 1);
  31. Debug.Log(nowValue);
  32. #endregion
  33. #region 竖直拖动条
  34. nowValue = GUI.VerticalSlider(new Rect(0, 150, 50, 100), nowValue, 0, 1);
  35. #endregion
  36. #endregion
  37. }
  38. }

5.图片绘制和框绘制

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson5 : MonoBehaviour
  5. {
  6. public Rect texPos;
  7. public Texture tex;
  8. public ScaleMode mode = ScaleMode.StretchToFill;
  9. public bool alpha = true;
  10. public float wh = 0;
  11. private void OnGUI()
  12. {
  13. #region 图片绘制
  14. // ScaleMode
  15. // ScaleAndCrop 会通过宽高比比来计算图片 但是 会进行裁剪
  16. // ScaleToFit 会自动根据宽高比进行计算 不会拉变形 会一直保持图片完全显示的状态
  17. // StretchToFiill 始终填充满你传入的 Rect范围
  18. // alpha 是用来 控制 图片是否开启透明通道的
  19. // imageAspect 自定义宽高比 如果不填 默认为0 就会使用 图片原始宽高
  20. //GUI.DrawTexture(texPos,tex,mode,alpha,wh);
  21. #endregion
  22. #region 框绘制
  23. GUI.Box(texPos, "123");
  24. #endregion
  25. }
  26. }

6.工具栏和选择网格

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson6 : MonoBehaviour
  5. {
  6. private int toolbarIndex = 0;
  7. private string[] toolbarInfos = new string[] { "选项一", "选项二", "选项三" };
  8. private int selGridIndex = 0;
  9. private void OnGUI()
  10. {
  11. #region 工具栏
  12. toolbarIndex = GUI.Toolbar(new Rect(0, 0, 200, 30), toolbarIndex, toolbarInfos);
  13. //工具栏可以帮助我们根据不同的返回索引 来处理不同的逻辑
  14. switch (toolbarIndex)
  15. {
  16. case 0:
  17. break;
  18. case 1:
  19. break;
  20. case 2:
  21. break;
  22. }
  23. #endregion
  24. #region 选择网格
  25. //相对 toolbar多了一个参数 xCount 代表 水平方向最多显示的按钮数量
  26. //一行显示不完就会在下一行显示
  27. GUI.SelectionGrid(new Rect(0, 50, 200, 30), selGridIndex, toolbarInfos, 2);
  28. #endregion
  29. }
  30. }

7.滚动列表和分组

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson7 : MonoBehaviour
  5. {
  6. public Rect groupPos;
  7. public Rect scPos;
  8. public Rect showPos;
  9. private Vector2 nowPos;
  10. private string[] strs = new string[] { "按钮1", "按钮2", "按钮3", "按钮4" };
  11. private void OnGUI()
  12. {
  13. #region 分组
  14. //用于批量控制控件位置
  15. //可以理解为 包裹着的控件加了一个父对象
  16. //可以通过控制分组来控制包裹控件的位置
  17. GUI.BeginGroup(groupPos);
  18. GUI.Button(new Rect(0, 0, 100, 50), "测试按钮");
  19. GUI.Label(new Rect(0, 60, 100, 20), "Lable信息");
  20. GUI.EndGroup();
  21. #endregion
  22. #region 滚动列表
  23. nowPos = GUI.BeginScrollView(scPos, nowPos, showPos);
  24. GUI.Toolbar(new Rect(0, 0, 300, 50), 0, strs);
  25. GUI.Toolbar(new Rect(0, 60, 300, 50), 0, strs);
  26. GUI.Toolbar(new Rect(0, 120, 300, 50), 0, strs);
  27. GUI.Toolbar(new Rect(0, 180, 300, 50), 0, strs);
  28. GUI.EndScrollView();
  29. #endregion
  30. }
  31. }

8.窗口

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson8 : MonoBehaviour
  5. {
  6. private Rect dragWinPos = new Rect(400, 400, 200, 150);
  7. private void OnGUI()
  8. {
  9. #region 窗口
  10. //参数一:第一个参数 id 是窗口的唯一ID 不要和别的窗口重复
  11. //参数二:显示区域
  12. //参数三:委托参数 是用于 绘制窗口用的函数 传入即可
  13. //参数四:窗口标题
  14. GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
  15. //id对于我们来说 有一个重要作用 除了区分不同窗口 还可以在一个函数中去处理多个窗口的逻辑
  16. //通过id去区分他们
  17. GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口2");
  18. #endregion
  19. #region 模态窗口
  20. //模态窗口 可以让其他控件不再有用
  21. //你可以理解该窗口在最上层 其他按钮都点击不到了
  22. //只能点击该窗口上的控件
  23. //GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
  24. #endregion
  25. #region 拖动窗口
  26. //位置赋值只是前提
  27. dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖动窗口");
  28. #endregion
  29. }
  30. private void DrawWindow(int id)
  31. {
  32. switch (id)
  33. {
  34. case 1:
  35. GUI.Button(new Rect(0, 20, 30, 20), "按钮1");
  36. break;
  37. case 2:
  38. GUI.Button(new Rect(0, 20, 30, 20), "按钮2");
  39. break;
  40. case 3:
  41. GUI.Button(new Rect(0, 20, 30, 20), "按钮3");
  42. break;
  43. case 4:
  44. //该API 写在窗口函数中调用 可以让窗口被拖动
  45. //传入Rect参数的重载 作用
  46. //是决定窗口中的哪一部分位置 可以被拖动
  47. //默认不填 就是无参重载 默认窗口的所有位置都能被拖动
  48. GUI.DragWindow(new Rect (0,0,1000,20));
  49. break;
  50. }
  51. }
  52. }

9.自定义皮肤

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson9 : MonoBehaviour
  5. {
  6. public GUIStyle style;
  7. public GUISkin skin;
  8. private void OnGUI()
  9. {
  10. #region 全局颜色
  11. //全局的着色颜色 影响背景和文本颜色
  12. //GUI.color = Color.red;
  13. //文本着色颜色 会和 全局颜色相乘
  14. //GUI.contentColor = Color.yellow;
  15. //GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");
  16. 背景元素着色颜色 会和 全局颜色相乘
  17. //GUI.backgroundColor = Color.red;
  18. //GUI.Label(new Rect(0, 50, 100, 30), "测试按钮");
  19. //GUI.color = Color.white;
  20. //GUI.Button(new Rect(0, 100, 100, 30), "测试按钮",style);
  21. #endregion
  22. #region 整体皮肤样式
  23. //为空的话 会显示默认的皮肤样式
  24. GUI.skin = skin;
  25. //虽然设置了皮肤 但是绘制时 如果使用GUIStyle参数 皮肤就没有
  26. GUI.Button(new Rect(0, 0, 100, 30), "测试按钮");
  27. GUI.skin = null;
  28. GUI.Button(new Rect(0, 50, 100, 30), "测试按钮2");
  29. //它可以帮助我们整套的设置 自定义样式
  30. //相对单个控件设置style要方便一些
  31. #endregion
  32. }
  33. }

10.自动布局

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class lesson10 : MonoBehaviour
  5. {
  6. private void OnGUI()
  7. {
  8. #region GUILayout 自动布局
  9. //主要用于进行编辑器开发 如果用它来做游戏UI不太合适
  10. GUI.BeginGroup(new Rect(100, 100, 200, 300));
  11. GUILayout.BeginVertical();
  12. GUILayout.Button("123",GUILayout.Width(200));
  13. GUILayout.Button("1234");
  14. GUILayout.Button("12345",GUILayout.ExpandWidth(false));
  15. GUILayout.EndVertical();
  16. GUI.EndGroup();
  17. #endregion
  18. #region GUILayoutOption 布局选项
  19. //控件的固定宽高
  20. GUILayout.Width(300);
  21. GUILayout.Height(200);
  22. //运行控件的最小宽高
  23. GUILayout.MinWidth(50);
  24. GUILayout.MinHeight(50);
  25. //允许控件的最大宽高
  26. GUILayout.MaxWidth(100);
  27. GUILayout.MaxHeight(100);
  28. //允许或禁止水平拓展
  29. GUILayout.ExpandWidth(true);
  30. GUILayout.ExpandHeight(true);
  31. #endregion
  32. }
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/122466
推荐阅读
相关标签
  

闽ICP备14008679号