Menu
CoddyTech

保存设置

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 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 会将控件的新值传给监听器:Toggle 的值是 bool,Slider 的值是 float,其位置由 slider.value 表示。在代码中设置 isOn 或 value,会像玩家操作控件一样更改控件,因此值发生变化时也会调用监听器。这就是为什么要在加载之后添加监听器:如果先添加,监听器就会在每次启动时运行,并立即将加载的值保存回去。SetIsOnWithoutNotify 和 SetValueWithoutNotify 可以设置控件,但不会调用任何监听器。

默认值决定新玩家会得到什么。GetInt("ShowTimer", 1) 会显示计时器,直到玩家将其关闭;如果默认值为 0,那么从未打开过设置的玩家都会看不到计时器。浮点数设置也可以用相同的方式加载: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() 保存它。

按“开始”并移动滑块,然后按“停止”再按“开始”:滑块会保持在你上次设置的位置。然后点击“检查”。

亲手试试

using UnityEngine;
using UnityEngine.UI;
using TMPro;

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

    void Start()
    {
        // 加载已保存的音量,应用并显示,然后监听滑块的变化
    }

    void OnVolumeChanged(float value)
    {
        // 应用、显示并保存新音量
    }

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

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器