2016-11-14 107 views
0

如何在播放另一個音頻時停止一個音頻?在Unity3D中播放另一個時停止音頻

public AudioSource audioSource; 
public AudioClip audioClip; 
private string[,] levelWords; 
//public static string glupiaZmienna; 
public Text txt; 

public void OnPointerClick(PointerEventData eventData) 
{ 
    Debug.Log(gameObject.name); 
    WordsLoader w = new WordsLoader(); 
    levelWords = w.wLevelWords; 
    SetCategoryButton scb = new SetCategoryButton(); 
    int a = scb.Kategoria; 
    zupa(); 

    AudioSource audio = gameObject.AddComponent<AudioSource>(); 
    audio.Stop(); 
    audio.clip = (AudioClip)Resources.Load(a+ "/" + WordsLoader.language + "/Sounds/" + gameObject.name); 

    audio.Play(); 


    // txt = gameObject.GetComponent<Text>(); 
} 

public void zupa() 
{ WordsLoader w = new WordsLoader(); 
    SetCategoryButton scb = new SetCategoryButton(); 
    int a = scb.Kategoria; 
    print(w.wHowManyWords); 

    for (int i = 0; i < w.wHowManyWords; i++) 
    { 
     print("jestem tu"); 
     if (levelWords[i, 0] == gameObject.name) 
     { 
      txt = GameObject.Find("Text").GetComponent<Text>(); ; 
      txt.text = levelWords[i, 2]; 
     } 

    } 
} 

此代碼位於腳本中,點擊按鈕後開始播放聲音。我想停止早些時候開始的音頻。

+0

請詳細解釋您的問題。這一行問題不能回答。哪些音頻停止播放哪一個? – Programmer

+0

這段代碼是每次在同一個GameObject上運行還是在不同的GameObject上運行? – Programmer

+0

這是相同的遊戲對象 – Quicki

回答

2

編輯答案必須改變一批,由於留下它的意見。覆蓋所有內容是有意義的。

您需要一個參考指向所有的AudioSource。將另一個腳本(PlayerManager)中的每個ClickAction實例存儲在List中。在播放音頻之前,請循環播放List,如果正在播放,請停止播放。之後,您可以播放音頻。

另外,您當前每次播放音頻時都會撥打Resources.Load。這在性能方面並不好。您應該在Start()函數中執行一次,然後在需要時播放它。此外,您的gameObject.AddComponent<AudioSource>()代碼也只能被調用一次。

您的新ClickAction腳本:

public class ClickAction : MonoBehaviour 
{ 
    public AudioSource audioSource; 
    public AudioClip audioClip; 
    private string[,] levelWords; 
    //public static string glupiaZmienna; 
    public Text txt; 

    public AudioSource clickAudioSource; 
    PlayerManager playerManager = null; 

    void Start() 
    { 
     //Get PlayerManager from PlayerManager GameObject 
     playerManager = GameObject.Find("PlayerManager").GetComponent<PlayerManager>(); 
     clickAudioSource = gameObject.AddComponent<AudioSource>(); 
     clickAudioSource.clip = (AudioClip)Resources.Load(a + "/" + WordsLoader.language + "/Sounds/" + gameObject.name); 

     //Register this Script to the PlayerManager 
     playerManager.addClickAction(this); 
    } 

    public void OnPointerClick(PointerEventData eventData) 
    { 
     Debug.Log(gameObject.name); 
     WordsLoader w = new WordsLoader(); 
     levelWords = w.wLevelWords; 
     SetCategoryButton scb = new SetCategoryButton(); 
     int a = scb.Kategoria; 
     zupa(); 

     //Play Audio 
     playAudio(); 

     // txt = gameObject.GetComponent<Text>(); 
    } 

    private void playAudio() 
    { 
     playerManager.playAudio(clickAudioSource); 
    } 

    public void stopAudio() 
    { 
     //If not null and playing then stop audio 
     if (clickAudioSource != null && clickAudioSource.isPlaying) 
     { 
      clickAudioSource.Stop(); 
     } 
    } 

    public void zupa() 
    { 
     WordsLoader w = new WordsLoader(); 
     SetCategoryButton scb = new SetCategoryButton(); 
     int a = scb.Kategoria; 
     print(w.wHowManyWords); 

     for (int i = 0; i < w.wHowManyWords; i++) 
     { 
      print("jestem tu"); 
      if (levelWords[i, 0] == gameObject.name) 
      { 
       txt = GameObject.Find("Text").GetComponent<Text>(); ; 
       txt.text = levelWords[i, 2]; 
      } 

     } 
    } 

    void OnDisable() 
    { 
     //Un-Register this Script from the PlayerManager when it is destroyed 
     playerManager.removeClickAction(this); 
    } 
} 

PlayerManager腳本。創建一個遊戲物體稱爲PlayerManager,然後在下方附上它的腳本:

public class PlayerManager : MonoBehaviour 
{ 
    List<ClickAction> clickActions = new List<ClickAction>(); 

    public void addClickAction(ClickAction clickActionToAdd) 
    { 
     //Adds clickActionToAdd if it does not exist in the List already 
     if (!clickActions.Contains(clickActionToAdd)) 
     { 
      clickActions.Add(clickActionToAdd); 
     } 
    } 

    public void removeClickAction(ClickAction clickActionToAdd) 
    { 
     //Removes clickActionToAdd if it exist in the List 
     if (clickActions.Contains(clickActionToAdd)) 
     { 
      clickActions.Add(clickActionToAdd); 
     } 
    } 

    public bool clickActionExist(ClickAction clickActionToAdd) 
    { 
     //Removes clickActionToAdd if it exist in the List 
     return clickActions.Contains(clickActionToAdd); 
    } 

    public void playAudio(AudioSource audSource) 
    { 
     //Stop Other Audio 
     stopAllClickActionAudio(); 

     //Now, play the one that was passed in 
     audSource.Play(); 
    } 

    void stopAllClickActionAudio() 
    { 
     //Stop Audio on every ClickAction script 
     for (int i = 0; i < clickActions.Count; i++) 
     { 
      clickActions[i].stopAudio(); 
     } 
    } 
} 

playAudio函數被調用時,它會停止所有音頻從存儲在ListAudioSource,那麼它會播放當前AudioSource那被傳入它。

+0

這仍然不起作用。難道是因爲我將相同的腳本添加到某些對象中? – Quicki

+0

在評論部分詢問了你這個問題,你說過「這段代碼每次運行在同一個GameObject上還是不同的GameObject?」。現在,你在說腳本被附加到不同的GameObjects上。 – Programmer

+0

我從另一種方式理解你的問題。對不起 – Quicki