9.窗口相关

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

×

喜欢就点赞,疼爱就打赏