保存声音值 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 的密钥不应该是 nullemptyPlayerPrefs.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();
    }
}