音量控制条随场景切换不消失且随着场景切换不会创建新的音乐播放
在最近的制作游戏练习中本人想要实现背景音乐的播放且随着场景的切换音乐依旧存在且会保持原来的播放状态继续播放。简单来说就是随着场景的切换不会重新播放音乐而是继续播放。(写这个稿件是因为经本人网络查询当时并未找到解决方法,这个是自己想出来的,本人菜鸡一枚,发出来只是想帮一下其他需要解决此问题的同学,如有大佬可以分享一下简单的实现)
下面是本人创作过程及每个过程解决的方法:
1.创建一个slider滑条,创建MusicController脚本,用来获取audiosorce组件,从而实现音量大小伴随着滑条的移动而增减。核心代码(最后会分享实现该过程全部代码):
GlobalControl.Instance.musicVolume = volumeSlider.value;
musicSource.volume = GlobalControl.Instance.musicVolume;
此代码是最终实现效果的代码,并非第一次写的代码。这段代码主要帮助同学们知道如何实现音量大小伴随着滑条的移动而增减,上述代码有一个全局变量Instance,可以忽略了解即可,最后会写到。
2.上述步骤1是我第一次实现的效果,发现音量控制条会随着场景的切换而消失掉,然后我敲写了这一段代码:
DontDestroyOnLoad(gameObject);
让音量控制条不会消失。但是,经测试发现了一个bug:发现第一场景切换第二场景slider和audiosorce虽然依旧存在,但发现第二场景切换到第一场景会再次创建一个重新播放的音乐,这就造成了两段相同的音乐同时播放,从而音乐播放混乱。但最糟糕的是,如果在两个场景切换多次,就会创建多个相同的音乐。
3.最终我采用了一个单例模式
首先,创建一个slider和添加audiosorce组件,这个ui物体上挂载MusicController脚本实现音量大小伴随着滑条的移动而增减。
MusicController脚本:
public Slider volumeSlider;
private AudioSource musicSource;
void Start() {
musicSource = GetComponent<AudioSource>(); // 获取AudioSource组件引用
}
public void SetVolume() {
GlobalControl.Instance.musicVolume = volumeSlider.value;
musicSource.volume = GlobalControl.Instance.musicVolume;
}
之后创建一个空物体将上述创建的ui拖进去,将GlobalControl脚本挂在空物体上。GlobalControl脚本:
public static GlobalControl Instance;
public float musicVolume;
void Awake(){
if (Instance == null){
DontDestroyOnLoad(gameObject);
Instance = this;
}
else if (Instance != this)
{
Destroy(gameObject);
}
}
在GlobalControl脚本申请的全局变量同时也在MusicController脚本中使用。GlobalControl脚本中的:
if (Instance == null){
DontDestroyOnLoad(gameObject);
Instance = this;
}
这段代码主要是判断除了第一场景外的场景是否存在音乐控制条,如果不存在那么将保留第一场景的音乐控制条。
else if (Instance != this)
{
Destroy(gameObject);
}
这段代码的意思是,如果已经存在了音乐控制条,那么则将多余的给删除掉。也就解决了来回切换场景且会产生多个音乐的问题。
希望我的投稿对有该问题的同学有帮助!