在unity3d中播放不同场景的背景音频时出现问题

在unity3d中播放不同场景的背景音频时出现问题,unity3d,unity5,Unity3d,Unity5,在我的游戏中,我有两个场景。 我想要实现的是,如果用户从一个场景导航到另一个场景,则应该从一开始播放每个场景的特定背景音频(音频长度=0) 但我所有的努力都是徒劳的 我试着用“暂停”的有声方法 我试过了 创建一个新的游戏对象,并将此场景背景分数分配给它,然后进行游戏 销毁为其他场景创建的游戏对象(如果有) 但它没有给出我想要的结果 我搜索了如何从开始播放音频剪辑和停止播放其他音频剪辑,但没有找到 我知道我不应该要求堆栈溢出上的代码,但如果有人实现了这一点或有一些伪代码要求您提供它,我不确定我是否

在我的游戏中,我有两个场景。 我想要实现的是,如果用户从一个场景导航到另一个场景,则应该从一开始播放每个场景的特定背景音频(音频长度=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
,然后在运行时加载相应的剪辑。