在unity3d中播放不同场景的背景音频时出现问题
在我的游戏中,我有两个场景。 我想要实现的是,如果用户从一个场景导航到另一个场景,则应该从一开始播放每个场景的特定背景音频(音频长度=0) 但我所有的努力都是徒劳的 我试着用“暂停”的有声方法 我试过了 创建一个新的游戏对象,并将此场景背景分数分配给它,然后进行游戏 销毁为其他场景创建的游戏对象(如果有) 但它没有给出我想要的结果 我搜索了如何从开始播放音频剪辑和停止播放其他音频剪辑,但没有找到在unity3d中播放不同场景的背景音频时出现问题,unity3d,unity5,Unity3d,Unity5,在我的游戏中,我有两个场景。 我想要实现的是,如果用户从一个场景导航到另一个场景,则应该从一开始播放每个场景的特定背景音频(音频长度=0) 但我所有的努力都是徒劳的 我试着用“暂停”的有声方法 我试过了 创建一个新的游戏对象,并将此场景背景分数分配给它,然后进行游戏 销毁为其他场景创建的游戏对象(如果有) 但它没有给出我想要的结果 我搜索了如何从开始播放音频剪辑和停止播放其他音频剪辑,但没有找到 我知道我不应该要求堆栈溢出上的代码,但如果有人实现了这一点或有一些伪代码要求您提供它,我不确定我是否
我知道我不应该要求堆栈溢出上的代码,但如果有人实现了这一点或有一些伪代码要求您提供它,我不确定我是否正确理解了您的问题,因为这似乎是最简单的背景音乐场景 如果您确实希望在每个场景中更改音频剪辑,假设场景a必须播放剪辑a,场景B必须播放剪辑B,并且在加载场景后应立即播放这两个剪辑,您只需在两个场景中创建一个带有音频源组件的游戏对象,并激活“播放唤醒”标志,然后仅为场景指定适当的剪辑(即:在场景A游戏对象的音频源组件的音频剪辑字段中指定剪辑A,并对场景B的剪辑B执行相同的操作)
差不多就是这样。如果您查看详细代码,则可以尝试此代码 首先:制作一个脚本“SoundFxScript.cs”//您可以根据需要进行修改 插入以下代码:
public class SoundFxScript : MonoBehaviour {
//Background Music
public AudioSource Scene1_Sound;
public AudioSource Scene2_Sound;
// Use this for initialization
void Start () {
PlayBackgroundMusic ();
}
// Update is called once per frame
void Update () {
}
public void PlayBackgroundMusic() {
if (UnityEngine.SceneManagement.SceneManager.GetActiveScene ().name == "Scene1") {
Scene1_SoundPlay();
} else if (UnityEngine.SceneManagement.SceneManager.GetActiveScene ().name == "Scene2") {
Scene2_SoundPlay();
}
}
public void Scene1_SoundPlay() {
Scene1_Sound.Play ();
Scene2_Sound.Stop ();
}
public void Scene2_SoundPlay() {
Scene1_Sound.Stop ();
Scene2_Sound.Play ();
}
// Step Fifth
public void LoadTheScene (string Scenename) {
UnityEngine.SceneManagement.SceneManager.LoadScene (Scenename);
sf.PlayBackgroundMusic ();
}
}
public class Singleton : MonoBehaviour {
static Singleton instance = null;
void Start ()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
instance = this;
}
}
第二:在第一个场景中设置Gameobject name=“SoundMusic”,并添加组件脚本SoundFxScript.cs。在gameobject“SoundMusic”中,您可以为场景1和场景2添加背景音乐
第三:创建一个singleton文件singleton.cs
插入以下代码:
public class SoundFxScript : MonoBehaviour {
//Background Music
public AudioSource Scene1_Sound;
public AudioSource Scene2_Sound;
// Use this for initialization
void Start () {
PlayBackgroundMusic ();
}
// Update is called once per frame
void Update () {
}
public void PlayBackgroundMusic() {
if (UnityEngine.SceneManagement.SceneManager.GetActiveScene ().name == "Scene1") {
Scene1_SoundPlay();
} else if (UnityEngine.SceneManagement.SceneManager.GetActiveScene ().name == "Scene2") {
Scene2_SoundPlay();
}
}
public void Scene1_SoundPlay() {
Scene1_Sound.Play ();
Scene2_Sound.Stop ();
}
public void Scene2_SoundPlay() {
Scene1_Sound.Stop ();
Scene2_Sound.Play ();
}
// Step Fifth
public void LoadTheScene (string Scenename) {
UnityEngine.SceneManagement.SceneManager.LoadScene (Scenename);
sf.PlayBackgroundMusic ();
}
}
public class Singleton : MonoBehaviour {
static Singleton instance = null;
void Start ()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
instance = this;
}
}
第四:在gameobject“SoundMusic”添加组件脚本“Singleton.cs”
第五:如何调用另一个场景(加载场景)。此方法位于SoundFxScript.cs内部
示例:您有一个调用加载场景的方法。尝试以下方法:
使用以下命令调用它:加载场景(“场景2”)//调用场景2
在这里,您可以从任何脚本调用SoundFxscript.cs组件
例如:
SoundFxScript sf;
sf = GameObject.Find ("SoundMusic").GetComponent<SoundFxScript> ();
SoundFxScript-sf;
sf=GameObject.Find(“SoundMusic”).GetComponent();
您可以使用方法加载场景加载一个新场景,背景音乐将根据场景重新播放
仅此而已。在每个场景中,让游戏对象都有一个音频源,并附加相应的剪辑,然后在唤醒状态下播放,怎么样?这是这里最简单的非脚本解决方案——如果您需要代码,您需要向我们展示您是如何做到这一点的,并指出无法按预期工作的部分。否则,我们没有上下文,也不知道您是如何尝试解决方案的。1)您的解决方案远远超出了OP的用例范围,不需要任何解决方案。2) 您使用了大量不必要的代码:单例在这里是无用的(我们不需要lazy init,我们只需要在第一个场景中使用
DontDestroyOnLoad
),关于场景更改的代码不是最佳的(您没有使用sceneLoaded
事件,它在脚本中使用非常简单)。3) 数据结构也不好,最好使用AudioClip[]
来存储所有与场景相关的剪辑,并且只存储一个AudioSource
,然后在运行时加载相应的剪辑。