保存设置
本课属于 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(最大音量),可以调节游戏中的所有声音。
挑战
中等将音量滑块设为使用键 Volume 保存的设置。
- 在
Start()中,加载PlayerPrefs.GetFloat("Volume", 0.8f),将其赋给slider.value和AudioListener.volume,并调用ShowVolume。 - 然后添加
slider.onValueChanged.AddListener(OnVolumeChanged);。 - 在
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 在线编辑器