保存声音值 PlayerPrefers [英] Save sound value PlayerPrefers

查看:20
本文介绍了保存声音值 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 不应为nullempty.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆