PlayerPrefsを使ってデータの保存・取り出しを行う【Unity演習】

2020年10月7日

UnityではPlayerPrefsという機能を利用することで、簡単にデータの保存、取り出しを行うことが出来ます。利用する場合は、Key(文字列)とValue(数字とか文字列)を紐付けることで利用可能です。複雑なデータを保存する場合にはそれなりに気を使う必要がありますが、それでもまず保存したい!という時には非常に便利な方法です。

利用方法

まずは使い方からご紹介。知ってる人はここだけ見て利用方法を思い出して作業に戻ってもOKです!

データを保存を行う

大前提として、PlayerPrefsではfloat/int/stringの3つの方を保存・取り出すことが出来ます。まぁ文字列を保存できるので、やろうと思えば何でも保存できるって感じですが、できるだけ型は意識しましょう。

メソッド
floatSetFloat(string _key , float _value)
intSetInt(string _key , int _value)
stringSetString(string _key , string _value)

また、Set系を呼び出した後はSaveメソッドを利用して変更された値の保存を行う必要があります。

例えば、save_intという文字列をKeyにして、123という整数を保存する場合は以下の様になります。

PlayerPrefs.SetInt( "save_int" , 123 );
PlayerPrefs.Save();

初回書き込みなどはSaveなしでも書き込み成功になることがあり、Save呼び出しをうっかり忘れてしまう場合がありますが、しっかりと保存処理を書き込むようにしてください。

データの呼び出しを行う

PlayerPrefsで保存したデータを、ゲーム内で再利用する方法は以下!保存と同様に3つの型がメインになります。

メソッド
floatGetFloat(string _key , float _default)
intGetInt(string _key , int _default)
stringGetString(string _key , string _default)

データを取得する側では、第2引数にデフォルトの値を指定することが出来ます。デフォルトの値は、Keyに対応した値が存在しない場合に返す値のことです。

// デバッグログでは123が表示される
Debug.Log(PlayerPrefs.GetInt( "save_int_1"));
// SetInt後の場合は保存された値456が表示される
PlayerPrefs.SetInt( "save_int_2" , 456 );
Debug.Log(PlayerPrefs.GetInt( "save_int_2" ));

サンプルの例は、事前に保存をされてないという前提にはなっていますが、利用方法としてはこんなかんじで使うことが出来ます。

ちなみにSet/Getで利用するKeyですが、それぞれのSet/Getメソッドごとに独立して扱われます。同じKeyを利用していても、呼び出すメソッドが変わると取り出せる値が変わるので要注意です!

Keyに値が入っているか確認したり、消したり

主な使い方としては値を保存したり取り出したりですが、実際の運用時にはKeyに値が入っているかの確認を行う必要があったり、操作によって値を消したりする必要が出てきます。

次の例ではsave_valueというKeyに値が入っているか確認を行って、入っている場合はそのデータを削除。後にPlayerPrefsに保存したデータを全削除します。

if( PlayerPrefs.HasKey( "save_value" )){
    PlayerPrefs.DeleteKey( "save_value" );
}
PlayerPrefs.DeleteAll();

デフォルトの値を利用することでプログラムを簡略化することは出来ますが、HasKeyで確認を行うことでプログラムが初めて保存したかどうかなどを見分けることが簡単に出来ますので、利用する回数は結構あります。丁寧なプログラムに見えますので、状況に応じてしっかりと使って行きましょう!

演習問題

では、PlayerPrefsを使って簡単な演習問題を行ってみましょう。クラス名「PlayerPrefsPractice」を作成して、以下のコードをコピーして演習を開始してください。演習内で利用するデータの保存・取得はGetInt/SetIntのみを利用してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerPrefsPractice : MonoBehaviour
{
    public int SaveTest;
    void Start()
    {
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Z))
        {
        }
        if (Input.GetKeyDown(KeyCode.X))
        {
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
        }
    }
}

問題1

キーボードZを押し下げた時、Key:save_test に保存された値をデバッグログに表示するプログラムを追加してください。デフォルトの値は-1を指定してください。ただしKeyが存在しない場合"save_testに値は保存されていません"というデバッグログが表示されるようにしてください。

問題2

キーボードXを押し下げた時、Key:save_testに保存されている値より1プラスされた値を保存してください。save_testに保存される値のデフォルト値は-1とします。

確認方法

メンバ変数SaveTestを利用して、Inspector上の値と、問題1で実装を行ったキーボードZを押し下げたときのデバッグログの値が一致していることを利用して、正しく実装が行われたかを確認してください。

問題3

キーボードCを押し下げた時、Key:save_testに保存されている値を削除してください。

確認方法

実装が完了したら以下の手順で実装が出来たかを確認してください。

  1. キーボードXを1回以上押す
  2. キーボードZを押し、save_testに保存されている値が存在することを確認
  3. キーボードCを押し、保存されている値を削除
  4. キーボードZを押し、"save_testに値は保存されていません"というログが表示されることを確認。

解答の確認はこちら