Unity入門

【Unity】PlayerPrefsでデータの保存・読み込み・削除をする方法

この記事について

この記事では PlayerPrefs を使ってデータを保存・読み込みする方法について解説します。
小規模なセーブデータや設定保存などに便利で、Unity標準で提供されている仕組みです。
※PlayerPrefsは公式から非推奨とされていますので、重要なデータの保存はやめておきましょう。

この記事でわかること

  • PlayerPrefs とは何か
  • 保存できるデータ型(int, float, string)
  • 保存・読み込み・削除の方法

データの保存とは?

Unityで使用できるデータの保存方法は複数あります。以下のサイトを参考にして下さい。

PlayerPrefsとは?

PlayerPrefs は、Unity が提供する 簡易的な永続データ保存機能 です。
データは端末(PCやスマホ)のローカルに保存され、アプリを終了しても保持されます。

保存できるデータ型は以下の3種類です。

  • int(整数)
  • float(小数)
  • string(文字列)

データの保存場所

PlayerPrefsで保存する場合は保存場所がWindowsやMacbookだと「Company Name」と「Product Name」に依存します。これらの設定はProject Settingsの画像の場所です。

次にデータの保存場所ですが、OSによって異なります。保存場所は以下の通りです。

プラットフォーム保存場所補足
Windowsレジストリ
HKEY_CURRENT_USER\Software\[CompanyName]\[ProductName]
[CompanyName] / [ProductName] は Project Settings > Player で設定した値
Windows (UWP)アプリのローカル設定領域レジストリには保存されない
macOS~/Library/Preferences/unity.[CompanyName].[ProductName].plistdefaults read unity.[CompanyName].[ProductName] で確認可能
iOSNSUserDefaults
<App Sandbox>/Library/Preferences/[bundleid].plist
[bundleid] = バンドルID
AndroidSharedPreferences
/data/data/[bundleid]/shared_prefs/[bundleid].xml
root 端末や Android Studio で確認可能
Linux~/.config/unity3d/[CompanyName]/[ProductName]/prefsテキストファイル形式

ただし、実はビルドの時はデータの保存場所が異なるのでWindows11で説明していきます。

  1. 「Windows +R」でレジストリエディターを開く
  2. 「HKEY_CURRENT_USER」→「Software」→「Unity」→「UnityEditor」→「Company Name」→「Product Name

PlayerPrefsでデータ操作

PlayerPrefsの準備

まずはヒエラルキーで右クリックをして空のGameObjectを1つ用意します。
・「右クリック」→「Create Empty」

次にスクリプトを作成して先ほどのCreate Emptyにアタッチしてください。

データを保存する(Set)

データの保存は「SetInt , SetFloat , SetString」で保存できます。Set(第一引数,第二引数)となっており、データを扱うときは第一引数を「Key(キー)」、第二引数を「Value(バリュー)」と言うことが多いです。

using UnityEngine;

public class Data_PlayerPrefs : MonoBehaviour
{
    void Start()
    {
        // int型の保存
        PlayerPrefs.SetInt("Int", 100);

        // float型の保存
        PlayerPrefs.SetFloat("Float", 0.8f);

        // string型の保存
        PlayerPrefs.SetString("String", "Test");

        // 実際に保存を確定
        PlayerPrefs.Save();
    }
}

実行してみると、それぞれデータが保存されましたね。
※投稿者は読み方がわかりませんが型が先頭にあるのでわかりました。

データの読み込み(Get)と存在確認(HasKey)

データを保存するということはデータの読み込みもします。データの読み込みには「GetInt , GetFloat , GetString」を使用します。ただし、存在しないデータを読み込むとエラーが起きます。それを回避するためにデータの存在確認を「HasKey」で行います。

using UnityEngine;

public class Data_PlayerPrefs : MonoBehaviour
{
    void Start()
    {
        //存在するデータ
        if (PlayerPrefs.HasKey("Int"))
        {
            int i = PlayerPrefs.GetInt("Int");  //データの読み込み
            Debug.Log("データ: " + i);
        }

        //存在しないデータ
        if (PlayerPrefs.HasKey("Score"))
        {
            Debug.Log("データあり");
        }
        else
        {
            Debug.Log("データなし");
            int highScore = PlayerPrefs.GetInt("Score", 10);       // デフォルト値 10
        }

        //存在しないデータ
        if (PlayerPrefs.HasKey("Score"))
        {
            Debug.Log("データあり");
        }
    }
}

実行してみると、存在するデータと存在しないデータの確認が取れましたね。
GetXxx(key, defaultValue)」 として書くと、データが存在しない場合にデフォルト値を返してくれます。しかし、その後に確認してもデータはありません。つまり保存しているわけではありません。

削除する(Delete)

データを扱う上でデータの削除も必須です。そのような時に特定のデータの削除「DeleteKey(“Key”)」、全てのデータを削除「DeleteAll」を使用します。

using UnityEngine;

public class Data_PlayerPrefs : MonoBehaviour
{
    void Start()
    {
        // 特定のキーを削除
        PlayerPrefs.DeleteKey("Int");
    }
}

実行してみるとIntだけ消えましたね。

それでは最後にすべてのデータを削除して終わりましょう。

using UnityEngine;

public class Data_PlayerPrefs : MonoBehaviour
{
    void Start()
    {
        // 全データを削除
        PlayerPrefs.DeleteAll();
    }
}

実行してみると、データがすべて削除されましたね。(最初からあるデータは見せたらダメな気がして隠してます。)

注意点

  • 保存できるのは int, float, string のみ
  • データ量が多い場合は不向き(セーブデータやアイテム管理はJSON 保存の方が適切)
  • データはユーザーが改ざん可能なので、チート対策にはならない

まとめ

  • PlayerPrefs は「BGMやオプションデータ等の保存」に便利
  • int / float / string を保存・取得できる
  • Set / Get / Delete を使いこなせば基本はOK