9.组合控件-窗口相关
9.1 知识点
窗口
Window静态方法 创建一个窗口
private void OnGUI()
{
//Window静态方法 创建一个窗口
//创建一个弹出窗口。
//第一个参数 id 是窗口的唯一ID 不要和别的窗口重复
//第二个参数 是位置宽高 表示窗口位置和大小的屏幕矩形。
//第三个参数 是委托参数 是用于 绘制窗口用的函数 传入即可
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
//id对于我们来说 有一个重要作用 除了区分不同窗口 还可以在一个函数中去处理多个窗口的逻辑
//通过id去区分他们
GUI.Window(2, new Rect(100, 250, 200, 150), DrawWindow, "测试窗口2");
}
// 绘制窗口函数
private void DrawWindow(int id)
{
// 可以根据窗口id进行判断
switch (id)
{
case 1:
GUI.Button(new Rect(0, 30, 30, 20), "1");
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
case 3:
GUI.Button(new Rect(0, 30, 30, 20), "3");
break;
}
}
效果
模态窗口
ModalWindow静态方法 创建一个模态窗口
// 显示一个模态窗口。
// 模态窗口可以让其它控件不再有用。
// 你可以理解该窗口在最上层,其它按钮都点击不到了,只能点击该窗口上控件。
GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
// 可能应用于警告弹窗,必须先处理的弹出
效果
拖动窗口
拖动窗口要把位置实时赋值
// 位置赋值只是前提,还需要在窗口委托中进行处理
dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖动窗口");
DragWindow静态方法 写在绘制窗口函数定义可拖动窗口以及位置
// 可以根据窗口id进行判断
private void DrawWindow(int id)
{
//可以根据窗口id进行判断
switch (id)
{
case 4:
//DragWindow静态方法 让窗口变成拖动窗口
//使窗口可被拖动。
//该API 写在窗口函数中调用 可以让窗口被拖动
//传入Rect参数的重载 作用
//是决定窗口中哪一部分位置 可以被拖动
//默认不填 就是无参重载 默认窗口的所有位置都能被拖动
//GUI.DragWindow();
GUI.DragWindow(new Rect(0, 0, 1000, 20));//这样只有窗口上面一点的位置拖动才有用
break;
}
}
效果
9.2 知识点代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson09_复合控件_窗口相关 : MonoBehaviour
{
private Rect dragWinPos = new Rect(400, 400, 200, 150);
private void OnGUI()
{
#region 知识点一 窗口
//Window静态方法 创建一个窗口
//创建一个弹出窗口。
//第一个参数 id 是窗口的唯一ID 不要和别的窗口重复
//第二个参数 是位置宽高 表示窗口位置和大小的屏幕矩形。
//第三个参数 是委托参数 是用于 绘制窗口用的函数 传入即可
GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, "测试窗口");
//id对于我们来说 有一个重要作用 除了区分不同窗口 还可以在一个函数中去处理多个窗口的逻辑
//通过id去区分他们
GUI.Window(2, new Rect(100, 250, 200, 150), DrawWindow, "测试窗口2");
#endregion
#region 知识点二 模态窗口
//ModalWindow静态方法 创建一个模态窗口
//显示一个模态窗口。
//模态窗口 可以让该其它控件不在有用
//你可以理解该窗口在最上层 其它按钮都点击不到了
//只能点击该窗口上控件
//GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow, "模态窗口");
//可能应用于警告弹窗 必须先处理的弹出
#endregion
#region 知识点三 拖动窗口
//拖动窗口要把位置实时赋值
//位置赋值只是前提 还需要找窗口委托中进行处理
dragWinPos = GUI.Window(4, dragWinPos, DrawWindow, "拖动窗口");
#endregion
}
//绘制窗口函数
private void DrawWindow(int id)
{
//可以根据窗口id进行判断
switch (id)
{
case 1:
GUI.Button(new Rect(0, 30, 30, 20), "1");
break;
case 2:
GUI.Button(new Rect(0, 30, 30, 20), "2");
break;
case 3:
GUI.Button(new Rect(0, 30, 30, 20), "3");
break;
case 4:
//DragWindow静态方法 让窗口变成拖动窗口
//使窗口可被拖动。
//该API 写在窗口函数中调用 可以让窗口被拖动
//传入Rect参数的重载 作用
//是决定窗口中哪一部分位置 可以被拖动
//默认不填 就是无参重载 默认窗口的所有位置都能被拖动
//GUI.DragWindow();
GUI.DragWindow(new Rect(0, 0, 1000, 20));//这样只有窗口上面一点的位置拖动才有用
break;
}
}
}
9.3 练习题
在之前制作的开始界面中,点击退出游戏按钮,弹出一个模态窗口,让玩家确定是否退出(退出,取消),点击取消后关闭窗口,点击退出后 退出游戏
创建退出提示面板并绘制模态窗口
private void OnGUI()
{
// 绘制模态窗口
GUI.ModalWindow(1, winPos, DrawWindow, "提示"); // **API: GUI.ModalWindow**
}
private void DrawWindow(int id)
{
// 标签
GUI.Label(labPos, "是否退出"); // **API: GUI.Label**
// 两个按钮
if(GUI.Button(btnPos1, "退出"))
{
Application.Quit(); // **API: Application.Quit**
}
if(GUI.Button(btnPos2, "取消"))
{
HideMe(); // **API: HideMe()**
BeginPanel.ShowMe(); // **API: BeginPanel.ShowMe()**
}
}
添加面板共有的单例显示隐藏逻辑,并添加点击退出按钮弹出退出提示面板的逻辑
// 面板的显示隐藏逻辑,所有地方都能够快速使用的
private static QuitTipPanel instance;
public static void ShowMe()
{
if (instance != null)
{
instance.gameObject.SetActive(true); // **API: gameObject.SetActive(true)**
}
}
public static void HideMe()
{
if (instance != null)
{
instance.gameObject.SetActive(false); // **API: gameObject.SetActive(false)**
}
}
private void Awake()
{
instance = this;
HideMe();
}
修改窗口各个参数,查看效果
9.4 练习题代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#region Lesson09 练习题一
//在之前制作的开始界面中,点击退出游戏按钮,弹出一个模态窗口,让玩家确定是否退出(退出,取消),点击取消后关闭窗口,点击退出后 退出游戏
//退出提示面板
public class QuitTipPanel : MonoBehaviour
{
//面板的显示隐藏 所有地方都能够快速使用的
//静态 方法 和静态变量 就可以直接通过类名就用了
private static QuitTipPanel instance;
public static void ShowMe()
{
if (instance != null)
{
instance.gameObject.SetActive(true);
}
}
public static void HideMe()
{
if (instance != null)
{
instance.gameObject.SetActive(false);
}
}
public Rect winPos;
public Rect labPos;
public Rect btnPos1;
public Rect btnPos2;
private void Awake()
{
instance = this;
HideMe();
}
private void OnGUI()
{
//绘制模态
GUI.ModalWindow(1, winPos, DrawWindow, "提示");
}
private void DrawWindow(int id)
{
//标签
GUI.Label(labPos, "是否退出");
//两个按钮
if( GUI.Button(btnPos1, "退出") )
{
Application.Quit();
}
if( GUI.Button(btnPos2, "取消") )
{
HideMe();
BeginPanel.ShowMe();
}
}
}
#endregion
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com