2016-11-14 111 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