【Unity】セーブ/ロード機能の実装方法。PlayerPrefs.SetStringはオブジェクト名と関連付けられて便利。

どうも、だらはです。
今回はセーブ/ロード機能の実装方法について紹介します。
アプリの再起動したときにデータを引き継ぐために必須の機能です。
具体的にはPlayerPrefsクラスを使用します。

スポンサーリンク

セーブのための関数

PlayerPrefsクラスのうち、セーブに使う関数をまとめてみました。

  • PlayerPrefs.SetFloat(string key, float value):float型のデータをkeyに格納する。
  • PlayerPrefs.SetInt(string key, int value):Int型のデータをkeyに格納する。
  • PlayerPrefs.SetString(string key, string value):String型のデータをkeyに格納する。
  • PlayerPrefs.Save():変更された値を記憶装置へと保存する。

使い方を簡単に言うと、①PlayerPrefs.SetFloatでデータを一時保存し、②PlayerPrefs.Saveでセーブする。
このようにPlayerPrefs.SetXXXPlayerPrefs.Saveはセットで使います。

PlayerPrefs.SetXXX()の引数には、key(データを格納する場所)value(格納するデータ)を指定します。
PlayerPrefs.Save()には引数は存在しません。
記事の最後にコピペで動作するスクリプト例を記載します。

ロードのための関数

PlayerPrefsクラスのうち、ロードに使う関数をまとめてみました。

  • PlayerPrefs.GetFloat(string key):float型のデータをkeyから取り出す。
  • PlayerPrefs.GetInt(string key):int型のデータをkeyから取り出す。
  • PlayerPrefs.GetString(string key):string型のデータをkeyから取り出す。

使い方を簡単に言うと、格納した関数型に合わせて上記関数を使用します。
PlayerPrefs.SetFloatで格納したらPlayerPrefs.GetFloatで値を取り出す。それだけです。

PlayerPrefs.GetXXX()の引数には、データを格納する場所であるkeyを指定します。
また、keyが存在しない場合にデフォルトの値を返すように、PlayerPrefs.SetFloat(string key, float defaultvalue)というように引数を指定することが可能です。

その他の関数

セーブ/ロードに関するその他の関数についてまとめてみました。

  • PlayerPrefs.DeleteAll():全てのkeyと値を削除する。
  • PlayerPrefs.DeleteKey(string key):指定したkeyを削除する。
  • PlayerPrefs.HasKey(string key):指定したkeyが存在する場合はtrueを返す。

keyの削除と、keyが存在するかを調べる関数です。
プログラミングにおいて必須の関数なので覚えておくと良いと思います。

FAQ(覚えておくと良いこと)

Unityでセーブ/ロード機能を検証するときに出てくる疑問の答えに関してまとめてみました。

  • どうやって正しくセーブがされているか確認するの?
    →ゲームを再起動(UnityでPlayを解除後、再度Playを実行)すれば良いです。
    PlayerPrefs.Save()は、Playの解除をまたいでデータを引き継ぐことができます。
  • どうやってセーブされたデータを削除するの?
    [Edit -> Clear All PlayerPrefs]からデータを削除することが可能です。

コピペで動くスクリプト例

では、実際に動作するスクリプトを記載します。
スクリプトの内容は、オブジェクトがクリックされた回数をセーブし、デバッグログに表示するというものです。
アプリを再起動しても、クリックされた回数が保持されていることを確認したいと思います。

なお、オブジェクトのクリック検出は、EventTriggerを使って実装しています。
EventTriggerについては以下の記事にまとめてありますので参照頂けたらと思います。

◆スクリプト(SampleSave.cs)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SampleSave : MonoBehaviour
{
    int cnt;
    string keyClick;

    void Start()
    {
        cnt = PlayerPrefs.GetInt(keyClick);      
    }

    public void cntClick()
    {
        cnt++;
        PlayerPrefs.SetInt(keyClick, cnt);
        Debug.Log(cnt);
    }
}

◆実行結果

正しく、セーブ/ロードの検証ができました。
もし、クリック回数をリセットしたい場合は、[Edit -> Clear All PlayerPrefs]からクリック回数を削除することが可能です。

最後に

いかがでしたでしょうか。
保存領域的にはintで管理すると良いと思うんですが、私はゲームオブジェクト名でkeyを保存しています。(gameObject.transform.nameで取得可能)
管理用ナンバーと関連付けてkeyを管理する手間が省けるためです。

さて、見て頂いた通り、セーブ/ロード機能は極めてシンプルです。
簡単すぎて関数名を忘れてしまいそうだという方は、是非、何度でもこの記事を訪れて読み込んで頂けると嬉しいです:)

以上、だらはでした。

スポンサーリンク

基礎

Posted by daraha_gm