設定を保存する
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()
{
// 保存された音量を読み込み、適用して表示した後、sliderの変更を監視する
}
void OnVolumeChanged(float value)
{
// 新しい音量を適用し、表示して保存する
}
void ShowVolume(float volume)
{
volumeText.text = "Volume: " + Mathf.RoundToInt(volume * 100) + "%";
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド