保存声音值 PlayerPrefers [英] Save sound value PlayerPrefers
问题描述
我有一个 UI 菜单,玩家可以在其中设置游戏音乐的音量.
I have a UI MENU where the player can set the volume of the game music.
通过滑块它可以改变音量.我试图保存这些值,并在游戏再次打开时检索它们,但到目前为止还没有成功.
Through a slider it can change the volume. I'm trying to save these values, and retrieves them whenthe game is open again, but without success so far.
当我们改变 Slider 的值时,声音也会改变,但这些值不会被保存.
When we change the value of the Slider, the sound also changes, but these values are not being saved.
我的代码如下所示:
Ps: Unity 控制台中的 0 警告,如果可能,C# 回答 =]
Ps: 0 warning in Unity console, and C# answer if possible =]
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PauseCanvas : MonoBehaviour
{
public Button resumeButton;
public Button backToMainMenuButton;
public Button exitGameButton;
public Canvas gameCanvas;
public Canvas mainMenuCanvas;
public Slider slider;
public float startVolume = 1f;
public float currentVolume;
string newVolume;
void Awake () {
slider.value = GetComponent<AudioSource> ().volume;
currentVolume = slider.value;
}
void Start () {
startVolume = PlayerPrefs.GetFloat (newVolume, 1);
}
void UpdateVolume() {
if (currentVolume < startVolume ) {
PlayerPrefs.SetFloat (newVolume, currentVolume);
PlayerPrefs.Save ();
}
}
void OnEnable ()
{
//Register Button Events
resumeButton.onClick.AddListener (() => buttonCallBack (resumeButton));
backToMainMenuButton.onClick.AddListener (() => buttonCallBack (backToMainMenuButton));
exitGameButton.onClick.AddListener (() => buttonCallBack (exitGameButton));
}
private void buttonCallBack (Button buttonPressed)
{
//Resume Button Pressed
if (buttonPressed == resumeButton) {
Time.timeScale = 1;
//Hide this Pause Canvas
gameObject.SetActive (false);
//Show Game Canvas
gameCanvas.gameObject.SetActive (true);
}
//Back To Main Menu Button Pressed
if (buttonPressed == backToMainMenuButton) {
//Hide this Pause Canvas
gameObject.SetActive (false);
//Show Main Menu Canvas
Score.Inicializar ();
SceneManager.LoadScene ("Menu");
}
//Exit Game Button Pressed
if (buttonPressed == exitGameButton) {
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
void OnDisable ()
{
//Un-Register Button Events
resumeButton.onClick.RemoveAllListeners ();
backToMainMenuButton.onClick.RemoveAllListeners ();
exitGameButton.onClick.RemoveAllListeners ();
}
}
推荐答案
您的代码中有 2 个问题.
There are 2 problems in your code.
1.UpdateVolume()
未在脚本中的任何位置调用,因此无法保存 Slider
值.
1.UpdateVolume()
is not being called anywhere in the script so there is no way to save the Slider
value.
2.string newVolume;
newVolume 未初始化.所以这样做 PlayerPrefs.SetFloat(newVolume, currentVolume);与 PlayerPrefs.SetFloat(null, currentVolume) 相同;这是不好的.
2.string newVolume;
newVolume is not initialized. So doing PlayerPrefs.SetFloat(newVolume, currentVolume); is thesame as PlayerPrefs.SetFloat(null, currentVolume); which is bad.
传入SetFloat
的key 不应为null
或empty
.PlayerPrefs.SetFloat("something",currentVolume);
或 string newVolume = "something";
PlayerPrefs.SetFloat(newVolume, currentVolume);
都很好.
The key that is passed in to SetFloat
should not be null
or empty
.
PlayerPrefs.SetFloat("something",currentVolume);
or string newVolume = "something";
PlayerPrefs.SetFloat(newVolume, currentVolume);
are both fine.
您需要一种检测滑块值何时发生变化的方法,以便您可以保存分数.你可以用 slider.onValueChanged.AddListener(delegate { sliderCallBack(slider); });
You need a way of detecting when the slider value changes so that you can save the score. You can do with slider.onValueChanged.AddListener(delegate { sliderCallBack(slider); });
您的整个代码应该如下所示.
Your whole code should like something below.
public class PauseCanvas : MonoBehaviour
{
public Button resumeButton;
public Button backToMainMenuButton;
public Button exitGameButton;
public Canvas gameCanvas;
public Canvas mainMenuCanvas;
public Slider volumeSlider;
public float startVolume = 1f;
public float currentVolume;
string newVolume = "VOLUME_SLIDER"; //Can change to whatever you want as long as it is not null or empty
void Start()
{
//Load volume from prevois saved state. If it does not exist, use 1 as default
volumeSlider.value = PlayerPrefs.GetFloat(newVolume, 1);
currentVolume = volumeSlider.value;
}
void UpdateVolume(float _volume)
{
currentVolume = _volume;
PlayerPrefs.SetFloat(newVolume, _volume);
PlayerPrefs.Save();
}
void OnEnable()
{
//Register Button Events
resumeButton.onClick.AddListener(() => buttonCallBack(resumeButton));
backToMainMenuButton.onClick.AddListener(() => buttonCallBack(backToMainMenuButton));
exitGameButton.onClick.AddListener(() => buttonCallBack(exitGameButton));
//Register Slider Events
volumeSlider.onValueChanged.AddListener(delegate { sliderCallBack(volumeSlider); });
}
private void sliderCallBack(Slider sliderMoved)
{
//Volume Slider Moved
if (sliderMoved == volumeSlider)
{
UpdateVolume(sliderMoved.value);
}
}
private void buttonCallBack(Button buttonPressed)
{
//Resume Button Pressed
if (buttonPressed == resumeButton)
{
Time.timeScale = 1;
//Hide this Pause Canvas
gameObject.SetActive(false);
//Show Game Canvas
gameCanvas.gameObject.SetActive(true);
}
//Back To Main Menu Button Pressed
if (buttonPressed == backToMainMenuButton)
{
//Hide this Pause Canvas
gameObject.SetActive(false);
//Show Main Menu Canvas
//Score.Inicializar();
SceneManager.LoadScene("Menu");
}
//Exit Game Button Pressed
if (buttonPressed == exitGameButton)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
void OnDisable()
{
//Un-Register Button Events
resumeButton.onClick.RemoveAllListeners();
backToMainMenuButton.onClick.RemoveAllListeners();
exitGameButton.onClick.RemoveAllListeners();
//Un-Register Slider Events
volumeSlider.onValueChanged.RemoveAllListeners();
}
}
这篇关于保存声音值 PlayerPrefers的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!