Menu
CoddyTech

設定を保存する

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になります。

challenge icon

チャレンジ

中級

設定画面には、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) + "%";
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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