UG1L8——窗口相关

本章代码关键字

1
2
3
GUI.Window()        //绘制窗口
GUI.ModalWindow() //绘制模态窗口,可以让该窗口以外的其他可见控件不再有用
GUI.DragWindow() //可拖动窗口

窗口

  • 第一个参数是是窗口的唯一ID,不要和别的窗口重复!如果窗口id相同,则上一个窗口会被顶掉
  • 第二个参数是用于绘制窗口用的委托函数,要参数为int​无返回值的函数,传入的参数是窗口的ID
  • 第三个参数是窗口的标题

不同窗口调用相同委托参数,委托函数可以传入窗口的id来做不同的处理,如果窗口id相同,则上一个窗口会被顶掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void OnGUI()
{
//第一个参数 id 是窗口的唯一ID 不要和别的窗口重复
//第二个参数 是用于 绘制窗口用的委托函数 传入即可
//第三个参数 是窗口的标题
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
//不同窗口调用相同委托参数 委托函数可以传入窗口的id来做不同的处理
//如果窗口id相同,则上一个窗口会被顶掉
GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口");
}

private void DrawWindow(int id)
{
switch (id)
{
case 1:
if (GUI.Button(new Rect(0, 30, 30, 20), "1"))
{
isModel = true;
break;
}
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
}
}

模态窗口

模态窗口,可以让该窗口以外的其他可见控件不再有用,可以理解为该窗口在最上层,其他按钮都点不到了,只能点击该窗口的上的控件
类似于警告窗口,或者说Windows的UAC窗口(笑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private bool isModel = false;

private void OnGUI()
{
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口");

/* 模态窗口 可以让该其他可见不再有用
* 可以理解为该窗口在最上层 其他按钮都点不到了
* 只能点击该窗口的上的控件
*/
if (isModel)
{
GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
}
}

private void DrawWindow(int id)
{
switch (id)
{
case 1:
if (GUI.Button(new Rect(0, 30, 30, 20), "1"))
{
isModel = true;
break;
}
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
case 3:
if (GUI.Button(new Rect(0, 30, 30, 20), "3"))
{
isModel = false;
break;
}
break;
}
}

可拖动窗口

窗口可以返回这一帧所在的位置(Rect​),因此我们可以声明一个Rect​变量来存储窗口的位置尺寸状态
但是位置赋值只是一个前提,可拖动窗口的窗口绘制委托函数里还需要调用GUI.DragWindow()​!
GUI.DragWindow()​可以传入一个Rect​值,它将决定窗口的哪个部分可以移动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private Rect dragWinPos = new Rect(400, 400, 200, 100);
private bool isModel = false;

private void OnGUI()
{
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口");
//拖动窗口
//注意,位置赋值只是前提
//委托函数里需要调用GUI.DragWindow();
dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "可拖动窗口");
}

private void DrawWindow(int id)
{
switch (id)
{
case 1:
if (GUI.Button(new Rect(0, 30, 30, 20), "1"))
{
isModel = true;
break;
}
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
case 4:
//该API 写在窗口函数中调用 可以让窗口被拖动
//传入Rect参数的重载,作用是决定窗口的哪一部分位置 可以被拖动
//默认不填 就是无参重载 默认窗口的所有位置都可以被拖动
GUI.DragWindow(new Rect(0, 0, 1000, 20));
break;
}
}

窗口完整示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
private Rect dragWinPos = new Rect(400, 400, 200, 100);
private bool isModel = false;

private void OnGUI()
{
//第一个参数 id 是窗口的唯一ID 不要和别的窗口重复
//第二个参数 是用于 绘制窗口用的委托函数 传入即可
//第三个参数 是窗口的标题
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
//不同窗口调用相同委托参数 委托函数可以传入窗口的id来做不同的处理
//如果窗口id相同,则上一个窗口会被顶掉
GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, "测试窗口");

/* 模态窗口 可以让该其他可见不再有用
* 可以理解为该窗口在最上层 其他按钮都点不到了
* 只能点击该窗口的上的控件
*/
if (isModel)
{
GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
}

//拖动窗口
//注意,位置赋值只是前提
//委托函数里需要调用GUI.DragWindow();
dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "可拖动窗口");
}

private void DrawWindow(int id)
{
switch (id)
{
case 1:
if (GUI.Button(new Rect(0, 30, 30, 20), "1"))
{
isModel = true;
break;
}
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
case 3:
if (GUI.Button(new Rect(0, 30, 30, 20), "3"))
{
isModel = false;
break;
}
break;
case 4:
//该API 写在窗口函数中调用 可以让窗口被拖动
//传入Rect参数的重载,
//作用是决定窗口的哪一部分位置 可以被拖动
//默认不填 就是无参重载 默认窗口的所有位置都可以被拖动
GUI.DragWindow(new Rect(0, 0, 1000, 20));
break;
}
}