Почему оно не сохраняет?

140
27 апреля 2022, 16:30

Не понимаю почему сохранение не работает, скинул весь скрипт, обратите внимание например на функцию MusicVolumeSet, и в старте на её загрузку, я вроде все правильно написал (MusicVolumeSet выполняется при смене значения в слайдере) сама функция работает отлично, т.е. звук меняется, и MusicVolumeFloat меняет своё значение(наблюдал в инспекторе) выключаю и запускаю сцену и вижу что значения сбросились. На сайте мой первый вопрос, и в программировании не очень шарю, извините если что-то не правильно написал. (если-что не обращайте внимания что я сделал сохранение графики, она в юнити сама вроде сохраняется, но мне просто это нужно было сделать, долго писать зачем, и это не нужно думаю.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainGameScript : MonoBehaviour
{
// Int

// Bool
// Float
// Slider
// ScrollBar
public Scrollbar SettingsScrollBar;
// GameObject
// PauseGameObject - start
public GameObject PausePanel;
public GameObject DefaultCanvas;
public GameObject SettingsPanel;
public GameObject ExitPanel;
public GameObject CameraWithBlurEffect;
// PauseScript - start
public void Pause()
{
    Time.timeScale = 0;
    PausePanel.SetActive(true);
    DefaultCanvas.SetActive(false);
    ExitPanel.SetActive(false);
    SettingsPanel.SetActive(false);
    CameraWithBlurEffect.SetActive(true);
}
public void PauseContinue()
{
    Time.timeScale = 1;
    PausePanel.SetActive(false);
    DefaultCanvas.SetActive(true);
    CameraWithBlurEffect.SetActive(false);
}
public void ActivateSettingsPanel()
{
    ExitPanel.SetActive(false);
    SettingsPanel.SetActive(true);
    SettingsScrollBar.value = 1;
}
public void ActivateExitPanel()
{
    SettingsPanel.SetActive(false);
    ExitPanel.SetActive(true);
}
public Slider QualitySlider;
private int QualityInt;
public void SetQuality()
{
    QualitySettings.SetQualityLevel((int)QualitySlider.value, true);
    QualityInt = (int)QualitySlider.value;
    PlayerPrefs.SetInt("QualityInt", QualityInt);
    PlayerPrefs.Save();
}
public Slider MusicSliderVolume;
public float MusicVolumeFloat;
public void MusicVolumeSet()
{
    AudioListener.volume = MusicSliderVolume.value;
    MusicVolumeFloat = MusicSliderVolume.value;
    PlayerPrefs.SetFloat("MusicVolume", MusicVolumeFloat);
    PlayerPrefs.Save();
}
// PauseScript - End
// MusicScript - start
private int Music;
private bool NowMusicIsPlay;
public GameObject Music1;
public GameObject Music2;
public GameObject Music3;
public GameObject Music4;
private int RandomMusic;
public Slider MusicSlider;
// как часто будет играть музыка
public void MusicRandomPlay()
{
    RandomMusic = (int)MusicSlider.value;
}
// MusicScript - end
// MainScript - start
private void FixedUpdate()
{
    // MusicScript - start
    if (NowMusicIsPlay == false)
    {
        Music = Random.Range(1, RandomMusic);
        if (Music == 1)
        {
            Music1.SetActive(true);
            NowMusicIsPlay = true;
        }
        if (Music == 2)
        {
            Music2.SetActive(true);
            NowMusicIsPlay = true;
        }
        if (Music == 3)
        {
            Music3.SetActive(true);
            NowMusicIsPlay = true;
        }
        if (Music == 4)
        {
            Music4.SetActive(true);
            NowMusicIsPlay = true;
        }
    }
    if (NowMusicIsPlay == true)
    {
        if (Music1 == false && Music2 == false && Music3 == false && Music4 == false)
        {
            NowMusicIsPlay = false;
        }
    }
    // MusicScript - end
}
void Start()
{
    // PauseScript - start
    if (PlayerPrefs.HasKey("QualityInt"))
    {
        QualityInt = PlayerPrefs.GetInt("QualityInt");
        QualitySlider.value = QualityInt;
        QualitySettings.SetQualityLevel((int)QualitySlider.value, true);
    }
    if (PlayerPrefs.HasKey("MusicVolume"))
    {
        MusicVolumeFloat = PlayerPrefs.GetFloat("MusicVolume");
        MusicSlider.value = MusicVolumeFloat;
        MusicVolumeSet();
    }
    // PauseScript - end
}
private void OnApplicationQuit()
{
    PlayerPrefs.Save();
}
// MainScript - end

}

Answer 1

выполняется при смене значения в слайдере

Нет, впиши туда Debug.Log("Change"); ради прикола.

Помимо всего, код-вермишель. Как должно быть:

Этот класс загружает/хранит/сохраняет

public class AudioValue { // Singaleton паттерн
    private const string MusicValueKey = "MusicValue";
    private static AudioValue _instance;
    private float _musicValue;
    public static AudioValue Instance {
        get {
            if (_instance == null)
                _instance = new AudioValue();
            return _instance;
        }
    }
    public float MusicValue {
        get { return _musicValue; }
        set {
            if (_musicValue != value) {
                _musicValue = value;
                PlayerPrefs.SetFloat(MusicValueKey, _musicValue);
                PlayerPrefs.Save();
            }
        }
    }
    private AudioValue () { // приватный конструктор запрещает создание из вне
        if (PlayerPrefs.HasKey(MusicValueKey))
            _musicValue = PlayerPrefs.GetFloat(MusicValueKey);
        else
            MusicValue = 1;
    }
}

А это компанент для слайдера.

Этот класс реагирует на слайдер

[DisallowMultipleComponent]
[RequireComponent(typeof(Slider))]
public class MusicSlider : MonoBehaviour {
    private Slider _slider;
    private void Awake () {
        _slider = GetComponent<Slider>();
        _slider.value = AudioValue.Instance.MusicValue;
        _slider.onValueChanged.AddListener(SliderChange); // подписка на событие изменения слайдера
    }
    private void SliderChange (float value) {
        AudioValue.Instance.MusicValue = value;
    }
}

И никаких MainGameScript!

Answer 2

На старте я вообще присваивал значение не тому слайдеру, и потом в старте выполнял MusicVolumeSet() т.к. слайдер который нужен был не тронут, то его значение 0, соответственно громкость музыки и переменная MusicVolumeFloat присваивали значение 0, что с другими скриптами я пока не смотрел, думаю там также что-то натворил...

READ ALSO
Иногда не могу найти элемент в словаре (dictionary) - Unity 3D

Иногда не могу найти элемент в словаре (dictionary) - Unity 3D

Есть скрипт он проверяет есть ли объект на позиции - Если нет то Создает его Если есть то ИгнорируетНо проблема в том что он не может найти...

228
Как оптимизировать CLS (Google Page Speed)?

Как оптимизировать CLS (Google Page Speed)?

Есть несколько страниц, где никудышный показатель CLS в Google Page SpeedКонтент на страницах - текст, изображение, много текста

131
VSCode нужно настроить

VSCode нужно настроить

всем привет! не могу понять как решить эту проблему если есть решения, не работает подсказки и автозаполнения в обратных кавычках в JS файлеможно...

186