💾

Unityで設定を保存する方法 PlayerPrefsとJSON

2024/11/23に公開

Unityで状態を保存する際に手軽に使えるのが
PlayerPrefsJSONでのファイル形式での保存 です。
この記事では、それぞれの特徴と使い方をまとめています。

  1. PlayerPrefsで状態を保存する

  2. JSONで状態を保存する

  3. まとめ


PlayerPrefsで状態を保存する

PlayerPrefs は、キーと値をペアで保存できるUnity標準の機能です。
簡単な設定値やスコアなど、小規模なデータ保存に向いています。
保存可能なデータ型: Int、Float、String

使い方

// データの保存
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetFloat("Speed", 21.0F);
PlayerPrefs.SetString("PlayerName", "UnityPlayer");
PlayerPrefs.Save();

// データの読み込み
int highScore = PlayerPrefs.GetInt("HighScore", 0); // デフォルト値: 0
int highScore = PlayerPrefs.GetFloat "Speed", 0F); // デフォルト値: 0f
string playerName = PlayerPrefs.GetString("PlayerName", "Unknown"); // デフォルト値: Unknownf

主な特徴

  • メリット:
    • 実装が非常に簡単。
    • クロスプラットフォームで動作。
    • 数値や文字列の保存に最適。
  • デメリット:
    • データ量が多い場合や複雑なデータには不向き。
    • セキュリティが弱く、改ざんされやすい。

PlayerPrefs は、プラットフォームごとに異なる場所にデータを保存します。
OSの設定ファイルやレジストリ、アプリケーションのディレクトリに保存されます。

プラットフォーム 保存場所
Windows レジストリ: HKEY_CURRENT_USER\\Software\\<CompanyName>\\<ProductName>
Mac プロパティリストファイル: ~/Library/Preferences/unity.<CompanyName>.<ProductName>.plist
Android SharedPreferencesファイル: /data/data/<package-name>/shared_prefs/<package-name>.v2.playerprefs.xml
iOS NSUserDefaults: ~/Library/Preferences/<bundle-identifier>.plist

PlayerPrefsが保存されるタイミング

アプリケーションの終了時:

  • アプリが正常に終了したタイミングで、PlayerPrefs は保存される
  • 一部プラットフォームでは、バックグラウンドへの移行でも保存される

保存は、即時実行ではないため、クラッシュした場合や、
アプリ起動中にSetしたPlayerPrefsの値を取得する場合は、明示的に保存が必要です。

明示的に保存する場合

PlayerPrefs.Save()

メソッドを呼び出すことで、即時保存できます。


JSONで状態を保存する

JSON形式 を使うと、複雑なデータ構造やオブジェクト全体を保存できます。ファイルとして保存するため、データの柔軟性や移植性が高いのが特徴です。

主な特徴

  • メリット:
    • 複雑なデータ構造やリストを簡単に扱える。
    • データを人が読みやすい形式で保存。
    • 保存先をカスタマイズ可能。
  • デメリット:
    • セキュリティが弱い(暗号化なしの場合)。
    • ファイル操作のコードが必要。

1. 保存処理

using System.IO;
using UnityEngine;

// 保存するデータのクラスを定義
[System.Serializable]
public class GameData {
    public int level;
    public int score;
}

// データを保存する
GameData data = new GameData { level = 3, score = 1200 };
string json = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + "/gameData.json", json);

2. 保存先

Application.persistentDataPath を使用すると、プラットフォームごとに保存可能なファイルパスを取得できます。

  • Windows: %USERPROFILE%\AppData\LocalLow\<CompanyName>\<ProductName>\
  • Android: /data/data/<package-name>/files/
  • iOS: <Application>/Documents/

3. 読み込み処理


// データを読み込む
if (File.Exists(Application.persistentDataPath + "/gameData.json")) {
    string loadedJson = File.ReadAllText(Application.persistentDataPath + "/gameData.json");
    GameData loadedData = JsonUtility.FromJson<GameData>(loadedJson);
    Debug.Log("Level: " + loadedData.level + ", Score: " + loadedData.score);
}

JSONを使う場合は、データをクラスで管理し、それをテキストファイルとして保存します。読み書きには Unity の JsonUtility を活用するとシンプルに実装できます。


まとめ

用途 PlayerPrefs JSON
小規模なデータ 適している 過剰
複雑なデータ構造 不向き 適している
実装の簡単さ 簡単 少し手間
保存先の柔軟性 制限あり 自由

簡単に始めたい場合は PlayerPrefs、データ構造が複雑になる場合は JSON を選ぶと良いです。

Discussion