せっかく調整してもらった音量設定が、ゲームを再起動したら元どおり——データを保存しないゲームは、起動するたびに「初対面」に戻ってしまいます。音量・画質・ハイスコアといった小さなデータをいちばん手軽に保存できるのが、Unity標準の PlayerPrefs です。
この記事では、PlayerPrefsの基本的な使い方(Set/Get/Save)と、その手軽さの裏にある注意点・使ってはいけないケース、そして実際のオプション画面への組み込みまでを解説します。
この記事でわかること
PlayerPrefsの基本——キーと値のペアで保存する仕組みSet/Getメソッドと デフォルト値の鉄則Save()を呼ぶタイミング(クラッシュ対策)- 使ってはいけないケース——暗号化されない・3型しか扱えない
- 設定はPlayerPrefs、セーブデータはJSONファイル、の使い分け
PlayerPrefsの基本的な使い方
PlayerPrefsは、3種類のデータ型(int, float, string)のみをサポートしています。それぞれのデータ型に対応したSetメソッド(保存)とGetメソッド(読み込み)が用意されています。

データの保存: Setメソッド
データを保存するには、SetInt(), SetFloat(), SetString()メソッドを使います。第一引数にデータを識別するためのキー(文字列)、第二引数に保存したい値を指定します。
using UnityEngine;
public class GameSettings : MonoBehaviour
{
public void SaveVolume(float volumeLevel)
{
// "MasterVolume"というキーで、float型の音量データを保存
PlayerPrefs.SetFloat("MasterVolume", volumeLevel);
}
public void SaveHighScore(int score)
{
// "HighScore"というキーで、int型のハイス コアを保存
PlayerPrefs.SetInt("HighScore", score);
}
}
重要: Setメソッドを呼び出しただけでは、データはまだメモリ上にあり、ディスクには書き込まれていません。ゲームがクラッシュした場合などにデータが失われるのを防ぐため、重要なデータを保存した直後にはPlayerPrefs.Save()を呼び出して、明示的にディスクへの書き込みを指示するのが安全です。
public void SaveAllSettings()
{
PlayerPrefs.SetInt("QualityLevel", 2);
PlayerPrefs.SetFloat("MusicVolume", 0.8f);
// メモリ上の変更をディスクに即座に書き込む
PlayerPrefs.Save();
}

データの読み込み: Getメソッド
保存したデータを読み込むには、GetInt(), GetFloat(), GetString()メソッドを使います。第一引数に、保存時に使ったキーを指定します。
このとき、第二引数としてデフォルト値を指定すること が非常に重要です。指定したキーのデータが存在しない場合(例: ゲームの初回起動時)、このデフォルト値が返されます。デフォルト値を指定しないと、キーが存在しない場合に0や空文字が返され、意図しない挙動の原因となります。

using UnityEngine;
using UnityEngine.UI;
using TMPro; // テキスト表示はTextMeshProが現在の標準
public class LoadSettings : MonoBehaviour
{
public Slider volumeSlider;
public TextMeshProUGUI highScoreText;
void Start()
{
// "MasterVolume"キーのデータを読み込む。存在しない場合はデフォルト値1.0fを使う。
float savedVolume = PlayerPrefs.GetFloat("MasterVolume", 1.0f);
volumeSlider.value = savedVolume;
// "HighScore"キーのデータを読み込む。存在しない場合はデフォルト値0を使う。
int highScore = PlayerPrefs.GetInt("HighScore", 0);
highScoreText.text = "High Score: " + highScore;
}
}
tips: テキスト表示に旧
TextではなくTextMeshProUGUIを使う理由は TextMeshProの記事 を参照してください。
その他の便利なメソッド
PlayerPrefs.HasKey(string key): 指定したキーのデータが存在するかどうかをbool値で返します。初回起動時の処理を分岐させたい場合などに便利です。PlayerPrefs.DeleteKey(string key): 指定したキーのデータを削除します。PlayerPrefs.DeleteAll(): すべてのPlayerPrefsデータを削除します。ゲームのリセット機能などで使いますが、非常に強力なため取り扱いには注意が必要です。
PlayerPrefsの注意点と限界
PlayerPrefsは非常に手軽で便利ですが、万能ではありません。使うべきでないケースを理解しておくことが重要です。
1. セキュリティの問題
PlayerPrefsで保存されるデータは、暗号化されていません。少し知識のあるユーザーであれば、保存されたファイルを簡単に見つけ出し、内容を書き換えることができてしまいます。ハイスコアや所持金といった、改ざんされると困るような重要なデータをPlayerPrefsでそのまま保存するのは非常に危険です。

対策:
- 重要なデータを保存する場合は、
PlayerPrefsを使う前に必ず独自の暗号化処理を施す必要があります。 - あるいは、
PlayerPrefsは使わずに、JSONやバイナリ形式でファイルに書き出し、そのファイル自体を暗号化する、より本格的なセーブシステムの導入を検討します。
2. 複雑なデータの保存
PlayerPrefsが扱えるのはint, float, stringの3種類のみです。プレイヤーのインベントリ(アイテムのリスト)、キャラクターのステータス、クエストの進捗といった複雑な構造を持つデータを保存するには不向きです。
対策:
JsonUtilityやJson.NETといったライブラリを使って、自作クラスのインスタンスをJSON形式の文字列に変換(シリアライズ)し、それをPlayerPrefs.SetString()で保存する方法があります。これは比較的手軽で一般的な手法です。- より大規模で複雑なセーブデータの場合は、専用のセーブファイル(バイナリ形式など)を作成する方が、パフォーマンスや拡張性の面で優れています。
実践:音量設定を保存するオプション画面を組む
アクションでもRPGでもパズルでも、リリースするゲームには必ず「オプション画面の音量スライダー」が付きます。そして仕様は毎回同じ——動かしたら即反映、閉じたら保存、次回起動時に復元。PlayerPrefsのもっとも王道な使い道を、実際に組んでみましょう。
