我有这个代码来播放所有场景中的音频,它的工作正常,暂停也正常。但是当我离开现场并返回时,音频不会再停顿了。我该怎么做才能暂停音频?
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);
}
答案 0 :(得分:1)
您可能会发现OnLevelWasLoaded方便。
你这样做:
public AudioSource source
{
get
{
return GetComponent<AudioSource>();
}
}
但我认为私有变量会更好。
gameObject.AddComponent<AudioSource>();`
为什么不在编辑器中添加这个组件?
我提到过(1.)因为只有在实例化/创建对象时才会调用Start()
和Awake()
。还在场景加载。
因此,您的dontDestroyOnLoad
对象将不再对仍然存在的对象执行Start()
和Awake()
。 (只是为了澄清这一点)
如果加载包含音频对象的另一个场景,则会调用Awake()
一次。在新装上。好的,直到这里。
唤醒将删除“旧”,因为两者都有标记soundobject
(仔细检查所有场景都是这种情况!) - 但之后你在(可能)被破坏的对象上调用DontDestroyOnLoad
。请参阅answers.unity post - 有一个片段,他们首先调用DontDestroyOnLoad
。它与你的非常相似。
您可以尝试在销毁之前致电source.Pause()
- 这可能会暗示您的问题。
使用
Debug.Log("I am " + this.gameobject.name + " and I will be destroyed, my audio is " + (source.isPlaying() ? "playing." : "not playing."));
在破坏召唤之前。然后检查hierarchie和控制台,看看保留了什么以及删除了什么。
如果这不能解决问题,请回报。