【Unity】 PlayerPrefs でゲームデータのセーブ・ロードを実装する

Unityでゲーム開発をしていると、ハイスコアや進行フラグといったデータを保存したくなると思います。
ゲームデータの積み上げ行為はプレイのモチベーションの中でも重要な要素です。
KuroMikanが制作した『🔍いらいらバスケット』でもハイスコアのセーブ・ロードを実装しています。
※プロダクトの紹介は後日改めて・・・

今回は、Unityでゲームデータを端末に保存する最も簡単な方法を紹介します。

データを保存する

PlayerPrefs.SetInt("Data", 10);
PlayerPrefs.SetFloat("Data", 9.81f);
PlayerPrefs.SetString("Data", "hoge");
保存したいデータの型に合わせて関数を使い分けます。
第1引数でキーを作成し、第2引数にデータを入れます。

データを読み込む

PlayerPrefs.GetInt("Data");
PlayerPrefs.GetFloat("Data");
PlayerPrefs.GetString("Data");
返り値として、取り出されたデータが入ります。
それぞれの型に合わせた変数に代入してあげてください。

データを削除する

PlayerPrefs.Deletekey("Data");
とすることで、特定のデータを削除することができます。
PlayerPrefs.DeleteAll; というのもあるのですが、
これはUnity自身の設定ファイルもろともメガンテする禁忌の関数なので使わないが吉。

むしろいつ使うんですかね。DeleteAllの適切な使い方があったら教えて下さい…。

データが存在するか確認する

if (Playprefs.HasKey("Data"))
{
    Debug.Log("Dataが存在するようです");
}
存在しないデータを読み込んでもエラーにはなりませんが、処理の都合上調べておかないといけない場合に使います。

任意のタイミングでデータを保存する

PlayerPrefs.Save();
実際にデータを端末に保存するタイミングは OnApplicationQuit イベントの中、つまり「アプリを正常に終了した時」に行われます。
アプリが異常終了してしまった場合はデータが保存されませんので、この関数を呼び出すことで強制的にデータの保存を行うことができます。
ただし処理的にすごく重いようで、ゲームプレイの最中にこの処理をさせると、処理落ちやフリーズの原因になるのだとか。

関数の紹介としては以上です。


なお、PlayerPrefs にデメリットがあるとすれば、
  • RDMのように大量のデータの取り回しができない
  • 重要なデータのデータ流出のリスクがある
ですので、小規模ゲームでのスコア保存や、コンフィグ設定などのちょっとしたデータに使うのがよいとされています。

ゲームのアンテナ