前書き
Unityでゲームを作るとき、ゲームの設定やデータを永続的に保存する機能は非常に重要です。例えば、画面サイズや音量設定、言語の設定などをプレイヤーが一度設定するとゲームを再起動したときにもその設定が適用されることで設定の手間がなくなります。Unityでは、設定やデータの保存方法としてさまざまな方法が提供されていますが、その中でも簡単かつ手軽に設定を保存できる方法としてPlayerPrefsという方法が用意されています。
今回は、PlayerPrefsの基本的な使い方とメリット・デメリットについて紹介してこうと思います。Unityでゲーム開発をしている方には特に役立つ情報ですので、ぜひ参考にしてみてください。
また、TopDownEngineではPlayerPrefs以外にJsonやBinaryなどでゲームデータを保存する方法が標準的に実装されています。こちらも参考にご確認ください。
そもそもPlayerPrefsとはなんぞや?
PlayerPrefsはUnityの機能の1つで、プレイヤー設定や小規模なデータを簡単に保存するためのシステムです。特に、以下のような小規模で単純な設定値の保存に適しています。
- 画面サイズや解像度
- 音量
- 言語設定
- グラフィック品質
- コントロール設定
このようなゲームの基本設定に適しており、ゲームを閉じても設定が保存されるため、次回プレイ時もその設定が維持されます。
PlayerPrefsの使い方
PlayerPrefsで保存できるデータの種類
PlayerPrefsは、以下の3種類のデータ型に対応しています。
- int(整数): スコアやレベル、解像度などの数値情報に適しています。
- float(小数): 音量のレベルや一部の設定で使われることが多いです。
- string(文字列): 言語設定やユーザー名などに使用されます。
基本的な保存・取得の流れ
PlayerPrefsを使った保存と取得の流れは非常にシンプルで、Unityのスクリプトから次のようにアクセスできます。
データの保存
// 画面の幅と高さを保存
PlayerPrefs.SetInt("ScreenWidth", 1920);
PlayerPrefs.SetInt("ScreenHeight", 1080);
// 音量を保存
PlayerPrefs.SetFloat("Volume", 0.8f);
// 言語設定を保存
PlayerPrefs.SetString("Language", "Japanese");
このように、保存したいデータとその値をキーと値のペアで保存します。例えば、「ScreenWidth」というキーに1920という幅の値を保存しています。
データの取得
// 画面の幅と高さを取得
int width = PlayerPrefs.GetInt("ScreenWidth", 1920); // デフォルト値は1920
int height = PlayerPrefs.GetInt("ScreenHeight", 1080); // デフォルト値は1080
// 音量を取得
float volume = PlayerPrefs.GetFloat("Volume", 0.8f); // デフォルト値は0.8
// 言語設定を取得
string language = PlayerPrefs.GetString("Language", "Japanese"); // デフォルトはJapanese
保存した値を取得する際には、デフォルト値を指定しておくことが推奨されます。デフォルト値を設定しておくと、データが保存されていない場合でもエラーを起こさずにスムーズに動作します。
データの削除
// 個別に削除
PlayerPrefs.DeleteKey("ScreenWidth");
// 全て削除
PlayerPrefs.DeleteAll();
特定のデータを削除する場合はDeleteKeyメソッドを使用します。また、すべてのデータを削除したい場合はDeleteAllメソッドを使います。
PlayerPrefsのメリットとデメリット
メリット
- シンプルなキー・バリュー形式で、設定データを簡単に保存できる。
- 短いコードで実装可能で、手軽に設定を保存できる。
- データの永続性があり、ゲームを閉じても次回プレイ時に保存内容が適用される。
デメリット
- 暗号化されていないため、改ざんされやすい:外部ファイルとして保存されるため、ユーザーが簡単に編集できてしまう。ゲームの進行データやスコアなどの保存には不向きです。
- 大容量データの保存には不向き:PlayerPrefsは小規模なデータ保存に適しており、大量のデータを扱うとパフォーマンスに影響が出ることがあります。
- データの型が限られている:int, float, stringしか保存できないため、複雑なデータ構造には不向きです。
上記のようにPlayerPrefsは改ざんされやすいため、重要データの保存には向かないことがあげられます。進行データやスコアなど、改ざんされたくないデータは、暗号化されたデータを使うか、JSONやデータベースを使用するなど、PlayerPrefs以外の方法を検討しましょう。
実装例:画面のサイズを保存する
簡単に画面のサイズをPlayerPrefsを使って読込、保存するといったことをやるには以下のようなソースコードになると思います。
public class ScreenSetting : MonoBehaviour
{
void Start()
{
// ゲーム開始時に保存された解像度を適用
int width = PlayerPrefs.GetInt("ScreenWidth", 1920);
int height = PlayerPrefs.GetInt("ScreenHeight", 1080);
Screen.SetResolution(width, height, FullScreenMode.Windowed);
}
// 解像度を保存するメソッド
public void SaveResolution(int width, int height)
{
PlayerPrefs.SetInt("ScreenWidth", width);
PlayerPrefs.SetInt("ScreenHeight", height);
PlayerPrefs.Save(); // 即時保存
}
}
まとめ
今回はPlayerPrefsを使用したゲーム内設定の保存方法について紹介しました。
PlayerPrefsは、Unityでのゲーム開発において、手軽に設定を保存できる強力なツールです。画面設定や音量、言語設定といったプレイヤーがゲーム内でカスタマイズした内容を次回プレイ時に適用するために役立ちます。ただし、セキュリティが低いため、改ざんされるリスクがある点や、複雑なデータを扱うには不向きというデメリットがあります。
適材適所でPlayerPrefsを活用し、設定を手軽に保存しながら、データ改ざんのリスクがある部分には別の保存方法を用いると、より安全かつ効率的なゲームデータ管理が可能になります。ぜひこのPlayerPrefsの基本的な使い方を覚えて、ゲーム開発に役立ててみてください。
コメント