Menu
CoddyTech

Сохранение настроек

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 25 из 60.

Настройку выбирают один раз и ожидают, что она сохранится во всех последующих запусках игры, поэтому её нужно хранить в PlayerPrefs. При запуске игры загрузите настройку, установите её значение для элемента управления, чтобы оно отображалось на экране настроек, и примените его в игре. Когда игрок изменит значение элемента управления, примените новое значение и сохраните его. Этот переключатель (using UnityEngine.UI;) показывает или скрывает таймер на экране, а поскольку в PlayerPrefs нет типа bool, он сохраняет 1 для включённого состояния и 0 для выключенного:

public Toggle timerToggle;
public GameObject timerText;

void Start()
{
    bool show = PlayerPrefs.GetInt("ShowTimer", 1) == 1;
    timerToggle.isOn = show;
    timerText.SetActive(show);
    timerToggle.onValueChanged.AddListener(OnTimerToggled);
}

void OnTimerToggled(bool on)
{
    timerText.SetActive(on);
    PlayerPrefs.SetInt("ShowTimer", on ? 1 : 0);
    PlayerPrefs.Save();
}

onValueChanged передаёт слушателю новое значение элемента управления: bool для Toggle и float для Slider, положение которого задаётся как slider.value. Присваивание isOn или value из кода изменяет элемент управления так же, как это делает игрок, поэтому при изменении значения также вызываются слушатели. Именно поэтому слушатель добавляется после загрузки: если добавить его раньше, он будет срабатывать при каждом запуске и сразу же сохранять загруженное значение обратно. SetIsOnWithoutNotify и SetValueWithoutNotify задают значение элемента управления, не вызывая слушателей.

Значение по умолчанию определяет, что получит новый игрок. GetInt("ShowTimer", 1) показывает таймер, пока игрок его не отключит; значение по умолчанию 0 скрыло бы таймер у всех, кто ни разу не открывал настройки. Настройка типа float загружается аналогичным образом с помощью PlayerPrefs.GetFloat(key, defaultValue): GetFloat("MouseSensitivity", 1.5f) задаёт новому игроку значение 1.5. Громкость задаётся через AudioListener.volume — это общая громкость Unity от 0 (без звука) до 1 (максимум), которая регулирует громкость всех звуков в игре.

challenge icon

Задание

Средне

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

  1. В Start() загрузи PlayerPrefs.GetFloat("Volume", 0.8f), присвой это значение slider.value и AudioListener.volume, а затем вызови ShowVolume.
  2. Затем добавь slider.onValueChanged.AddListener(OnVolumeChanged);.
  3. В OnVolumeChanged присвой value свойству AudioListener.volume, отобрази его и сохрани с помощью PlayerPrefs.SetFloat и PlayerPrefs.Save().

Нажми «Играть» и передвинь ползунок, затем нажми Stop и «Играть»: ползунок останется там, где ты его оставил. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class VolumeSetting : MonoBehaviour
{
    public Slider slider;
    public TMP_Text volumeText;

    void Start()
    {
        // Загрузить сохранённую громкость, применить и отобразить её, затем отслеживать изменения slider
    }

    void OnVolumeChanged(float value)
    {
        // Применить, отобразить и сохранить новую громкость
    }

    void ShowVolume(float volume)
    {
        volumeText.text = "Volume: " + Mathf.RoundToInt(volume * 100) + "%";
    }
}

Все уроки раздела Создание настоящих игр

Потренируйтесь самостоятельно: Песочница Unity