【问题标题】:Issue with playing background audio for different scenes in unity3d在 unity3d 中为不同场景播放背景音频的问题
【发布时间】:2017-02-25 18:10:16
【问题描述】:

在我的游戏中,我有两个场景。 我想要实现的是,如果用户从一个场景导航到另一个场景,则应从 start(audio length=0) 播放特定于每个场景的背景音频

但我所有的努力都是徒劳的。

我尝试使用 audioSound 的“暂停”方法 我试过了 创建一个新的游戏对象并将这个场景背景分数分配给它并玩 销毁为另一个场景创建的游戏对象(如果有)

但它没有给出我想要的结果。

我搜索了如何从开始播放 audioClip 并停止其他 audioClip 播放,但没有找到。

我知道我不应该在堆栈溢出时询问代码,但如果有人实现了这一点或有一些伪代码请求你提供它

【问题讨论】:

  • 让每个场景中的游戏对象都有一个音频源,并附有适当的剪辑,它只是在清醒时播放?这是这里最简单的非脚本解决方案 - 如果您需要代码,您需要向我们展示您是如何处理这个问题的,并指出哪些部分不能按您的预期工作。否则,我们没有上下文,也不知道您是如何尝试解决方案的。

标签: unity3d unity5


【解决方案1】:

我不确定我是否正确理解了您的问题,因为这似乎是背景音乐最简单的场景。

如果您真的想在每个场景中更改音频剪辑,假设场景 A 必须播放剪辑 A,场景 B 必须播放剪辑 B,并且两个剪辑都应该在加载场景后立即播放,您只需要创建在两个场景中都有一个带有音频源组件的游戏对象,并且 Play On Awake 标志处于活动状态,然后只需为场景分配适当的剪辑(即:在场景 A 游戏的音频源组件的音频剪辑字段中分配剪辑 A对象,并对场景 B 的剪辑 B 执行相同操作。

差不多就是这样。

【讨论】:

    【解决方案2】:

    如果您查看详细代码,则可以尝试此代码。

    首先:制作一个脚本"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 ();
    
            }
    }
    

    第二步:在第一个场景中设置 Gameobject name = "SoundMusic" 并添加组件脚本 SoundFxScript.cs。在游戏对象 "SoundMusic" 中,您可以为场景 1 和场景 2 添加背景音乐。

    第三:制作单例文件Singleton.cs

    插入此代码:

    public class Singleton : MonoBehaviour {
        static Singleton instance = null;
    
        void Start ()
        {
            if (instance != null)
            {
                Destroy(gameObject);
                return;
            }
    
            DontDestroyOnLoad(gameObject);
            instance = this;
        }
    
    }
    

    第四:在游戏对象“SoundMusic”添加组件脚本“Singleton.cs”

    第五:如何调用另一个场景(加载场景)。这个方法在 SoundFxScript.cs

    里面

    示例您有一个调用加载场景的方法。试试这个方法:

    调用它:LoadTheScene("Scene2") //调用scene2

    在这里,您可以从您拥有的任何脚本中调用您的 SoundFxscript.cs 组件。

    例子:

    SoundFxScript sf;
    sf = GameObject.Find ("SoundMusic").GetComponent<SoundFxScript> ();
    

    您可以使用方法LoadTheScene加载一个新场景,背景音乐将根据场景重新播放。

    仅此而已。

    【讨论】:

    • 1) 您的解决方案远远超出了 OP 的用例,没有任何必要。 2)您使用了很多不必要的代码:单例在这里没用(我们不需要惰性初始化,我们只需要在第一个场景中使用DontDestroyOnLoad 的游戏对象),关于场景更改的代码不是最佳的(您没有使用sceneLoaded 事件,这在脚本中使用起来很简单)。 3)数据结构也不好,最好用一个AudioClip[]来存储所有场景相关的剪辑,一个AudioSource,然后在运行时加载相应的剪辑。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多