Unity PlayerPrefsの使い方に関する簡単なアイデア
UnityのPlayerPrefsを1.1倍ぐらい便利に使えるアイデアです
データベースを持つまでもない単体のデータを取り扱う時、UnityならPlayerPrefsというクラスを使うのが定番なのかなと思います。
ただ、どこのページを見てもPlayerPrefsの基本的な使い方しか説明されていないため、それをそのまま使っている方は結構煩わしい思いをしているのではないかな?と感じました。
そこで、今回はこのUnityのPlayerPrefsをほんの少しだけ便利にする使い方を紹介したいと思います。
特に非プログラマーの方やアマチュアプログラマーの方は、ぜひこの記事を見て自分の技術の幅を広げていって欲しいなあと思います!(という上から目線ですみません、笑)
UserDataクラスでPlayerPrefsをラップする
まあ百聞は一見にしかずと言いますので、サンプルソースを提示します。
using UnityEngine; /// <summary> /// ユーザーデータ保存処理クラス /// </summary> public static class UserData { // 保存キー private static readonly string KEY_DATABASE_VERSION = "DATABASE_VERSION"; // 初期値 private static readonly int DEF_DATABASE_VERSION = 0; /// <summary> /// データを保存する /// </summary> public static void Save() { PlayerPrefs.Save(); } /// <summary> /// データベースのバージョン /// </summary> public static int DatabaseVersion { get { return PlayerPrefs.GetInt(KEY_DATABASE_VERSION, DEF_DATABASE_VERSION); } set { PlayerPrefs.SetInt(KEY_DATABASE_VERSION, value); } } }
UserDataというラッパークラスを用意してその中でPlayerPrefsの処理を行っています。
ただそれだけです(笑)
これの何が便利なの???
処理を呼び出す時の面倒臭さが激減します!
まず第一に、値の取得・保存の際に一々キー値やデフォルト値を指定していたのでは面倒臭いですよね?
上のソースのように「KEY_DATABASE_VERSION」などときちんと定義してあったとしても面倒臭いですし、仮に「”DATABASE_VERSION”」のように直接打ち込んでいる(ハードコーディング)なら面倒臭い上にメンテナンス性は最悪です。
なので、UserDataクラスを一枚被せることでPlayerPrefsの処理を簡単に呼び出せるようにして、さらにソースコードのメンテナンス性も高めているんです。
プログラムのバグが激減します!
そして第二に、PlayerPrefsのようなクリティカルなバグにつながりやすいクラスはあちこちで呼び出されるべきではないと私は考えます。
例えば「ゲームのプレイ中にユーザーデータが消えてしまった」というバグはユーザーからすればとても理不尽で、それはすぐにクレームになって我々開発者の身に降りかかって来ますよね?
こういったデリケートな処理はあちこちで呼び出されるべきではなく、なるべく呼び出し元を一箇所にまとめるべきなんです。
そうすれば開発者の意図しないタイミングでそういった処理が呼び出されることも減り、万が一そういったバグが発生してもデバッグや修正がしやすくなります。
さらに言えば、上のUserDataクラスではPlayerPrefsクラスのデータ削除用メソッド(DeleteAllやDeleteKey)を実装していません。
つまり、これらを実装しない限りは、UserDataクラスを通してデータを取り扱う場合にデータは削除されないということを保証できるんです。
こういったソースコードを書かなければならない場合とは?
ちなみに今回紹介したような書き方は、数百行程度の小さなプログラムを組む時には逆に面倒臭く感じるかもしれません。
ではどういう時にこういったソースコードを書くべきなのか、答えは2つです。
- 1万行以上のプログラムになる時
- チームでプログラミングをする時
この2つの共通点は、どちらも絶対にバグが出るという点です。
要は「絶対にバグが出る」ような状況でプログラミングをする時は、こういった安全かつメンテナンス性の高いソースコードを書く必要があるということですね。
ぜひぜひ参考にしていただければと思います!
※PlayerPrefsの各メソッドとその使い方については公式のリファレンスを参照してください。(>> Unity スクリプトリファレンス PlayerPrefs)
最近のコメント