はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】PlayerPrefsを自由自在に操れるようまとめてみる

はじめに

今回はデータのセーブ・ロード行う機能であるPlayerPrefsについて取り上げたいと思います。
docs.unity3d.com

PlayerPrefsの全機能を網羅する予定なのであしからず。

セーブする

public static void SetInt (string key, int value);
public static void SetFloat (string key, float value);
public static void SetString (string key, string value);
引数 意味
key キー
value セーブするデータ


データをセーブするにはこの3つの静的メソッドを利用します。SetintSetFloatSetStrringはそれぞれ引数に取れる型が異なることに注意してください。

// 使用例
void Start()
{
    PlayerPrefs.SetInt("key1", 5);
    PlayerPrefs.SetFloat("key2", 10.0f);
    PlayerPrefs.SetString("key3", "str");
}
key value
key1 5
key2 10.0f
key3 "str"

注意点

同じkeyに対してセーブを行った場合,最後に行ったセーブデータ以外は破棄されます。

void Start()
{
    PlayerPrefs.SetInt("key", 5);
    PlayerPrefs.SetFloat("key", 10f);
    PlayerPrefs.SetString("key", "str");
}
key value
key "str"

ロードする

public static int GetInt (string key);
public static int GetInt (string key, int defaultValue);
public static float GetFloat (string key);
public static float GetFloat (string key, float defaultValue);
public static string GetString (string key);
public static string GetString (string key, string defaultValue);
引数 意味
key キー
value セーブするデータ
defaultValue キーに対応するセーブデータがなかったの時に返す値

データをロードするにはGetInt, GetFloat, GetString(それぞれオーバーロードが2つ)を利用します。

// 使用例
void Start()
{
    int i = PlayerPrefs.GetInt("key1");
    float j = PlayerPrefs.GetFloat("key2");
    string s = PlayerPrefs.GetString("key3");
}

注意点

セーブされているデータの型とGetIntGetFloatGetStringの返り値の型が異なる場合,defaultValue・引数で定義していないときはその型のデフォルト値が返ってきます。

ちなみにint, float, stringのデフォルト値は0, 0f, nullですね。

セーブの説明で書いた注意点とあわせると結構不思議な現象がおこります。

void Start()
{
    PlayerPrefs.SetInt("key", 5);
    PlayerPrefs.SetFloat("key", 10f);
    PlayerPrefs.SetString("key", "str");
        
    // i = 0
    int i = PlayerPrefs.GetInt("key");

    // j = 0f
    float j = PlayerPrefs.GetFloat("key");

    // s = "str"
    string s = PlayerPrefs.GetString("key");
}
key value
key "str"

セーブデータを削除する

public static void DeleteKey (string key);
// 使用例
void Start()
{
    PlayerPrefs.SetInt("key", 5);

    PlayerPrefs.DeleteKey("key");
            
    // false
    var flag = PlayerPrefs.HasKey("key");
        
    // 0  :  default(int)
    var i = PlayerPrefs.GetInt("key");

    // キーが存在しなくてもエラーは吐かない
    PlayerPrefs.DeleteKey("hoge");
}

すべてのセーブデータを削除する

public static void DeleteAll ();
// 使用例
void Start()
{
    PlayerPrefs.SetInt("key", 5);

    PlayerPrefs.DeleteAll();
            
    // false
    var flag = PlayerPrefs.HasKey("key");
}

セーブデータがあるか調べる

public static bool HasKey (string key);

key が設定に存在した場合、true を返します。

// 使用例
void Start()
{
    PlayerPrefs.SetInt("key", 5);

    // true
    var flag1 = PlayerPrefs.HasKey("key");

    // false
    var flag2 = PlayerPrefs.HasKey("hoge");
}
key value
key 5

変更された値をディスクに保存する

public static void Save ();

ただPlayerPrefs.SaveはデフォルトでOnApplicationQuit()にて自動で呼び出されます。なのでクラッシュしたときの対策として途中セーブを行うといった使い方以外は明示的に利用する必要はありません。

むしろディスクの書き込みでエラーや不都合が発生する可能性があるので,多用しないほうがいいかもしれません。

さいごに

SaveしてないのにSetInt -> GetIntで何故値が取得できるの?みたいに思う方もいるかもしれませんが,おそらくPlayerPrefsPlayerPrefs.Saveからもわかる通り,データがキャッシュされたものとディスクの書き込まれたものの2種類あると思います。
(間違っていたらすいません)

f:id:hanaaaaaachiru:20210410120945p:plain
PlayerPrefsの仕組みの予想

これは憶測ですが,

  1. 起動時(もしくは静的コンストラクタ)にストレージからメモリにロード
  2. ゲーム中にメモリの値をGet・Set・Deleteなど
  3. ゲーム終了時(OnApplicationQuit())にメモリのデータをストレージに記憶

というのがUnityの想定している使い方なのだと思います。

もし疑問に思われていた方の手助けになれば幸いです。

ではまた。

【Unity】xorを使った暗号化の基礎からPlayerPrefsの暗号化クラス作成まで - はなちるのマイノート