ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - PlayerPrefs:変数を保存する -

初めに

 ゲームデータのセーブ、ロードに使う PlayerPrefs について、まとめます。

PlayerPrefs とは

docs.unity3d.com

 ゲームデータのセーブ、ロードを行うための機能です。

対応している変数の型

 下の3つの型に対応しています。

  • int
  • float
  • string

データをセーブ、ロード、削除する

セーブ

int 型の場合

public static void SetInt (string key, int value);

 float 型、string 型の場合は、それぞれ GetFloat、GetString になります。key に value を保存します。

ロード

int 型の場合

public static int GetInt (string key);

public static int GetInt (string key, int defaultValue);

 float 型、string 型の場合は、それぞれ GetFloat、GetString になります。key に対応する値を取得します。key が存在しない場合は、defaultValue を返します。

削除

public static void DeleteKey (string key);

public static void DeleteAll ();

 DeleteKey は設定情報から key に対応する値を削除します。DeleteAll は設定情報からすべての key と値を削除します。

使ってみた

 下記のスクリプトを GameObject につけて、実行してみます。

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

public class DataScript : MonoBehaviour
{
    private int Count = 0;
    private float Num = 0.0f;
    private string Name = null;

    private int _count;
    private float _num;
    private string _name;

    // Start is called before the first frame update
    void Start()
    {
      //セーブ
      PlayerPrefs.SetInt("Count", 12);
      PlayerPrefs.SetFloat("Num", 23.4f);
      PlayerPrefs.SetString("Name", "aaa");

      //ロード
      _count = PlayerPrefs.GetInt("Count", 0);
      _num = PlayerPrefs.GetFloat("Num", 0.0f);
      _name = PlayerPrefs.GetString("Name", "No Name");

      //コンソールに表示
      Debug.Log("Count:" + _count);
      Debug.Log("Num:" + _num);
      Debug.Log("Name:" + _name);

      //全データの削除
      PlayerPrefs.DeleteAll();

      //ロード
      _count = PlayerPrefs.GetInt("Count", 0);
      _num = PlayerPrefs.GetFloat("Num", 0.0f);
      _name = PlayerPrefs.GetString("Name", "No Name");

      //コンソールに表示
      Debug.Log("Count:" + _count);
      Debug.Log("Num:" + _num);
      Debug.Log("Name:" + _name);
    }
}

実行結果

保存先

 環境によって、保存先は変わります。

端末 保存先
Mac OS /Users/[ユーザー名]/Library/Preferences/unity.[company name].[product name].plist
Windows レジストリの HKCU\Software\[company name]\[product name]
Linux ~/.config unity3d[CompanyName]/[ProductName]
Windows Store Apps %userprofile%\AppData\Local\Packages\[ProductPackageId]>\LocalState\playerprefs.dat
Android SharedPreferences に保存される。/data/data/pkg-name/shared_prefs/pkg-name.xml.
iOS /Library/Preferences/[bundle identifier].plist.
WebGL ブラウザーの IndexedDB API を使って保存される。

 CompanyName、ProductName は File → Build Settings... → Player Settings... から設定できます。

 CompanyName はデフォルトでは DefaultCompany となっています。

注意点

 PlayerPrefs は導入するのが簡単ですが、あまり推奨されていません。その理由として、以下のような理由が挙げられます。

  • 保存できる変数の型が限られる
  • 大量のデータの保存に向かない
  • 複数のデータの一括保存ができない
  • ユーザーから保存先に簡単にアクセスできる→改竄が容易

データの保存方法の代替案

  • 外部のアセットを使用する

 QuickSave は無料で使えるアセットになります。
https://assetstore.unity.com/packages/tools/integration/quick-save-107676?aid=1101libXw&utm_campaign=unity_affiliate&utm_medium=affiliate&utm_source=partnerize-linkmakerassetstore.unity.comhttps://assetstore.unity.com/packages/tools/integration/quick-save-107676?aid=1101libXw&utm_campaign=unity_affiliate&utm_medium=affiliate&utm_source=partnerize-linkmaker

 EasySave は有料ですが、非常に使い勝手がよいようです。
https://assetstore.unity.com/packages/tools/utilities/easy-save-the-complete-save-data-serializer-system-768?aid=1101libXw&utm_campaign=unity_affiliate&utm_medium=affiliate&utm_source=partnerize-linkmakerassetstore.unity.comhttps://assetstore.unity.com/packages/tools/utilities/easy-save-the-complete-save-data-serializer-system-768?aid=1101libXw&utm_campaign=unity_affiliate&utm_medium=affiliate&utm_source=partnerize-linkmaker

  • 外部ファイル(CSVJSONなど)に保存する

 CSV ファイルは Excel などで扱うファイルです。JSON ファイルは JavaScript Object Notation の略で JavaScript のデータ定義文をベースとした、簡易的なデータ定義言語です。
 データを何かのファイルに書き出したり、読み込んだりすることで、セーブ、ロードをします。

最後に

 PlayerPrefs は問題はありますが、簡単な保存の方法の一つではあるので知っておいて損はないでしょう。