IMGUI的Controls控件类型小总结

1.Label

非交互的,不能点击或移动,只用于显示信息;不可交互的Control不需要有返回值,有交互的需要定义变量接收返回值;

GUI.Lable(new Rect(0,0,100,100),"Label");

2.Button

这是一个简单的Button,每次按下不管按下多久都会只有一次点击事件,会在button按钮被释放时响应事件;

if(GUI.Button(new Rect(0,0,100,100),"Button")){
    //do when button is clicked
}

3.RepeatButton

它和Button的区别在于,在点击一次之后,它会持续保持按下状态,也就是当它点击一次后响应事件会在之后每一帧都调用;

if(GUI.RepeatButton(new Rect(0,0,100,100),"RepeatButton"))

4.TextField / AreaField

显示一行和显示多行信息(可以换行)的区别

5.Toggle

单选框,有两种状态,通过点击进行切换;注意函数参数,第二个为Toggle的当前状态,一般和接收状态的变量为同一个;

bool toggleState=false;
toggleState=GUI.Toggle(new Rect(0,0,10,10),toggleState, new GUIContent("toggle"));

6.ToolBar

工具条,包含一行按钮;每一次只有一个按钮可以被选中,类似于一个单选的Toggle组或者页签;

注意函数参数:第三个参数为一个GUIContent数组,第二个参数为当前激活的按钮的索引;

返回值是当前选中的按钮索引值;

private int toolbarInt=0;
private GUIContent[] toolbarContents={new GUIContent("toolbar1"),new GUIContent("toolbar2"),new GUIContent("toolbar3")};

void OnGUI(){
    toolbarInt=GUI.Toolbar(new Rect(),toobarInt,toolbarContents);
}

7.SelectionGrid

它是一个多行的Toolbar,也就是在之前Toolbar的基础上加入第四个参数,也就是该Grid的行数,其它与Toolbar相同;

如果想要创建一列按钮组,就可以使用这个,然后让按钮的数量和行数相同即可;

8.HorizontalSlider / VerticalSlider

创建一个水平滑动条,通过拖动滑块修改值;

函数参数:第二个参数为当前滑动条的值,第三个和第四个为滑块两端的最大和最小值;

float sliderVal=3;
sliderVal=GUI.HorizontalSlider(new Rect(),sliderVal,0,10.0f);

9.HorizontalScrollbar / VerticalScrollbar

滚动条,多用于滚动视图;它和滑动条类似,但是多了一个参数;第三个参数定义了滑块的尺寸大小,从而决定了视图可见的大小;

float barVal=GUI.VerticalScrollbar(new Rect(),barVal,1.0,0,10);

10.ScrollView的实现,BeginScrollView()和EndScrollView()

一个滚动视图主要由三部分组成,最外围的大panel,用于滚动的视图,以及滚动条;所以,函数参数也和这三者有关;

BeginScrollView第一个参数Rect,定义整个ScrollView的大小;第二个参数Vector2,定义在水平和数值方向的滚动值,在滚动时会将其返回;第三个参数Rect,定义内部滚动视图的大小(位置是相对于第一个Rect);第四个和第五个参数bool,分别定义是否显示水平和数值的滚动条;

返回值是一个Vector2,返回滚动视图的滚动位置;

GUI.BeginScrollView(new Rect(),Vector2.zero,new Rect(),true,true)
GUI.EndScrollView();

11.Window

windows是可以拖拽的Control是,当被点击时可以接收或者失去focus;因此,它的实现和其它Controls稍有不同,每个窗口都有id,而且选中窗口时会调用回调函数的参数;

参数:第一个参数是id,第二个参数是Rect,第三个参数是窗口的绘制函数,第四个是GUIContent;

void OnGUI(){
    Rect WindowRect=new Rect();
    WindowRect=GUI.Window(0,WindowRect,WndFunc,new GUIContent());
}

void WndFunc(){
    //Draw any Controls inside the windows
}

12.GUI.changed

用于去检测用户在GUI中的动作,只有当检测到有改变的时候,我们才会去进行一些赋值工作,而不是每一帧都去做赋值工作;