因为暑假跟着老师做大创项目,需要用到UI方面的内容,所以在这里先记下关于UI的内容。目前我的游戏已经有了基本的雏形,现在的情况是在回补之前落下的笔记,因为大创的缘故我的学习进度和笔记进度差了好多,好纠结到底要不要继续补上(

在之后的笔记中,我会加入自己大创项目中的一些内容,本篇总结的是M_Studio教学中的P25、26两节,以及

一、主菜单:

主菜单相当于是一个新的场景,在Scene文件夹下创建一个新的Scene名为Menu,进入新场景在Hierarchy窗口中新建一个panel,在游戏场景中可以看到生成了一个类似蒙版的东西,在右侧Inspector窗口中的SourceImage中为其添加我们需要的背景图片,如果不做此步操作的话,这个Panel并不能填充整个画面,这是一个圆角矩形,要是没有图面我们也要在SourceImage中选择None。

接下来我们为主菜单添加按钮:play和quit。我们再创建一个Panel,用来盖住上面一个Panel创建的图片,在上面添加两个按钮,有两种Button,后面带TextMeshPro的是可以添加艺术字的,我们选择这个。

添加完成标题和按钮后效果如图(忽略这个阴间配色……),在这里补充,选中任何一个Button,在右侧Inspector窗口中,Button组件可以调整按钮在平时、光标选中、点击时的颜色,在此不做演示。

下一步我们要为按钮添加功能,开始游戏和退出游戏,直接上代码

    public void PlayGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }
    public void QuiteGame()
    {
        Application.Quit();
    }

退出游戏QuitGame()函数没有什么好说的,PlayGame中用到了SceneManager中的一些函数,在最开始要导入UnityEngine.SceneManager这个包,LoadScene函数是用来加载场景的,我们要从主菜单跳到第一关,所以是在当前场景编号的基础上+1,具体设置在File->BuiSettings中,我们可以在ScenesInBuild窗口中调整这几个场景的编号顺序,将主菜单调整到第一关前面,就实现了PlayGame函数的功能。

之后我们把脚本挂在到Canvas上Play和Quit的父级物体也就是Menu上,在Button的Inspector窗口中有一个OnClick选项,点击右下方的加号,将刚才挂载脚本的物体拖过来,选择挂载脚本的名称,就能在里面找到我们刚才写好的函数了。

在此我们就实现了基本的主菜单功能。

接下来我们要为主菜单录制一段入场动画,具体效果我在这用文字表述:为盖在图片上的那层Panel的不透明度打上关键帧,逐渐提高他的不透明度,在动画播放完成后主菜单上的文字才显示出来。

首先我们选中Panel,为他新建一个动画,点击红点录制,在开始出把他的不透明度设置一个值,结束处设置另一个值,在不同位置设置不同的 值Unity会自动添加关键帧。

接下来我们在Menu菜单中添加一个让文字显示出来的函数UIAble,直接上代码:

    public void UIable()
    {
        GameObject.Find("Canvas/Menu/UI").SetActive(true);
    }

这句代码的意思就是,程序在Hierarchy窗口中寻找到我要找的内容,也就是文字,并把它的激活状态设置true。

回到Unity中,在刚才的Animation窗口中,我们为在结尾处添加一个事件,也就是UIAble()函数。这样就完成了动画的创建。

 二、暂停菜单:

回到我们的游戏场景中,我们现在要为游戏添加暂停菜单,第一步肯定是要先创建一个暂停的按钮,在此不做赘述。

下面我们来实现按钮按下后要实现的功能:弹出一个菜单,这一步我们需要创建一个Panel,调整好这个panel的大小,并为其添加一个音量的滑条slider(这个设计到音频控件,之后再说),和一个Resume返回游戏的按钮。效果如图:

 首先我们来实现点击Pause按钮可以弹出菜单:仔细分析不难发现这个和主菜单中那个实现UIAble的函数大同小异,这里我们换一种写法,上代码:

    public GameObject PauseGame;

    public void PauseMenu()
    {
        PauseGame.SetActive(true);
        Time.timeScale = 0f;
    }
    public void ResumeGame()
    {
        PauseGame.SetActive(false);
        Time.timeScale = 1f;
    }

 可以看出只不过是这种写法是我们手动把PauseMenu给到了代码,而上面一种方式是通过查找的方式,但两者都是通过SetActive实现的,其实这个过程也不一定非要使用代码,Unity中直接就有SetActive的设置。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐