音量控制條隨場(chǎng)景切換不消失且隨著場(chǎng)景切換不會(huì)創(chuàng)建新的音樂播放
? ? ? ?在最近的制作游戲練習(xí)中本人想要實(shí)現(xiàn)背景音樂的播放且隨著場(chǎng)景的切換音樂依舊存在且會(huì)保持原來的播放狀態(tài)繼續(xù)播放。簡(jiǎn)單來說就是隨著場(chǎng)景的切換不會(huì)重新播放音樂而是繼續(xù)播放。(寫這個(gè)稿件是因?yàn)榻?jīng)本人網(wǎng)絡(luò)查詢當(dāng)時(shí)并未找到解決方法,這個(gè)是自己想出來的,本人菜雞一枚,發(fā)出來只是想幫一下其他需要解決此問題的同學(xué),如有大佬可以分享一下簡(jiǎn)單的實(shí)現(xiàn))
? ? ? ?下面是本人創(chuàng)作過程及每個(gè)過程解決的方法:
? ? ? ?1.創(chuàng)建一個(gè)slider滑條,創(chuàng)建MusicController腳本,用來獲取audiosorce組件,從而實(shí)現(xiàn)音量大小伴隨著滑條的移動(dòng)而增減。核心代碼(最后會(huì)分享實(shí)現(xiàn)該過程全部代碼):
? ? ? ? GlobalControl.Instance.musicVolume = volumeSlider.value;
? ? ? ? musicSource.volume = GlobalControl.Instance.musicVolume;
? ? ? ? 此代碼是最終實(shí)現(xiàn)效果的代碼,并非第一次寫的代碼。這段代碼主要幫助同學(xué)們知道如何實(shí)現(xiàn)音量大小伴隨著滑條的移動(dòng)而增減,上述代碼有一個(gè)全局變量Instance,可以忽略了解即可,最后會(huì)寫到。
? ? ? ? ?2.上述步驟1是我第一次實(shí)現(xiàn)的效果,發(fā)現(xiàn)音量控制條會(huì)隨著場(chǎng)景的切換而消失掉,然后我敲寫了這一段代碼:
? ? ? ? ?DontDestroyOnLoad(gameObject);
? ? ? ? ?讓音量控制條不會(huì)消失。但是,經(jīng)測(cè)試發(fā)現(xiàn)了一個(gè)bug:發(fā)現(xiàn)第一場(chǎng)景切換第二場(chǎng)景slider和audiosorce雖然依舊存在,但發(fā)現(xiàn)第二場(chǎng)景切換到第一場(chǎng)景會(huì)再次創(chuàng)建一個(gè)重新播放的音樂,這就造成了兩段相同的音樂同時(shí)播放,從而音樂播放混亂。但最糟糕的是,如果在兩個(gè)場(chǎng)景切換多次,就會(huì)創(chuàng)建多個(gè)相同的音樂。
? ? ? ? ?3.最終我采用了一個(gè)單例模式
? ? ? ? ? 首先,創(chuàng)建一個(gè)slider和添加audiosorce組件,這個(gè)ui物體上掛載MusicController腳本實(shí)現(xiàn)音量大小伴隨著滑條的移動(dòng)而增減。
?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;
? ? }
? ? ? ? ?之后創(chuàng)建一個(gè)空物體將上述創(chuàng)建的ui拖進(jìn)去,將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腳本申請(qǐng)的全局變量同時(shí)也在MusicController腳本中使用。GlobalControl腳本中的:
???if (Instance == null){
? ? ? ? ? ? DontDestroyOnLoad(gameObject);
? ? ? ? ? ? Instance = this;
? ? ? ? }
這段代碼主要是判斷除了第一場(chǎng)景外的場(chǎng)景是否存在音樂控制條,如果不存在那么將保留第一場(chǎng)景的音樂控制條。
else if (Instance != this)
? ? ? ? {
? ? ? ? ? ? Destroy(gameObject);
? ? ? ? }
這段代碼的意思是,如果已經(jīng)存在了音樂控制條,那么則將多余的給刪除掉。也就解決了來回切換場(chǎng)景且會(huì)產(chǎn)生多個(gè)音樂的問題。
? ? ? ? 希望我的投稿對(duì)有該問題的同學(xué)有幫助!
? ? ? ? ?
音量控制條隨場(chǎng)景切換不消失且隨著場(chǎng)景切換不會(huì)創(chuàng)建新的音樂播放的評(píng)論 (共 條)
