【问题标题】:Save sound value PlayerPrefers保存声音值 PlayerPrefers
【发布时间】:2016-04-26 21:15:57
【问题描述】:

我有一个 UI MENU,玩家可以在其中设置游戏音乐的音量。

通过滑块可以改变音量。我正在尝试保存这些值,并在游戏再次打开时检索它们,但到目前为止还没有成功。

当我们改变 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 ();
    }
}

【问题讨论】:

  • 你试过了吗?成功了吗?

标签: c# unityscript unity3d


【解决方案1】:

您的代码中有 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();
    }
}

【讨论】:

  • 另一个伟大的Asnwer!!!!抱歉耽搁了我不是很好!只是测试你的脚本!他正在完美地工作 MEGA ULTRA。我添加了 efxSlieder 并对脚本进行了一些小改动,它现在 101% 处于活动状态。现在我有一个小笔记,我怀疑我的头。我有一个选项,用户可以删除您的最佳分数,PlayerPrefs.DeleteAll (); ...我必须调用此函数并输入与最佳匹配的字符串highScoreKey = "maxScore";分数?
  • @AlanVieiraRezende 该脚本的制作方式很容易修改。保存最高分 PlayerPrefs.SetFloat("maxScore",30); 然后删除最高分 PlayerPrefs.DeleteKey("maxScore");
  • 再次完美!!!我只是把PlayerPrefers.DeletAll ();改成PlayerPrefs.DeleteKey ("maxScore");working 101%!!!
  • 你好,youtube tuto,unity tuto,这里(仅堆栈)=]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2011-08-17
  • 2017-04-13
相关资源
最近更新 更多