Unity开发日记【第十天】——视觉差、主界面和暂停菜单

目录

一、视觉差

二、主菜单

三、暂停菜单 


一、视觉差

今天尝试一个在游戏中实现一个好玩的功能Parallax(视觉差),简单来说可以让不同的图层以不同的速度移动显得更加有层次感

首先我们因为要操作背景图片,为了避免一些不必要的麻烦,我们把当时为了实现镜头跟随而给背景图片加的碰撞器新建一个游戏对像,然后把背景的图片碰撞器删除。然后我们写一下实现视觉差效果的代码,本次代码通过Cam这个变量来获取相机的移动,当相机的位置发生改变的时候,使用这个代码的物体会按照MoveRate的速度移动

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

public class Parallax : MonoBehaviour
{
    public Transform Cam; //获得摄像机的位置
    public float MoveRate;  //移动的速度
    private float StartPoint; //初始位置

    void Start()
    {
        StartPoint = transform.position.x; //获得当前物体的坐标
    }

    
    void Update()
    {
        transform.position = new Vector2(StartPoint + Cam.position.x * MoveRate, transform.position.y); //移动
    }
}

我们把代码拖拽添加到背景图片上,然后把对应的变量添加进去,设定好速度(相机可以设置为主相机) 这样我们就实现了功能。

二、主菜单

游戏已经基本都实现了,我们现在要尝试实现一下游戏的主菜单界面(游戏开始界面),我们需要创建一个新的场景来制作这个界面,我们主要是需要创建一个UI来制作这个界面,同样按照之前UI的制作过程,我们需要先创建一个画布,然后我们在这个上面创建一个面板(Panel)

什么是Panel呢?

Panel又叫面板组件,它实质上是一个容器,可以在上面放置其他UI元素。当我们调整Panel的时候,容器中的其他元素也会跟着移动。

但是Panel是一个圆角的矩形,会露出下面的背景,所以第一步我们要解决这个问题,在Panel的界面为其设置原图像,如果没有可以设置为None,我这里用了自己游戏的一张截图,然后调整光效使其更加真实

然后我们在创建一个新的Panel来承载按钮,也可以给背景图做一个颜色渐变,最后的效果图:

然后为了我们在这个面板上添加UI > 按钮来制作主菜单的界面。

这里我发现了一个bug在屏幕大小发生变化后UI不能自适应改变,在UI的画布上选择UI缩放模式为屏幕大小缩放,就可以解决该问题。

另外我从资源商店下载的字体只能在旧版的Text中使用,如果我们要 使用TextMeshPro(TMP)就需要生成对应的字体资源,具体的过程可以看下面这个教程

https://www.bilibili.com/read/cv8395060/

注意,这里一定要找到TTF文件才可以生成否则会报错

然后修改好分辨率后点击Apply就可以了

然后我们新建Button后会自动新建好Button里面的字,我们设置好字体大小位置和按钮颜色,其中Button的颜色是在这里设置的。

我们用同样的方式来设置另一个退出游戏的按键,那么接下来我们就要给两个按钮配上对应的代码实现它们的功能,我们把代码添加到两个按钮的父集上,也就是我们创建的容器,代码和之前场景切换的思路是一样的,直接加载下一个场景,代码如下:(记得加入场景管理的头文件)

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

public class Menu : MonoBehaviour
{
    public void StartGame() //开始游戏
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); //加载下一个场景
    }

    public void Exit() //退出游戏
    {
        Application.Quit();
    }
}

然后,我们把代码挂载到容器上后我们找到开始游戏的Button然后在检查器的最下面,我们可以看到

下面这样一个窗口,我们点击加号 

 

然后我们设置好鼠标点击的时候调用MainMenu的脚本中的函数StartGame

在测试之前不要忘记把当前场景添加进游戏里面(左上角:文件 > 生成设置)

然后我们我们给背景做一个渐渐出现的动画,这和之前的制作对话框渐入渐出的过程是一样的,这里就不赘述了。只需要记得关闭循环时间,防止它一直循环。接下来,希望播放完这个渐出的动画后我们的文字才出现。创建一个新的对象,我们把标题和按钮放在下面,我们只需要调整它是否使用我们就可以控制界面的出现和消失了。

然后我们来编写实现功能的代码。

public GameObject UI;

public void UIEnable()
{
    UI.SetActive(true);
}

 我们把UI这个对象拖到对应的位置上

最后和以前一样,我们在动画结尾添加一个事件来调用这个函数。

三、暂停菜单 

 和之前一样我们首先我们需要新建一个面板,在那个上面制作后续的UI,

然后创建一个暂停界面唤醒的按钮(这个按钮不放在面板上,因为它是唤醒面板的。)

然后新建一个面板,并在上面创建好我们需要的返回的按钮,这里我创建了三个按钮,分别是返回当前游戏界面,返回主界面,还有一个音量控制的滑动条。

 

 最后我大概做成了这样,滑动条包括三个子变量

 Background:滑动条的背景

Fill Area:滑过的部分

Handle:滑动条上的按钮

我们可以在这三个上面分别更改他们的颜色等其他属性,我们都调整完毕,这样我们就制作玩了这个面板,接下来我们就要开始编写代码,其中两个按钮的功能实现都是比较简单的,返回主菜单的按钮让他直接加载场景主菜单就可以,另一方面我们需要写一个函数来给我们的PAUSE按钮调用,目的是一开始让暂停游戏的菜单处在关闭状态,当按下时激活,那么返回游戏的函数只需要重新关闭这个菜单就可以。具体代码如下:

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

public class PauseMenu : MonoBehaviour
{
    public GameObject Menu;

    public void WakeupMenu() //唤醒暂停菜单
    {
        Menu.SetActive(true);
    }

    public void ReturnMain() //返回主菜单
    {
        SceneManager.LoadScene("Menu"); //返回主菜单
    }

    public void ReturnGame() //返回游戏
    {
        Menu.SetActive(false);
    }
}

 这样两个按钮的功能就全部实现了,但是此时我们发现在暂停窗口出现的时候游戏还是在动的,我们需要暂停游戏的时间所以我们需要添加一句代码到对应位置就可以实现。

Time.timeScale = 0f; //暂停游戏时间
Time.timeScale = 1f; //恢复游戏时间

PS:我们在返回主界面的时候也需要把游戏时间恢复,否则会出现卡住的bug 

 【注】我们可以通过对这个数值的修改实现时间加速或者减速的效果

接下来我们尝试实现通过滑动按钮控制音量,为了实现这个功能我们需要新建一个音频混合器

在上面窗口的菜单中找到音频混合器窗口

 音频混合器其实就是一个调音台,每种声音都可以有自己的声道,然后在调音台进行控制,比如我们可以看见我们之前添加的背景音乐现在并没有输出的声道

我们可以把它加到Master上

 这样我们就可以在音频混合器上调整这个声音,我们可以看见这个声音的范围是从-80到20,但是注意20是放大声音可能出现音损,所以范围写成-80到0也可以

 我们把这个范围赋值给我们的滑动条

 接下来我们要把这两个东西Link到一起,我们来到代码,首先我们要加上头文件

using UnityEngine.Audio这样我们才可以创建相应的对象

public AudioMixer BGMAudio; //背景音乐

 然后我们将对应的音频混合器加进去

首先为了可以使用代码改变音量的数值,我们必须把对应的属性在音频混合器中变成代码可编辑的

进入上图所示的界面,然后在检查器的地方右键音量,然后点击变成代码可编辑的这样我们在旁边就可以看见了(这个名字是可以自己改的,但是请记住这个名字后面需要的)

这样我们就可以用下面的代码来改变这个数值

    public void SetVolume(float value) //音量控制
    {
        Audio.SetFloat("MainVolume", value);
    }

然后我们就可以在滑动条的界面调用这个函数 (注意我们这里在选择函数的时候有两个同名函数可以选择,请注意我们要选择上面的,下面的选择后要求我们设定一个固定的float的数字,而上面的会自动获取滑动条的数值)

 

 用同样的方法我们可以把所有特效的音量加以控制。

然后我发现了一个问题,就是在场景切换的时候,音量的滑条会自己复原,但是音量不会变化。所以我决定在每次按下暂停按钮的时候用当前的音量初始化滑条的位置

代码如下:

    public Slider BGMSlider; //背景音乐滑块
    public Slider SoundSlider; //音效音乐滑块

    private float volume; //用以初始化的音量

    public void WakeupMenu() //唤醒暂停菜单
    {
        /* 初始化音量滑块部分的位置 */
        Audio.GetFloat("BGMVolume", out volume);
        BGMSlider.value = volume;
        Audio.GetFloat("SoundVolume", out volume);
        SoundSlider.value = volume;
    }

猜你喜欢

转载自blog.csdn.net/qq_50688324/article/details/127132201