如何在UNITY中暂停DontDestroyOnLoad音频?

时间:2018-02-27 15:30:14

标签: unity3d unityscript

我有这个代码来播放所有场景中的音频,它的工作正常,暂停也正常。但是当我离开现场并返回时,音频不会再停顿了。我该怎么做才能暂停音频?

public AudioClip sound;

public AudioSource source 
{ 
    get 
    { 
        return GetComponent<AudioSource>(); 
    }
}

void Start ()
{
    gameObject.AddComponent<AudioSource>(); 

    source.clip = sound;

    if (source.playOnAwake == true)
        source.Play ();    

    Button butn = GameObject.Find ("soundButton").GetComponent<Button>();

    butn.onClick.AddListener(PlaySoud);     
}

public void PlaySoud ()
{
    if (source.isPlaying)
    {
        source.Pause();
    }
    else
    {
        source.Play ();         
    }
}

void Awake()
{
    GameObject[] obj = GameObject.FindGameObjectsWithTag ("soundobject");

    if(obj.Length > 1)
    {
        Destroy (this.gameObject);
    }

    DontDestroyOnLoad (this.gameObject);
}

1 个答案:

答案 0 :(得分:1)

  1. 您可能会发现OnLevelWasLoaded方便。

  2. 你这样做:

    public AudioSource source 
    { 
        get 
        { 
            return GetComponent<AudioSource>();
        } 
    }
    

    但我认为私有变量会更好。

  3. gameObject.AddComponent<AudioSource>();`
    

    为什么不在编辑器中添加这个组件?

  4. 我提到过(1.)因为只有在实例化/创建对象时才会调用Start()Awake()。还在场景加载。

    因此,您的dontDestroyOnLoad对象将不再对仍然存在的对象执行Start()Awake()。 (只是为了澄清这一点)

  5. 如果加载包含音频对象的另一个场景,则会调用Awake()一次。在新装上。好的,直到这里。

    唤醒将删除“旧”,因为两者都有标记soundobject仔细检查所有场景都是这种情况!) - 但之后你在(可能)被破坏的对象上调用DontDestroyOnLoad。请参阅answers.unity post - 有一个片段,他们首先调用DontDestroyOnLoad。它与你的非常相似。

  6. 您可以尝试在销毁之前致电source.Pause() - 这可能会暗示您的问题。

  7. 使用

    Debug.Log("I am " + this.gameobject.name + " and I will be destroyed,  my audio is " + (source.isPlaying() ? "playing." : "not playing."));
    
    在破坏召唤之前

    。然后检查hierarchie和控制台,看看保留了什么以及删除了什么。

  8. 如果这不能解决问题,请回报。