Contents

UI系统-GUI

GUI是什么

  • 全称 即时模式游戏用户交互界面(IMGUI)
  • 在Unity中一般简称为GUI 他是一个代码驱动的UI系统

GUI的作用

  • 作为程序员的调试工具,创建游戏内的调试工具
  • 为脚本组件创建自定义监视面板
  • 创建新的编辑器窗口和工具 以及拓展unity本身(一般用作内置游戏工具)
  • 不要用它为玩家制作ui功能

GUI的工作原理

  • 在继承Mono的脚本中的特殊函数里
  • 调用GUI提供的方法 类似生命周期函数
private void OnGUI(){
    //GUI的相关代码
}

OnGUI

  • 它每帧执行 相当于是专门绘制GUI界面的函数
  • 一般只在其中执行GUI相关界面绘制和操作逻辑
  • 该函数在OnDisable之前 LateUpdate之后执行
  • 只要是继承Mono的脚本 都可以在OnGUI中绘制GUI

GUI基本控件

GUI控件绘制的共同点

  • 他们都是GUI公共类中提供的静态函数 直接调用即可
  • 他们的参数都大同小异
    • 位置参数:Rect参数 xy位置 wh尺寸
    • 显示文本:string 参数
    • 图片信息:Texture参数
    • 综合信息:GuiConten参数
    • 自定义样式:GUIStyle参数
  • 每一种控件都有多种重载,都是各个参数的排列组合,必备参数是 位置信息和显示信息

文本控件

//创建一个 位置为0 0 宽带100 高度30的文本控件
GUI.Label(new Rect(0,0,100,30), "我爱吃肉");
//可在面板上设置参数
public Rect rect;
public GUIContent content;
public GUIStyle style;//字体样式
GUI.Label(rect, content,style);

按钮控件

//创建一个 位置为0 0 宽带100 高度30的按钮 返回float
GUI.Button(new Rect(0,0,100,30), "我爱吃肉");
//可在面板上设置参数
public Rect rect;
public GUIContent content;
public GUIStyle style;//字体样式
if(GUI.Button(rect, content,style)){
    Debug.Log("按钮被点击");
}
//长按按钮
if(GUI.RepeatButton(rect, content,style)){
    Debug.Log("按钮被长按");
}

多选框

private bool isSel;
//第二个参数bool  多选框的状态bool 返回值是否被点击
isSel = GUI.Toggle(rect,isSel,"效果开关");

//一组单选实现
int nowSelIndex = 0;
if(GUI.Toggle(rect,nowSeleIndex==1;,"效果开关1")){
    //如果被选中nowSeleIndex等于1
    nowSeleIndex==1;
}
if(GUI.Toggle(rect,nowSeleIndex==2;,"效果开关2")){
    //如果被选中nowSeleIndex等于1
    nowSeleIndex==2;
}
if(GUI.Toggle(rect,nowSeleIndex==3;,"效果开关3")){
    //如果被选中nowSeleIndex等于1
    nowSeleIndex==3;
}

输入框

public Rect rect;
string inputText;
//参数里的string是显示的内容  int最大长度
inputText = GUI.TextField(rect,inputText,5);
//密码输入
string inputPW;
//*替代字符
inputPW = GUI.PasswordField(rect,inputPW,'*')

拖动条

//水平拖动条
public Rect rect;
float sliderValue;
//第一个float 当前的值
//第2个和第3个float 最小值和最大值
GUI.HorizontalSlider(rect,sliderValue,0f,100f);
//垂直拖动条
GUI.VerticalSlider(rect,sliderValue,0f,100f);

绘制图片

public Rect rect;
public Texture texture;//图片
GUI.DrawTexture(rect,texture);
public bool alpha = true;//是否启用透明度
public ScaleMode mode = ScaleMode.StretchToFill;//缩放模式
public float wh =0; //自定义宽高比
GUI.DrawTexture(rect,texture,mode,alpha,wh);

框绘制

public Rect rect;
//可以在框中显示文字
GUI.Box(rect,"123");

GUI符合控件

工具栏

private int toolbarIndex = 0;
private string[] toolbarInfos = new string[]{"选项1","选项2","选项3"};
public Rect rect;
toolbarIndex = GUI.Toolbar(rect,toolbarIndex,toolbarInfos);

选择网络

public Rect rect;
private int selectionGridIndex = 0;
private string[] SelectionGridInfos = new string[]{"选项1","选项2","选项3"};
//2 一行最多显示2个
selectionGridIndex = GUI.SelectionGrid(rect,selectionGridIndex,SelectionGridInfos,2)

控件分组

  • 用于批量控制控件的位置
  • 可以理解为 包裹着的控件加了一个父对象
  • 可以通过控制分组来控制包裹控件的位置
public Rect groupPos;
GUI.BeginGroup(groupPos);
GUI.Button(new Rect(0,0,100,30)."按钮1");
GUI.Button(new Rect(30,0,100,30)."按钮2");
GUI.Button(new Rect(60,0,100,30)."按钮3");
GUI.EndGroup(groupPos);

滚动列表

public Vector2 nowPos//内容的当前位置
public Rect scPos;//ScrollView的位置和大小
public Rect showPos;//内容的位置和尺寸 要比ScrollView大
nowPos = GUI.BeginScrollView(scPos,nowPos,showPos)
private string[] toolbarInfos = new string[]{"选项1","选项2","选项3","按钮4"};
GUI.Toolbar(new Rect(0,0,300,50),toolbarInfos,0);
GUI.Toolbar(new Rect(0,60,300,50),toolbarInfos,0);
GUI.Toolbar(new Rect(0,120,300,50),toolbarInfos,0);
GUI.Toolbar(new Rect(0,180,300,50),toolbarInfos,0);
GUI.EndScrollView();

窗口

public Rect rect;

//1是窗口id
GUI.Window(1,rect,DrawWindow,"测试窗口")   
    
GUI.Window(2,rect,DrawWindow,"测试窗口")      
//委托函数 里面是窗口里的内容
//rect以窗口里的0,0为远点
private void DrawWindow(int id){ //id=1
	GUI.Button(rect,"按钮")
}

模态窗口

  • 模态窗口 可以让窗口以外的控件失效
  • 可以理解为窗口再最上层
GUI.ModalWindow(1,rect,DrawWindow,"模态窗口");

拖动窗口

public Rect rect;
public Rect windowPos;
//窗口返回值Rest
windowPos = GUI.Window(1,windowPos,DrawWindow,"测试窗口");   
private void DrawWindow(int id){ //id=1
	GUI.Button(rect,"按钮")
     //该ip写在窗口的委托函数中调用 可以让窗口被拖动
     GUI.DrageWindow();
    //重载 可以决定窗口中哪一部分位置可以被拖动 默认所有位置都可以被拖动
    GUI.DrageWindow(new Rect(0,0,1000,20));
}

自定义皮肤样式

全局颜色

//全局的着色 影响背景和文本的颜色
//不常用 添加了style也会呗覆盖
GUI.color = Color.red;
GUI.contentColor = Color.yellow;//文本颜色 颜色会和全局着色相乘
GUI.backgroundColor = Color.yellow;//背景颜色 颜色会和全局着色相乘
GUI.Button(rect,"red按钮")
GUI.color = Color.white;//可以再写一个来修改
GUI.Button(rect,"white按钮")

整体皮肤样式

//全局的皮肤样式 默认是null
//可以去创建GUI Skin文件 里面是各种控件的gui style
GUI.skin = null;

GUILayout自动布局

  • GUILayout可以点出GUI中的各种控件
  • 会自动布局 自动调整控件的大小 不需要传入Rect
  • 主要用于编辑器开发
  • 可以和GUI配合使用
GUILayout.BeginHorizontal(new Rect(100,100,100,100));//水平绘制 可以修改大小范围等等
GUILayout.Button("测试按钮");
GUILayout.Button("测试按钮");
GUILayout.Button("测试按钮");
GUILayout.EndHorizontal();

GUILayoutOption布局规则

GUILayout.Button("测试按钮"GUILayoutOption可变参数可传入多个);
//控件的固定宽高
GUILayoutOption.Width(300);
GUILayoutOption.Height(200);
//允许控件的最小宽高
GUILayout.MinWidth(50);
GUILayout.MinHeight(50);
//允许控件的最大宽高
GUILayout.MaxWidth(100);
GUILayout.MaxHeight(100);
//允许或禁止水平拓展
GUILayout.ExpandWidth(true);//允许
GUILayout.ExpandHeight(false);//禁止
GUILayout.ExpandHeight(true);//允许
GUILayout.ExpandHeight(false);//禁止