#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, когда игра запущена :
Затем я останавливаю игру и запускаю ее снова :
В аудиомикшере справа в музыкальной группе ползунок находится на 0, а в игре ползунок находится в самом правом конце, но текстовое значение показывает 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