2015-01-12 81 views
2
多種場景之間交換時播放的連續音樂

我有以下情形在Unity3d

  1. 含音頻源組件
  2. 一個關於我們現場

遊戲對象腳本中的遊戲物體主菜單現場:

using UnityEngine; 
using System.Collections; 


public class ManageMusic : MonoBehaviour { 

private static ManageMusic _instance; 

public static ManageMusic instance 
{ 
    get 
    { 
     if(_instance == null) 
     { 
      _instance = GameObject.FindObjectOfType<ManageMusic>(); 

      //Tell unity not to destroy this object when loading a new scene! 
      DontDestroyOnLoad(_instance.gameObject); 
     } 

     return _instance; 
    } 
} 

void Awake() 
{ 
    if(_instance == null) 
    { 
     Debug.Log("Null"); 
     //If I am the first instance, make me the Singleton 
     _instance = this; 
     DontDestroyOnLoad(this); 
    } 
    else 
    { 

     //If a Singleton already exists and you find 
     //another reference in scene, destroy it! 
     if(this != _instance){ 
      Play(); 
      Debug.Log("IsnotNull"); 
      Destroy(this.gameObject); 
     } 
    } 

} 
public void Update() 
{ 
    if (this != _instance) { 
     _instance=null; 
    } 
} 
public void Play() 
{ 
    this.gameObject.audio.Play(); 
} 

關於我們Back button script:

using UnityEngine; 

using System.Collections;

public class Back_btn:MonoBehaviour void OnMouseDown(){ Application.LoadLevel(「MainMenu」);

} 

}

enter image description here enter image description here 當我點擊關於我們按鈕的Game Music object再玩了,我可以聽到音樂,但是當我返回到主菜單中沒有音樂仍在播放。我可以看到,當我返回到主菜單和音頻監聽器的音量對象沒有被破壞的音量設置爲1,但我想不出任何人都可以幫我的問題

回答

1

你需要一個單身這個。 Unity Patternsa great post about singleton usage in Unity3D environment。嘗試執行該網站中指定的這種持久單體模式模式。

持久性辛格爾頓

有時候,你需要你的單身人士場景之間持續(對 例如,在這種情況下,你可能想要一個場景 過渡期間播放音樂)。一種方法是在你的 singleton上調用DontDestroyOnLoad()。

public class MusicManager : MonoBehaviour 
{ 
    private static MusicManager _instance; 

    public static MusicManager instance 
    { 
     get 
     { 
      if(_instance == null) 
      { 
       _instance = GameObject.FindObjectOfType<MusicManager>(); 

       //Tell unity not to destroy this object when loading a new scene! 
       DontDestroyOnLoad(_instance.gameObject); 
      } 

      return _instance; 
     } 
    } 

    void Awake() 
    { 
     if(_instance == null) 
     { 
      //If I am the first instance, make me the Singleton 
      _instance = this; 
      DontDestroyOnLoad(this); 
     } 
     else 
     { 
      //If a Singleton already exists and you find 
      //another reference in scene, destroy it! 
      if(this != _instance) 
       Destroy(this.gameObject); 
     } 
    } 

    public void Play() 
    { 
     //Play some audio! 
    } 
} 
+0

沒有代碼工作完全相同的地雷?如果我想測試你的代碼,我應該怎麼做?只需將你的代碼替換掉我的另一個問題,我沒有嘗試你的代碼,但在我的特殊情況下,如果單身人士是在'主菜單'中創建的,它的腳本將保留在'about'場景中,但是當我返回到主菜單是單身持續並繼續玩,否則它會消失或將再次玩? – Sora

+0

我不確定你的'if else'代碼塊是如何工作的,但我敢打賭,它不會像你打算的那樣工作。請繼續閱讀鏈接中的模式。玩這個代碼片段,並嘗試改變它,以便它符合您的需求。該腳本將附加到的遊戲對象只會在遊戲加載時創建,並且在更改場景時不會被刪除,因此音樂會一直播放,直到您停止爲止(如玩家將場景更改爲遊戲玩法並且您告訴那麼腳本只能停止播放)。 – Varaquilex

+0

你能檢查一下我的編輯嗎 – Sora