继续在不同的场景中播放音频

时间:2017-09-12 16:31:19

标签: c# unity3d scene

在我的Unity项目中,有不同的菜单,每个菜单都是不同的场景。每个场景都有用于控制音乐的按钮。

public void musicToggle(GameObject Off){
        if (PlayerPrefs.GetInt ("Music") == 1) {
            musicPlayer.Stop ();
            Debug.Log ("Stop 2");
            PlayerPrefs.SetInt ("Music", 0);
            Off.SetActive(true);
        }
        else {
            musicPlayer.Play ();
            Debug.Log ("Play 2");
            PlayerPrefs.SetInt ("Music", 1);
            Off.SetActive (false);
        }
    }

这是我的musicToogle功能。在每个场景中音乐重新开始,在每个场景中,当我想打开/关闭音乐时,我点击一个部署此代码的按钮。但是,我不希望音乐重新开始每一个场景变化,我希望它能够恢复,我希望能够控制每个场景中的音乐(打开/关闭)。我怎样才能做到这一点 ?

2 个答案:

答案 0 :(得分:1)

我的回答假定musicPlayer变量属于AudioSource

实际上有两种方法可以做到这一点:

1 。而不是使用musicPlayer.Stop停止音乐,

使用musicPlayer.Pause();暂停音乐然后使用musicPlayer.UnPause();取消暂停音乐。这将确保音乐恢复而不是重新开始。

在这种情况下,您使用DontDestroyOnLoad(gameObject);在每个GameObject上使用AudioSource,这样当您在下一个场景时它们不会被销毁。

2 。存储AudioSource.time值。下次加载它然后在播放之前将其应用到AudioSource

您可以使用PlayerPrefs执行此操作,但我更喜欢使用json和DataSaver类进行存储。

保存

AudioSource musicPlayer;
AudioStatus aStat = new AudioStatus(musicPlayer.time);
//Save data from AudioStatus to a file named audioStat_1
DataSaver.saveData(aStat, "audioStat_1");

<强>加载

AudioSource musicPlayer;
AudioStatus loadedData = DataSaver.loadData<AudioStatus>("audioStat_1");
if (loadedData == null)
{
    return;
}
musicPlayer.time = loadedData.audioTime;
musicPlayer.Play();

您的AudioStatus班级:

[Serializable]
public class AudioStatus
{

    public float audioTime;

    public AudioStatus(float currentTime)
    {
        audioTime = currentTime;
    }
}

答案 1 :(得分:0)

您将需要创建一个单例类并在第一个场景中实例化它,然后您可以将它传递到各个场景中,如本统一答案中所述:http://answers.unity3d.com/answers/12176/view.html