PlayerPrefsの基本


概要

PlayerPrefsはハイスコアなどのゲームが終了しても
保持しておきたい数値を保存することができる機能です。
この機能で最低限覚えて欲しいことは以下の二つです。
  • データを保存する
  • 保存したデータを取得する

PlayerPrefsの仕組み

PlayerPrefsがどのような仕組みでデータを保存しているかを説明します。
これを理解するとこの後に説明する保存方法、取得方法が簡単に使えると思います。
PlayerPrefsはアプリではなく外部にデータを保存する機能です。
外部というのはWindowsやMacならPCのどこかで、スマホアプリならスマホを指します。

unity_0249

次にPlayerPrefsで保存されているデータの構成について説明します。
保存されているデータは以下の三つの情報から構成されています。
  • 保存するデータの型です。
    「float」「int」「string」の型が使用できます。
  • 登録キー
  • 保存するデータの名前です。
    PlayerPrefsに保存されたデータも変数名と同じようにアクセスする際に
    何かしらの目印となる情報があった方が早く見つけることができます。
  • 保存データ(値)
  • 文字通り保存するデータ(値)です。
unity_0250
上の表のイメージを持っておけば分かりやすくなると思います。

保存方法

データを保存するにはPlayerPrefsに定義されている
三つのメソッドを使用して行います。
  • SetFloat
  • SetInt
  • SetString
メソッドの名前で内容が想像できると思いますが、
保存したいデータの型でメソッドを使い分けます。
分かりやすくするために以下の保存状態をイメージしてください。

unity_0251
float型のデータを保存する場合は「SetFloat」を使用します。

unity_0246
// 登録キー:LastHp 保存データ:12.34f
PlayerPrefs.SetFloat("LastHp", 12.34f);

上のコードを実行することでLastHpを登録キーとしたデータが保存されました。

unity_0252
次にint型のデータを保存する「SetInt」の説明をします。

unity_0247
// 登録キー:LoginCount 保存データ:30
PlayerPrefs.SetInt("LoginCount", 30);

これで、LoginCountを登録キーとしたデータが保存されます。

unity_0253
最後はstring型のデータを保存する「SetString」の説明です。

unity_0248
// 登録キー:UserName 保存データ:yttm
PlayerPrefs.SetInt("UserName", "yttm");

UserNameを登録キーとしたデータの保存も完了です。

unity_0254

最終保存

Setメソッドを使用したらデータが保存されますが、
この状態はまだPCやスマホに保存されていません。
PCやスマホに保存して次回からもPlayerPrefsで使用できるようにするためには
「Saveメソッド」を使用する必要があります。

unity_0258
// 外部に保存する
PlayerPrefs.Save();

Saveを使用しなかった場合、保存しないと記述しておりますが、
実際にはアプリケーションを終了する際に自動的にSaveが呼び出されます。
ただし、呼び出しは正常に終了した場合に限りますので、
確実に保存させるならば、スクリプト上で実行して下さい。

取得方法

PlayrePrefsで保存されている値を取得するには以下のメソッドを使用します。
  • GetFloat
  • GetInt
  • GetString
引数で登録キーを指定することでデータを取得することができます。
また、このメソッドの特徴として登録キーが存在しない場合の結果は
メソッド側でコントロールできるようになっています。
float型のデータを取得するには「GetFloatメソッド」を使用します。

unity_0255
// 登録キー:LastHp デフォルト値:0.0f
PlayerPrefs.GetInt("LastHp", 0.0f);

次にint型のデータを取得する場合「GetIntメソッド」を使用します。

unity_0256
// 登録キー:LoginCount デフォルト値:1
PlayerPrefs.GetInt("LoginCount", 1);


最後にstring型のデータを取得する場合「GetStringメソッド」を使います。

unity_0257
// 登録キー:UserName デフォルト値:""
PlayerPrefs.GetInt("UserName", "");

以下のコードは取得データの有無による結果が分かるサンプルです。
最初にコメントを外さない状態で実行して結果を確認してから
コメントを外した状態の結果を確認してください。

// PlayerPrefs.SetInt("Score", 10000);

int score = PlayerPrefs.GetInt("Score", 0);
Debug.Log(score);

その他の機能

PlayerPrefsの保存と取得以外の機能をいくつか紹介します。
  • 登録キーチェック
  • キー削除

登録キーチェック

登録キーが存在するか否かを事前にチェックしたい場合は
「HasKeyメソッド」を使用します。

unity_0259
if (PlayrePrefs.HasKey("LoginCount") == true)
{
	Debug.Log("登録済み");
}
else
{
	Debug.Log("未登録");
}

削除方法

一度保存したデータはアプリ側で削除を行わない限り消えることはありません。
アプリ側での削除方法は以下の通りです。
  • 全キー削除
  • キー指定削除
どちらの削除方法で削除しても自動でSaveが実行されます。
だから、削除を行うときは慎重に行ってください。
アプリリリース後に行うときは特に慎重に行うようにしてください。

全キー削除

全キー削除は「DeleteAllメソッド」を使用します。

unity_0260
PlayerPrefs.DeleteAll();

キー指定削除

キー指定削除は「DeleteKeyメソッド」を使用します。

unity_0261
// LoginCountのデータを削除
PlayerPrefs.DeleteKey("LoginCount");

よくある問題

PlayerPrefsを使用した際によく問題になることがあります。
それはint以上の値を保存できないことです。
この項目では「string型として保存する解決方法」の説明をします。
数値を文字列に変換した場合、100桁の値は100文字にしかなりません。
これを利用してlong型が必要な値を保存したいときは
その値を文字列に変えてSetStringで保存します。

long score = 1000;

// 数値 => 文字列変換
string value_str = score.ToString();

PlayerPrefs.SetString("Score", value_str);

文字列の変換は「変数名.ToString」で行います。
このメソッドは全ての型に存在していて、大変便利なので覚えておいてください。
そして、保存したデータを取得したい時はstring型からlong型に
戻してしまえばint以上の値を保存できない問題は解決です。

string str = PlayerPrefs.GetString("score", "0");

// 文字 => 数値変換
long score = long.Parse(str);

文字列を数値型に戻すときは「型.Parse」で変換します。
文字列から数値の時とは異なり「型」のメソッドということに注意してください。
また、Parseは引数に渡した文字列が数値変換できないとエラーになるので、
そちらも注意してください。
変換可能かどうかを調べる「TryParse」もありますので、
興味がある、安全に使いたいという方はそちらを使用してください。