設定を保存する
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 25/56。
設定は一度選んだら、その後のすべてのゲームでも保持されることが期待されるため、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にすると、設定を一度も開いたことのないプレイヤーにはタイマーが表示されません。float型の設定も同様に、PlayerPrefs.GetFloat(key, defaultValue)で読み込みます。GetFloat("MouseSensitivity", 1.5f)では、新しいプレイヤーの値は1.5になります。
チャレンジ
中級設定画面には、0 から 1 までの音量スライダーと、音量をパーセンテージで表示するテキストがあります。音量を Volume というキーで保存される設定にしてください。
- 新しいプレイヤーの音量は 0.8 で始まり、Volume: 80% と表示されます。
- 音量は
AudioListener.volumeを通じてゲーム全体に適用されます。これは Unity のマスター音量で、0(無音)から 1(最大)までの値を取り、ゲーム内のすべてのサウンドの音量を調整します。 - ゲームの開始時に保存された音量が適用され、スライダーとテキストに表示されます。
- プレイヤーがスライダーを動かすと、新しい音量が適用され、テキストが連動して更新され、音量が保存されます。
ShowVolume(float volume) はすでにテキストを書き込みます。
Play を押してスライダーを動かし、次に Stop を押してからもう一度 Play を押し、その後 Check を押してください。
自分で試してみよう
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) + "%";
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。