2

我在Unity中为Android制作了2D游戏,并且存在问题。 游戏中有声音(例如菜单按钮声音)可以很好地工作。在Unity中制作的Android游戏中的声音问题

当我离开游戏(例如使用主屏幕按钮)并返回时,声音也很好。

但是,如果我得到一个声音通知(电子邮件,skpye等),游戏变为静音,直到我退出并重新启动游戏。

我试图寻找解决方案,我发现OnApplicationPause方法,但它并没有帮助我。我不知道为什么...

有人有任何想法可能是什么问题或解决方案:)?

谢谢。

编辑

我连我的手机到电脑,并试图调试,并按照OnApplicationPause方法。

声音在游戏开始时播放。

如果我按下主页按钮,audioSource.Pause();被调用,当我回到游戏时,audioSource.UnPause();也被称为。有声音。

如果我接到电话,audioSource.Pause();被调用,当我回到游戏时,audioSource.UnPause();也被称为。但没有声音。

如果我收到通知(例如电子邮件),则没有audioSource.Pause()语句,并且声音消失。

'if(audioSource == null)'和'if(!audioSource.isPlaying)'语句永远不会被调用。

private AudioSource audioSource; 
public AudioClip clip; 

void Awake() { 
    if (audioSource == null) { 
     audioSource = gameObject.AddComponent<AudioSource>(); 
     audioSource.loop = true; 
     audioSource.clip = clip; 
    } 

    if (!audioSource.isPlaying) { 
     audioSource.Play(); 
    } 
} 

void OnApplicationPause(bool pauseStatus) { 
    //Check if this is Pause 
    if (pauseStatus) 
    { 
     //Pause Audio if it is playing 
     if (audioSource.isPlaying) 
     { 
      audioSource.Pause(); 

      //Set to true so that we will detamine whether to Play() or UnPause() the music next time 
      audioSourcePaused = true; 
      Debug.Log("ifplaying->pause"); 
     } 
     Debug.Log("pause"); 
    } 

    //Check if this is Resume 
    if (!pauseStatus) { 
     //Make sure audio is not null. If null, getComponent again 
     if (audioSource == null) { 
      audioSource = gameObject.AddComponent<AudioSource>(); 
      audioSource.loop = true; 
      audioSource.clip = clip; 
      Debug.Log("Null"); 
     } 

     //Check if we paused the audio then resume 
     if (audioSourcePaused) { 
      audioSource.UnPause(); 

      //Set to false so that we will detamine whether to Play() or UnPause() the music next time 
      audioSourcePaused = false; 
      Debug.Log("Unpause"); 
     } 

     //Check if Audio is playing. Don't play if already playing. 
     if (!audioSource.isPlaying) { 
      audioSource.Play(); 
      Debug.Log("play"); 
     } 
    } 
} 
+0

“OnApplicationPause”是解决此问题的正确方法。为您的'OnApplicationPause'代码发布解决方案。也许你的代码有问题。 – Programmer

+0

我将我的代码添加到帖子中。谢谢。 – dtamas80

+0

添加了我的答案。看一看。如果可能的话,避免使用“PlayOneShot”,只使用“播放”。我的代码示例应该能解决您的问题。 – Programmer

回答

0

随着您更新的代码,你做错了。 pauseStatus变量将返回true当应用程序是暂停false当应用程序是恢复。所以,手动暂停音乐时pauseStatustrue然后当pauseStatusfalse恢复音乐。如果您不暂停音频,系统恢复后可能不会再播放。

你还必须检查的AudioSource是nullpauseStatus后播放或恢复音频之前false ..下面是一个完整的样本,这将让你开始。

public AudioClip clip; 
private AudioSource _musicAudioSource; 
bool _musicAudioSourcePaused = false; 

void Awake() 
{ 
    if (_musicAudioSource == null) 
    { 
     _musicAudioSource = gameObject.AddComponent<AudioSource>(); 
     _musicAudioSource.loop = true; 
     _musicAudioSource.clip = clip; 
    } 

    //Check if Audio is playing. Don't play if already playing. 
    if (!_musicAudioSource.isPlaying) 
    { 
     _musicAudioSource.Play(); 
    } 
} 

void OnApplicationPause(bool pauseStatus) 
{ 
    //Check if this is Pause 
    if (pauseStatus) 
    { 
     //Pause Audio if it is playing 
     if (_musicAudioSource.isPlaying) 
     { 
      _musicAudioSource.Pause(); 

      //Set to true so that we will detamine whether to Play() or UnPause() the music next time 
      _musicAudioSourcePaused = true; 
     } 
    } 

    //Check if this is Resume 
    if (!pauseStatus) 
    { 
     //Make sure audio is not null. If null, getComponent again 
     if (_musicAudioSource == null) 
     { 
      _musicAudioSource = gameObject.AddComponent<AudioSource>(); 
      _musicAudioSource.loop = true; 
      _musicAudioSource.clip = clip; 
     } 

     //Check if we paused the audio then resume 
     if (_musicAudioSourcePaused) 
     { 
      _musicAudioSource.UnPause(); 

      //Set to false so that we will detamine whether to Play() or UnPause() the music next time 
      _musicAudioSourcePaused = false; 
     } 

     //Check if Audio is playing. Don't play if already playing. 
     if (!_musicAudioSource.isPlaying) 
     { 
      _musicAudioSource.Play(); 
     } 
    } 
} 
+0

我早点找到了这个话题。这次我完全复制了这段代码,我设置了一个声音,在游戏开始时开始播放。它运作良好。但是当外部声音“到达”时,游戏声音消失。 – dtamas80

+0

@ dtamas80我的答案中的代码有效吗? – Programmer

+0

我更新了我以前的评论,因为我错误地发送了它。 – dtamas80