PhysApp

趣味と開発関連のメモ置き場です

PlayerPrefsでスコアなどを保存する【Unity】

Unityで作っているゲームで、ゲームスコアなどローカルデータを保存したい時のメモ。

これを使う事で次回起動時もデータを保持してプレイできるようになる。

PlayerPrefs

PlayerPrefsは、保存するデータの鍵(Key)とデータ(Value)のセットで保存したり、読み込んだりするもの。

下に各シチュエーションでの書き方を書いておきます。

保存

保存はこんな感じの書き方。セットしたらセーブをする。

アプリ終了時に保存はしてくれるけど、クラッシュしたりしたら保存されてないままになるのでセットしたらセーブするのが安全そう。

// int
PlayerPrefs.SetInt( "IntParamData", 2 );
// float
PlayerPrefs.SetFloat( "FloatParamData", 7.5f );
// string
PlayerPrefs.SetString( "StringParamData", "hoge" );

// セットしたらセーブ
PlayerPrefs.Save( );

読み込み

保存しておいたデータを読み込む時はこんな書き方。Keyとデフォルトの値(値が保存されていない時に返す値)を入れる。

// int
PlayerPrefs.GetInt( "IntParamData", 0 );
// float
PlayerPrefs.GetFloat( "FloatParamData", 0.0f );
// string
PlayerPrefs.GetString( "StringParamData", "" );

消去

消去は全消去Keyを指定して消去の2種類。使用用途に合わせて使ってください。

ここでは例として、上のintのPrefを消去してます。

// 全消去
PlayerPrefs.DeleteAll( );
// 指定したKeyのPrefを消去
PlayerPrefs.DeleteKey( "IntParamData" );

注意点

保存量が多いと重くなる

PlayerPrefsは、一つのファイルに書き込まれるので、大量のデータをPlayerPrefsで保存すると重くなります。

自分の場合だと、設定画面とかで設定した設定値を保存しておくとかの使用用途になってます。

改ざんできる

色々なサイトで同じ事を言っていることが多いと思いますが、データがユーザーの手元にあるので改ざんできてしまいます。

できるならセーブデータとかはサーバーで持つとか、暗号化して書き出しておくみたいな方がいいと思います…。

自分は端末だけで完結するアプリの場合は、暗号化してSetStringしてます。

もっといい手段あるのかもだけど素のままで保存しておくよりましな気がする。

Keyについて

Keyの重複などでバグが起きないようにする為、またプログラム内に書き込まずに一か所でKeyを管理する為に一か所にまとめておくと扱いがとても楽だった。

下のような感じにKeyを定数化して一か所にまとめておいて使うのがおすすめ。

/// <summary>
/// PlayerPrefsのKeyを定数で持つクラスの例
/// </summary>
public static class PlayerPrefsConst {
    public const string INT_PARAM = "int_parameter";
    public const string FLOAT_PARAM = "float_parameter";
    public const string STRING_PARAM = "string_parameter";
}
using UnityEngine;

// 使い方、書き方の例
public class HogeClass : MonoBehaviour {
    private void Save( ) {
        PlayerPrefs.SetInt( PlayerPrefsConst.INT_PARAM, 2 );
        PlayerPrefs.SetFloat( PlayerPrefsConst.FLOAT_PARAM, 10.5f );
        PlayerPrefs.SetString( PlayerPrefsConst.STRING_PARAM, "hoge" );
    }
    private void Load( ) {
        PlayerPrefs.GetInt( PlayerPrefsConst.INT_PARAM, 0 );
        PlayerPrefs.GetFloat( PlayerPrefsConst.FLOAT_PARAM, 0.0f );
        PlayerPrefs.GetString( PlayerPrefsConst.STRING_PARAM, "" );
    }
}