Unityでセーブ機能を実装するってなった時によく出てくる「PlayerPrefs」の話です。
※Windows以外を使ってる場合はあまり関係ないかもしれないです。
セーブ機能実装方法のパターン
Unityでセーブ機能を実装するとしたら、主に次の3パターンになると思います。
①PlayerPrefsを使う
②アセットを使用する
③JSONなどで外部ファイルに読み書き
そこそこUnityを使ってきてる人はおそらくセーブ機能は自作かアセット使って実装してる場合がほとんどだと思います。
私が以前自作した時は以下の記事のようなやり方でやってました。(別途暗号化が必要)
PlayerPrefsがダメな理由
PlayerPrefsは一応Unity標準の機能です。
「保存できる型が決められている」とか「処理が遅い」とかいろいろありますが、それだけならまあダメってほどでもないんじゃない?って感じはしますよね。
私も最初は「Unity標準だし、ハイスコアを保存する程度だったら別に使ってもいいんじゃないの?」とか思ってました…が、これこそ初心者がハマりがちな罠だったようです。
PlayerPrefsで一番問題なのは、(Windowsの場合)保存先がレジストリということです。
レジストリはユーザーが中を確認できるので、ここにそのままデータを保存したら改ざんし放題です。
しかもレジストリにはシステム情報など重要なデータが格納されているので、万が一レジストリが破損したら最悪の場合OSが起動しなくなります。
PlayerPrefsを使うだけで破損することはないと思いますが、大して重要でもないデータをわざわざレジストリに保存する理由はないです。
使った場合のレジストリの変化を見てみる
1.保存
本当にレジストリに保存されているのか一応確認してみました。
PlayerPrefsで扱えるのは「int」「string」「float」の3つです。
それぞれ値を保存してみます。
PlayerPrefs.SetInt("Score", 1000);
PlayerPrefs.SetFloat("Power", 5.5f);
PlayerPrefs.SetString("Name", "あいうえお");
// Save()で書き込む
PlayerPrefs.Save();
// ロードする場合はPlayerPrefs.GetString("キー名", "デフォルト値");みたいな感じ
コードを実行後、レジストリを開いて確認してみます。
キーにしたName、Power、Scoreが書き込まれていますね。

「regedit」でプログラム検索するとレジストリエディタを開くことができます。
レジストリ内の保存場所は、ProjectSettingsのCompanyNameとProductNameで変更できます。
2.削除
削除には全てのデータを削除する「DeleteAll」とキーごとに削除する「DeleteKey」の2つがあります。
今回はDeleteAllで全て消します。
// すべて削除する場合
PlayerPrefs.DeleteAll();
// 個別に削除する場合
// PlayerPrefs.DeleteKey("キー名");
レジストリを確認すると先ほど書き込んだデータが消えていました。

まとめ
やっぱりPlayerPrefsは使わない方がいいと思います。
レジストリにどうでもいいデータ追加していくのちょっと嫌だし…。
外部ファイルで読み書きする方法なら簡単に実装できるので、セーブ機能は自作(もしくはアセット使うか)した方がいいですね。
コメント