はじめに
今回はデータのセーブ・ロード行う機能である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つの静的メソッドを利用します。Setint
・SetFloat
・SetStrring
はそれぞれ引数に取れる型が異なることに注意してください。
// 使用例 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"); }
注意点
セーブされているデータの型とGetInt
・GetFloat
・GetString
の返り値の型が異なる場合,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
で何故値が取得できるの?みたいに思う方もいるかもしれませんが,おそらくPlayerPrefs
はPlayerPrefs.Save
からもわかる通り,データがキャッシュされたものとディスクの書き込まれたものの2種類あると思います。
(間違っていたらすいません)
これは憶測ですが,
- 起動時(もしくは静的コンストラクタ)にストレージからメモリにロード
- ゲーム中にメモリの値をGet・Set・Deleteなど
- ゲーム終了時(
OnApplicationQuit()
)にメモリのデータをストレージに記憶
というのがUnityの想定している使い方なのだと思います。
もし疑問に思われていた方の手助けになれば幸いです。
ではまた。