持续播放不同场景的音频
Continues to play audio in different scenes
在我的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 函数。在每个场景中,音乐都会重新开始,在每个场景中,当我想打开 on/off 音乐时,我单击一个按钮来部署此代码。但是,我不希望音乐在每次场景切换时重新开始,我希望它恢复,并且我希望能够在每个场景中控制音乐(转on/off)。我怎样才能做到这一点 ?
您需要创建一个单例 class 并在您的第一个场景中对其进行实例化,然后您可以按照此统一答案中的描述将其传递到各种场景:http://answers.unity3d.com/answers/12176/view.html
我的回答假设 musicPlayer
变量是 AudioSource
的一种类型。
实际上有两种方法可以做到这一点:
1。而不是使用 musicPlayer.Stop
来停止音乐,
使用 musicPlayer.Pause();
暂停然后播放音乐,然后使用 musicPlayer.UnPause();
取消暂停。这将确保音乐恢复而不是重新启动。
在这种情况下,您在每个带有 AudioSource
的游戏对象上使用 DontDestroyOnLoad(gameObject);
,这样当您在下一个场景时它们就不会被销毁。
2。存储 AudioSource.time
值。下次加载它,然后在播放前将其应用到 AudioSource
。
您可以使用 PlayerPrefs
来执行此操作,但我更喜欢使用 json 和 class.
进行存储
保存:
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
class:
[Serializable]
public class AudioStatus
{
public float audioTime;
public AudioStatus(float currentTime)
{
audioTime = currentTime;
}
}
在我的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 函数。在每个场景中,音乐都会重新开始,在每个场景中,当我想打开 on/off 音乐时,我单击一个按钮来部署此代码。但是,我不希望音乐在每次场景切换时重新开始,我希望它恢复,并且我希望能够在每个场景中控制音乐(转on/off)。我怎样才能做到这一点 ?
您需要创建一个单例 class 并在您的第一个场景中对其进行实例化,然后您可以按照此统一答案中的描述将其传递到各种场景:http://answers.unity3d.com/answers/12176/view.html
我的回答假设 musicPlayer
变量是 AudioSource
的一种类型。
实际上有两种方法可以做到这一点:
1。而不是使用 musicPlayer.Stop
来停止音乐,
使用 musicPlayer.Pause();
暂停然后播放音乐,然后使用 musicPlayer.UnPause();
取消暂停。这将确保音乐恢复而不是重新启动。
在这种情况下,您在每个带有 AudioSource
的游戏对象上使用 DontDestroyOnLoad(gameObject);
,这样当您在下一个场景时它们就不会被销毁。
2。存储 AudioSource.time
值。下次加载它,然后在播放前将其应用到 AudioSource
。
您可以使用 PlayerPrefs
来执行此操作,但我更喜欢使用 json 和
保存:
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
class:
[Serializable]
public class AudioStatus
{
public float audioTime;
public AudioStatus(float currentTime)
{
audioTime = currentTime;
}
}