Menu
CoddyTech

Guardar ajustes

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 25 de 60.

Un ajuste se elige una vez y se espera que se conserve en todas las partidas posteriores, así que debe guardarse en PlayerPrefs. Cuando empieza el juego, carga el ajuste, asígnalo a su control para que la pantalla de ajustes lo muestre y aplícalo al juego. Cuando el jugador cambie el control, aplica el nuevo valor y guárdalo. Este interruptor (using UnityEngine.UI;) muestra u oculta el temporizador en pantalla y, como PlayerPrefs no tiene un tipo bool, almacena 1 si está activado y 0 si está desactivado:

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 pasa el nuevo valor del control al oyente: un bool para un Toggle y un float para un Slider, cuya posición es slider.value. Asignar isOn o value desde el código cambia el control igual que lo haría un jugador, así que, cuando cambia el valor, también se llama a los oyentes. Por eso el oyente se añade después de cargar el ajuste: si se añadiera antes, se ejecutaría cada vez que el juego empieza y guardaría inmediatamente el valor cargado. SetIsOnWithoutNotify y SetValueWithoutNotify configuran un control sin llamar a ningún oyente.

El valor predeterminado determina qué obtiene un jugador nuevo. GetInt("ShowTimer", 1) muestra el temporizador hasta que el jugador lo desactiva; un valor predeterminado de 0 lo ocultaría para todos los que nunca abrieran los ajustes. Un ajuste de tipo float se carga del mismo modo con PlayerPrefs.GetFloat(key, defaultValue): GetFloat("MouseSensitivity", 1.5f) asigna 1.5 a un jugador nuevo. El ajuste del volumen se aplica a AudioListener.volume, el volumen maestro de Unity, que va de 0 (silencio) a 1 (volumen máximo) y ajusta todos los sonidos del juego.

challenge icon

Desafío

Intermedio

Haz que el control deslizante de volumen sea un ajuste guardado con la clave Volume.

  1. En Start(), carga PlayerPrefs.GetFloat("Volume", 0.8f), asígnalo a slider.value y AudioListener.volume, y llama a ShowVolume.
  2. Después, añade slider.onValueChanged.AddListener(OnVolumeChanged);.
  3. En OnVolumeChanged, aplica value a AudioListener.volume, muéstralo y guárdalo con PlayerPrefs.SetFloat y PlayerPrefs.Save().

Pulsa «Jugar» y mueve el control deslizante; después, pulsa Stop y «Jugar»: se queda donde lo dejaste. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;
using UnityEngine.UI;
using TMPro;

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

    void Start()
    {
        // Carga el volumen guardado, aplícalo y muéstralo; luego escucha los cambios del slider
    }

    void OnVolumeChanged(float value)
    {
        // Aplica, muestra y guarda el nuevo volumen
    }

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

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity