Как я могу сохранить и загрузить некоторые настройки man menu, такие как громкость?

#c# #unity3d

#c# #unity3d

Вопрос:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;
using TMPro;
using System;

public class Settings : MonoBehaviour
{
    public AudioMixer audioMixer;
    public TMP_Dropdown resolutionDropdown;
    public Text musicText;
    public Text sfxText;
    public Slider[] audioSliders;

    private Resolution[] resolutions;

    private void Start()
    {
        resolutions = Screen.resolutions;

        resolutionDropdown.ClearOptions();

        List<string> options = new List<string>();

        int currentResolutionIndex = 0;
        for(int i = 0; i < resolutions.Length; i  )
        {
            string option = resolutions[i].width   " x "   resolutions[i].height;
            options.Add(option);

            if(resolutions[i].width == Screen.currentResolution.width amp;amp;
                resolutions[i].height == Screen.currentResolution.height)
            {
                currentResolutionIndex = i;
            }
        }

        resolutionDropdown.AddOptions(options);
        resolutionDropdown.value = currentResolutionIndex;
        resolutionDropdown.RefreshShownValue();

        float musicvolume = PlayerPrefs.GetFloat("musicvolume");
        float sfxvolume = PlayerPrefs.GetFloat("sfxvolume");

        musicText.text = musicvolume.ToString();
        sfxText.text = sfxvolume.ToString();
        audioSliders[0].value = musicvolume;
        audioSliders[1].value = sfxvolume;
    }

    public void SetResolution(int resolutionIndex)
    {
        Resolution resolution = resolutions[resolutionIndex];
        Screen.SetResolution(resolution.width, resolution.height, Screen.fullScreen);
    }

    public void SetMusicVolume(float volume)
    {
        audioMixer.SetFloat("musicvol", Mathf.Log10(volume) * 20);
        musicText.text = Math.Round(volume * 100, MidpointRounding.AwayFromZero).ToString();

        PlayerPrefs.SetFloat("musicvolume", (float)Math.Round(volume * 100, MidpointRounding.AwayFromZero));
    }

    public void SetSfxVolume(float volume)
    {
        audioMixer.SetFloat("sfxvol", Mathf.Log10(volume) * 20);
        sfxText.text = Math.Round(volume * 100, MidpointRounding.AwayFromZero).ToString();

        PlayerPrefs.SetFloat("sfxvolume", (float)Math.Round(volume * 100, MidpointRounding.AwayFromZero));
    }

    public void SetQuality(int qualityIndex)
    {
        QualitySettings.SetQualityLevel(qualityIndex);
    }

    public void SetFullscreen(bool isFullscreen)
    {
        Screen.fullScreen = isFullscreen;
    }
}
  

В Start() Я загружаю :

         float musicvolume = PlayerPrefs.GetFloat("musicvolume");
        float sfxvolume = PlayerPrefs.GetFloat("sfxvolume");

        musicText.text = musicvolume.ToString();
        sfxText.text = sfxvolume.ToString();
        audioSliders[0].value = musicvolume;
        audioSliders[1].value = sfxvolume;
  

А затем сохранение двумя способами :

 public void SetMusicVolume(float volume)
        {
            audioMixer.SetFloat("musicvol", Mathf.Log10(volume) * 20);
            musicText.text = Math.Round(volume * 100, MidpointRounding.AwayFromZero).ToString();
    
            PlayerPrefs.SetFloat("musicvolume", (float)Math.Round(volume * 100, MidpointRounding.AwayFromZero));
        }
    
        public void SetSfxVolume(float volume)
        {
            audioMixer.SetFloat("sfxvol", Mathf.Log10(volume) * 20);
            sfxText.text = Math.Round(volume * 100, MidpointRounding.AwayFromZero).ToString();
    
            PlayerPrefs.SetFloat("sfxvolume", (float)Math.Round(volume * 100, MidpointRounding.AwayFromZero));
        }
  

Когда я меняю громкость ползунков во время игры, она сохраняет и загружает текст и устанавливает значение в тексте, но это не меняет значения ползунков, ползунки всегда начинаются с самого правого конца.

Например, я устанавливаю громкость музыки на 44, когда игра запущена :

Громкость установлена на 44

Затем я останавливаю игру и запускаю ее снова :

В аудиомикшере справа в музыкальной группе ползунок находится на 0, а в игре ползунок находится в самом правом конце, но текстовое значение показывает 44.

Как я могу сделать так, чтобы значение ползунка также менялось на 44, а не только текст ползунка?

Текстовое значение равно 44, но значение ползунка не равно 44

Это то, что я делаю в Start(), чтобы установить значение slider / s :

 audioSliders[0].value = musicvolume;
audioSliders[1].value = sfxvolume;
  

но это не меняет его при запуске игры, значение ползунка равно 100, а текстовое значение равно 44.

И та же идея, которую я хочу сохранить / загрузить все настройки главного меню.

Скриншот настроек музыкального слайдера инспектора :

Настройки музыкального слайдера в инспекторе

Комментарии:

1. Верны ли минимальные и максимальные значения ползунков после загрузки? также проверьте значения в инспекторах, являются ли они «правильными»?

2. Вы также можете попытаться активно принудительно сохранить PlayerPrefs через PlayerPrefs.Save(); По умолчанию это происходит только в OnApplicationQuit , но в любом случае вы должны делать это на определенных «контрольных точках» во время выполнения

3. @derHugo Значения в обоих ползунках равны min = 0.0001 и max = 1, а свойство Value установлено равным 1. Эти минимальные и максимальные значения предназначены для выполнения вычислений в методах SetMusicVolume и SetFsxVolume. Может быть, мне нужно выполнить эти вычисления также в начале?

4. Я добавил еще один скриншот настроек музыкального слайдера инспектора.

Ответ №1:

Теперь я вижу, что при сохранении значения вы делаете

 PlayerPrefs.SetFloat("musicvolume", (float)Math.Round(volume * 100, MidpointRounding.AwayFromZero));
  

не означает ли это, что в Start вам нужно будет сделать

 audioSliders[0].value = musicvolume / 100f;
  

Тот факт, что ваш ползунок также переходит от 0.0001 к 1 , звучит как передача 44 (сохраненного вами значения), поскольку value это не то, что вы хотели. 0.44 Вместо этого это должно быть исходное значение ползунка перед умножением на 100 и сохранением результата.

Или, в качестве альтернативы, я бы предпочел сохранить правильное значение ползунка в PlayerPrefs и выполнять любые вычисления только для примененной громкости и отображения, но использовать исходные значения для ползунка. Но это, конечно, чисто дело вкуса.

Комментарии:

1. Что вы имеете в виду, передавая 44 в качестве значения? Я установил минимальное значение max из этого руководства gamedevbeginner.com/… Должен ли я изменить min max?

2. минимальный максимум в порядке.. но когда вы устанавливаете значение, которое вы сохраняете volume * 100 .. поскольку текст после загрузки 44 , я знаю, что это значение, которое вы сохранили .. однако при повторном применении его к ползунку оно снова должно быть 0.44 , поскольку ползунок использует значения от 0 до 1. Если вы передадите value = 44 , оно будет ограничено максимальным значением.. вот почему ползунок после загрузки всегда был на 1