约完高中同学今天又和初中同学玩…感觉有点跟不上进度了,不过问题不大,把该约的约完,后面的时间就专心学习看书提升吧。
突然发现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一栏,我就随便拖一个了(石头门赛高!)
然后我们需要用脚本来控制其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;
}
到此为止点击按钮改变音量就完成了,我们还需要把这个设置保留到下一场景中。
在新场景中同样的,先删除摄像机上的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());