保存声音值 PlayerPrefers
Save sound value PlayerPrefers
我有一个 UI 菜单,玩家可以在其中设置游戏音乐的音量。
通过滑块可以改变音量。我试图保存这些值,并在游戏再次打开时检索它们,但到目前为止没有成功。
当我们改变 Slider 的值时,声音也会改变,但这些值不会被保存。
我的代码如下所示:
Ps: Unity 控制台中出现 0 个警告,如果可能,C# 会回答 =]
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 个问题。
1.UpdateVolume()
未在脚本中的任何位置调用,因此无法保存 Slider
值。
2.string newVolume;
newVolume 未初始化。这样做 PlayerPrefs.SetFloat(newVolume, currentVolume);与 PlayerPrefs.SetFloat(null, currentVolume) 相同;这很糟糕。
传递给 SetFloat
的密钥不应该是 null
或 empty
。
PlayerPrefs.SetFloat("something",currentVolume);
或 string newVolume = "something";
PlayerPrefs.SetFloat(newVolume, currentVolume);
都可以。
您需要一种检测滑块值何时更改的方法,以便您可以保存分数。你可以用 slider.onValueChanged.AddListener(delegate { sliderCallBack(slider); });
您的整个代码应该如下所示。
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();
}
}
我有一个 UI 菜单,玩家可以在其中设置游戏音乐的音量。
通过滑块可以改变音量。我试图保存这些值,并在游戏再次打开时检索它们,但到目前为止没有成功。
当我们改变 Slider 的值时,声音也会改变,但这些值不会被保存。
我的代码如下所示:
Ps: Unity 控制台中出现 0 个警告,如果可能,C# 会回答 =]
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 个问题。
1.UpdateVolume()
未在脚本中的任何位置调用,因此无法保存 Slider
值。
2.string newVolume;
newVolume 未初始化。这样做 PlayerPrefs.SetFloat(newVolume, currentVolume);与 PlayerPrefs.SetFloat(null, currentVolume) 相同;这很糟糕。
传递给 SetFloat
的密钥不应该是 null
或 empty
。
PlayerPrefs.SetFloat("something",currentVolume);
或 string newVolume = "something";
PlayerPrefs.SetFloat(newVolume, currentVolume);
都可以。
您需要一种检测滑块值何时更改的方法,以便您可以保存分数。你可以用 slider.onValueChanged.AddListener(delegate { sliderCallBack(slider); });
您的整个代码应该如下所示。
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();
}
}