Unity3D学习记录(跑酷小游戏第二阶段)(续)

约完高中同学今天又和初中同学玩…感觉有点跟不上进度了,不过问题不大,把该约的约完,后面的时间就专心学习看书提升吧。


突然发现GUI的背景音乐相关的还没有设置,今天来把它完成。

本日目标:

导入背景音乐并管理
完成与背景音乐相关的GUI设置

实现过程:

一.GUI框架补充

加上一个控制音量的按钮,并且需要通过点击来切换贴图和对应的音量,一步一步来。先把按钮创建了。
把贴图的名字定义为变量,用于后面切换:

private string _GUIVolumeSkinName = "Btn_FullVolume";//记得初始化

按钮定义:

if (GUI.Button(new Rect(Screen.width - 120,
            Screen.height -120, TxtVolume.width, TxtVolume.height), "", ProjectSkin.GetStyle(_GUIVolumeSkinName)))
        {
             //切换音量函数
        }

先来实现点击按钮切换按钮贴图的效果。考虑到贴图有三个(全音量,半音量,无音量),而且音量设置要应用在每一个关卡(场景),我们需要新建一个全局的脚本命名为_GlobalManager(删掉初始的start,update函数,仅仅作为一个类来使用)来放一些全局的设置,然后在脚本中定义一个枚举类型,来表示音量的几种状态(记得多加一个none来初始化,更加严谨)

public enum ProjectVolume { none,FullVolume,HalfVolume,NoneVolume}
public class GlobalManager : MonoBehaviour {
	public static ProjectVolume GlobalVol = ProjectVolume.none;
}

然后在之前的控制GUI的脚本中写一个函数用来切换音量和按钮贴图,这里要用到switch语句(需要传入projectvolume参数)
为了实现点击后切换的效果,每一个case都要将枚举变量的值改到下一种音量状态对应的值,修改贴图名字的变量也是如此。

void ChangeProjectVol(ProjectVolume ProVol)
{
	switch(ProVol)
        {
            case ProjectVolume.none:
                GlobalManager.GlobalVol = ProjectVolume.none;
                break;
            case ProjectVolume.NoneVolume:
                GlobalManager.GlobalVol = ProjectVolume.FullVolume;
                _GUIVolumeSkinName = "Btn_FullVolume"break;
            case ProjectVolume.HalfVolume:
                GlobalManager.GlobalVol = ProjectVolume.NoneVolume;
                _GUIVolumeSkinName = "Btn_NoneVolume"break;
            case ProjectVolume.FullVolume:
                GlobalManager.GlobalVol = ProjectVolume.HalfVolume;
                _GUIVolumeSkinName = "Btn_HalfVolume";
                break;
            default:
                break;
        }
}

到这一步已经看得出点击按钮改变贴图的效果了,接下来来实现音量改变。

二.音量控制

要在游戏中能听到声音至少需要一对组件:Audio Listener和Audio Source
在游戏界面的摄像机上默认附带了一个Audio Listener,将其删掉,我们用一个Game Object来专门管理一个场景的声音。建一个名为_AudioManager的空物体,add一个Audio Listener组件,然后在其里面建一个BackgroundMusic的子物体,加一个Audio Source组件,并把背景音乐拖到Source里的AudioClip一栏,我就随便拖一个了(石头门赛高!)
Unity3D学习记录(跑酷小游戏第二阶段)(续)_第1张图片
然后我们需要用脚本来控制其Volume属性,在GUI脚本中定义一个Audio Source,然后获取到BackgroundMusic上对应的组件。这里是用到了GameObject的find方法来获取场景中对应的物体,然后用GetComponent方法获取上面的组件。

public AudioSource ASBackgroundMusic;
ASBackgroundMusic = GameObject.Find("_AudioManager/_BackGroundMusic").GetComponent<AudioSource>();

获取到组件后就可以初始化,并在之前的switch语句中修改音量了~

ASBackgroundMusic.loop = true;//设置循环播放
ASBackgroundMusic.volume = 1f;//满音量
ASBackgroundMusic.Play();//播放

之前的switch语句:

switch(ProVol)
        {
            case ProjectVolume.none:
                GlobalManager.GlobalVol = ProjectVolume.none;
                break;
            case ProjectVolume.NoneVolume:
                GlobalManager.GlobalVol = ProjectVolume.FullVolume;
                _GUIVolumeSkinName = "Btn_FullVolume";
                ASBackgroundMusic.volume = 1F;
                break;
            case ProjectVolume.HalfVolume:
                GlobalManager.GlobalVol = ProjectVolume.NoneVolume;
                _GUIVolumeSkinName = "Btn_NoneVolume";
                ASBackgroundMusic.volume = 0F;
                break;
            case ProjectVolume.FullVolume:
                GlobalManager.GlobalVol = ProjectVolume.HalfVolume;
                _GUIVolumeSkinName = "Btn_HalfVolume";
                ASBackgroundMusic.volume = 0.5F;
                break;
            default:
                break;
        }

Unity3D学习记录(跑酷小游戏第二阶段)(续)_第2张图片
到此为止点击按钮改变音量就完成了,我们还需要把这个设置保留到下一场景中。
在新场景中同样的,先删除摄像机上的audio listener组件,然后按照刚才的的方法创建物体来作为声音的管理器。建一个Manager脚本,用来初始化该场景的声音,脚本差不多,记得传入global manager中:

private AudioSource ASBackgroundMusic;
ASBackgroundMusic = GameObject.Find("_AudioManager/_BackGroundMusic").GetComponent<AudioSource>();
        ASBackgroundMusic.loop = true;
        ASBackgroundMusic.volume = 1f;
        ASBackgroundMusic.Play();
        //initialize

为了确定值是真正传过来了,可以debug看一看

 switch(GlobalManager.GlobalVol)
       {
           case ProjectVolume.none:
               break;
           case ProjectVolume.NoneVolume:
               ASBackgroundMusic.volume = 0f;
               break;
           case ProjectVolume.HalfVolume:
               ASBackgroundMusic.volume = 0.5f;
               break;
           case ProjectVolume.FullVolume:
               ASBackgroundMusic.volume = 1f;
               break;
            }
       Debug.Log(ASBackgroundMusic.volume.ToString());
       Debug.Log(GlobalManager.GlobalVol.ToString());
    

完整的开始界面GUI脚本代码
Unity3D学习记录(跑酷小游戏第二阶段)(续)_第3张图片

Unity3D学习记录(跑酷小游戏第二阶段)(续)_第4张图片
完成,今天就这样啦,晚安

你可能感兴趣的:(Unity)