2016-04-26 2 views
0

私はプレイヤーがゲーム音楽の音量を設定できるUIメニューを持っています。サウンド値を保存するPlayerPrefers

スライダーでボリュームを変更できます。私はこれらの値を保存しようとしているし、ゲームが再び開いているときにそれらを取得しますが、今まで成功していません。

Sliderの値を変更すると、サウンドも変更されますが、これらの値は保存されません。

シモンズ::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(); 
    } 
} 
+0

試しましたか?それは動作しましたか? – Programmer

答えて

1

あなたのコード内の2つの問題があります

私のコードは次のようになります。

1.​​はスクリプトのどこでも呼び出されていないので、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(); 
    } 
} 
+0

別の素晴らしいAsnwer !!!!遅れて申し訳ありません、私はあまり良くありませんでした!ただあなたのscripをテストする!彼はMEGA ULTRAを完璧に動かしています。私はefxSliederを追加してスクリプトを少し変更しましたが、現在は101%有効です。今私は少しメモを持っている、私は頭が疑問がある。私はあなたの最高のスコア、 'PlayerPrefs.DeleteAll();'を削除できるオプションを持っている...私はこの関数を呼び出して、文字列 'highScoreKey = "maxScore";最高のスコアにマッチする? –

+0

@ AlanVieiraRezendeスクリプトは簡単に変更できる方法で作成されています。最大スコア 'PlayerPrefs.SetFloat(" maxScore "、30);'最大スコアを削除 'PlayerPrefs.DeleteKey(" maxScore ");' – Programmer

+1

もう一度!私は 'PlayerPrefers.DeletAll();'を 'PlayerPrefs.DeleteKey(" maxScore ");' 101%に変更するだけです! –

関連する問題