【问题标题】:Sound issue in an android game made in UnityUnity 制作的安卓游戏中的声音问题
【发布时间】:2016-05-30 12:33:54
【问题描述】:

我在 Unity 中为 android 制作了 2d 游戏,但出现了问题。 游戏中的某些声音(例如菜单按钮声音)可以完美运行。

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

但如果我收到声音通知(电子邮件、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");
        }
    }
}

【问题讨论】:

  • OnApplicationPause 是解决这个问题的正确方法。发布您的OnApplicationPause 代码的解决方案。也许你的代码有问题。
  • 我在帖子中添加了我的代码。谢谢。
  • 添加了我的答案。看一看。如果可能,请避免使用PlayOneShot,而只使用Play。我的代码示例应该可以解决您的问题。
  • @dtamas80 你解决了这个问题吗?

标签: c# android unity3d android-notifications android-audiomanager


【解决方案1】:

使用您更新的代码,您做错了。 pauseStatus 变量将在应用暂停时返回true,在应用恢复时返回false。因此,当pauseStatustrue 时手动暂停音乐,然后在pauseStatusfalse 时恢复音乐。如果您不暂停音频,则系统恢复后可能不会再次播放。

pauseStatusfalse 之后播放或恢复音频之前,您还必须检查音频源是否为null。下面是一个完整的示例,可以帮助您入门。

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();
        }
    }
}

【讨论】:

  • 我之前发现过这个话题。这次我完全复制了这段代码,我设置了一个在游戏开始时开始播放的声音。而且效果很好。但是当外部声音“到达”时,游戏声音就会消失。
  • 我更新了之前的评论,因为我发错了。
  • @dtamas80 游戏声音将暂停,并在通知结束或您返回游戏时恢复。上面的代码会发生这种情况吗?你能用音乐来验证它是否暂停和恢复音乐。还要确保你正在运行这个确切的代码。
  • 当我用主页按钮离开游戏时,声音暂停然后恢复。 (但这也发生在没有这种“OnApplicationPause”方法的情况下)。但是如果有通知,声音就会停止并且不会恢复。我必须退出游戏(不是用主页按钮,我必须完全关闭游戏)并重新启动。代码与示例中的代码相同,我只是更改了变量名称。
  • 知道我应该尝试什么吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多