【Unity】PlayerPrefsの使い方と落とし穴【コピペ可】

に公開
使い方と落とし穴シリーズ一覧
さっさと試したい人向け コピペ可コード
using UnityEngine;

public class Test_PlayerPrefs : MonoBehaviour
{
    void Start()
    {
        PlayerPrefs.SetInt("HighScore", 100);
        PlayerPrefs.SetFloat("Volume", 0.8f);
        PlayerPrefs.SetString("PlayerName", "ChatGPT");

        PlayerPrefs.Save();
        Debug.Log("データを保存");

        int score = PlayerPrefs.GetInt("HighScore", 0);
        float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
        string name = PlayerPrefs.GetString("PlayerName", "DefaultName");

        Debug.Log($"HighScore: {score}");
        Debug.Log($"Volume: {volume}");
        Debug.Log($"PlayerName: {name}");
    }
}
  • 間違えて記事削除したので再投稿しました (めちゃくちゃ焦った)

一言

  • 正直、他の手段を探った方がイイと思う (理由は「落とし穴」にて)
  • ただ、簡単に使えて追加機能インストールの必要もないため、開発規模次第でアリ

PlayerPrefsを使用するケース

  • 軽量で簡単なデータの保存(例:ハイスコア、プレイヤー名)
  • 最悪書き換えられてもいいデータ

PlayerPrefsの使い方

基本操作

  • 書込と読込
  • Get…関数の第二引数では、指定キー対応の値が無い場合に返す値を指定している
PlayerPrefs.SetInt("Score", 100);
int score = PlayerPrefs.GetInt("Score", 0); //戻り値:100
  • 指定キーの有無をチェック
string key = "Score"
PlayerPrefs.SetString(key, "Test");
if(PlayerPrefs.HasKey(key))
  • 明示的に保存
PlayerPrefs.SetFloat("Score", 3.14);
PlayerPrefs.Save(); //それまでの内容を全て保存する
  • 削除
PlayerPrefs.DeleteAll(); //全データの削除
PlayerPrefs.DeleteKey("KeyString"); //指定キーの削除

対応する型

  • int (SetInt, GetInt)
  • float (SetFloat, GetFloat)
  • string (SetString, GetString)
  • 以上。

PlayerPrefsのメリット

  • 簡単に使える(ファイル操作不要)
  • Unity対応の全プラットフォームで使える

オイラはこんな落とし穴に出会った

セキュリティ面が不安

  • 平文で保存される
  • 特にWindows,Mac,Linux,WebGLプラットフォームは容易にアクセスできる場所に保存
  • 暗号化処理の実装で解決できないこともない

複雑なデータに向かない

  • 前述の通り、int, float, string にのみ対応
  • シリアライズ化, JSONを介してstring で渡す等で解決できないこともない

WebGLでは約1MBが保存上限

WebGL: Unity stores up to 1MB of PlayerPrefs data using the browser's IndexedDB API. For more information, see IndexedDB.
Unity - PlayerPrefs

他の保存手段との比較

手段 特徴 向いてる用途 実現例
PlayerPrefs 超簡単,セキュリティ不安 オプション保存 PlayerPrefs.SetXxx()
JSON + ファイル保存 柔軟な構造 セーブスロット,進行データ JsonUtility.ToJson() + File.WriteAllText()
ScriptableObject エディタで管理しやすい, 実行中の動的な保存には不向き 定数,プリセット ScriptableObject継承
MessagePack など 圧縮, 高速, バイナリ形式 セーブシステム, 外部送信 FileStream + ライブラリ

参考

Discussion