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()
    {
        // 保存された音量を読み込み、適用して表示した後、sliderの変更を監視する
    }

    void OnVolumeChanged(float value)
    {
        // 新しい音量を適用し、表示して保存する
    }

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

本格的なゲームを作るのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド