8.开始界面

8.开始场景-开始界面


8.1 知识点

拖一个自定义GUI的根对象,创建一个开始面板空物体,拼接开始面板上的控件


开始面板的标题标签可以用两个不同颜色的标签进行叠加

添加三个按钮,调整位置

理清面板基类要做的事,面板基类抽象出所有面板共有的逻辑,所有面板都会继承这个面板基类

创建面板基类,变成泛型,并且约束成类,实现面板基类单例,实现面板基类显隐

//泛型面板基类 要约束成类 才能在Awake里as成对应传进来的泛型类
public class BasePanel<T> : MonoBehaviour where T:class
{
    //实现面板基类单例
    //继承了MonoBehaviour,所以不能直接new

    //两个关键的静态成员
    //私有的静态成员变量(申明)
    private static T instance;
    //公共的静态成员属性或者方法(获取)
    public static T Instance => instance;

    private void Awake()
    {
        //在Awake中初始化的 原因是
        //我们的面板脚本 在场景上 肯定只会挂载一次
        //那么我们可以在这个脚本的生命周期函数的Awake中
        //直接记录场景上 唯一的这个脚本
        instance = this as T;
    }

    //实现面板基类显隐
    //面板脚本最终是要挂载到对应的面板游戏对象上的,通过控制面板游戏对象是显隐来控制面板的显示隐藏

    //显示面板
    public virtual void ShowMe()
    {
        this.gameObject.SetActive(true);
    }

    //隐藏面板
    public virtual void HideMe()
    {
        this.gameObject.SetActive(false);
    }
}

创建开始面板脚本,继承面板基类传入泛型,挂载到开始面板空物体上,声明开始面板中的公共的成员变量,拖拽赋值,Start内,监听各个按钮点击事件,让鼠标锁定到Game窗口内

//开始面板
public class BeginPanel : BasePanel<BeginPanel>
{
    //声明开始面板中的公共的成员变量 来关联各个控件
    public CustomGUIButton btnBegin;
    public CustomGUIButton btnSetting;
    public CustomGUIButton btnQuit;
    public CustomGUIButton btnRank;
    
    void Start()
    {
        //监听各个按钮点击事件
        btnBegin.clickEvent += () =>
        {
            //切换场景
            SceneManager.LoadScene("GameScene");
        };
        btnSetting.clickEvent += () =>
        {
            //打开设置面板
            SettingPanel.Instance.ShowMe();
            //隐藏自己 避免穿透
            HideMe();
        };
        btnQuit.clickEvent += () =>
        {
            //退出游戏
            Application.Quit();
        };
        btnRank.clickEvent += () =>
        {
            //打开排行榜面板

            //避免穿透 隐藏自己
            HideMe();
        };

        //让鼠标锁定到Game窗口内
        //目的是因为方便控制坦克的头部转向 所以锁定鼠标在窗口内 避免鼠标出去不好控制
        Cursor.lockState = CursorLockMode.Confined;
    }
}

8.2 知识点代码

BasePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//泛型面板基类 要约束成类 才能在Awake里as成对应传进来的泛型类
public class BasePanel<T> : MonoBehaviour where T:class
{
    //实现面板基类单例
    //继承了MonoBehaviour,所以不能直接new

    //两个关键的静态成员
    //私有的静态成员变量(申明)
    private static T instance;
    //公共的静态成员属性或者方法(获取)
    public static T Instance => instance;

    private void Awake()
    {
        //在Awake中初始化的 原因是
        //我们的面板脚本 在场景上 肯定只会挂载一次
        //那么我们可以在这个脚本的生命周期函数的Awake中
        //直接记录场景上 唯一的这个脚本
        instance = this as T;
    }

    //实现面板基类显隐
    //面板脚本最终是要挂载到对应的面板游戏对象上的,通过控制面板游戏对象是显隐来控制面板的显示隐藏

    //显示面板
    public virtual void ShowMe()
    {
        this.gameObject.SetActive(true);
    }

    //隐藏面板
    public virtual void HideMe()
    {
        this.gameObject.SetActive(false);
    }
}

BeginPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

//开始面板
public class BeginPanel : BasePanel<BeginPanel>
{
    //声明开始面板中的公共的成员变量 来关联各个控件
    public CustomGUIButton btnBegin;
    public CustomGUIButton btnSetting;
    public CustomGUIButton btnQuit;
    public CustomGUIButton btnRank;
    
    void Start()
    {
        //让鼠标锁定到Game窗口内
        //目的是因为方便控制坦克的头部转向 所以锁定鼠标在窗口内 避免鼠标出去不好控制
        Cursor.lockState = CursorLockMode.Confined;

        //监听各个按钮点击事件

        btnBegin.clickEvent += () =>
        {
            //切换场景
            SceneManager.LoadScene("GameScene");
        };
        btnSetting.clickEvent += () =>
        {
            //打开设置面板
            SettingPanel.Instance.ShowMe();
            //隐藏自己 避免穿透
            HideMe();
        };
        btnQuit.clickEvent += () =>
        {
            //退出游戏
            Application.Quit();
        };
        btnRank.clickEvent += () =>
        {
            //打开排行榜面板
            RankPanel.Instance.ShowMe();
            //避免穿透 隐藏自己
            HideMe();
        };

    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏