💾
【Unity】設定を保存する方法 PlayerPrefsとJSON
Unityで状態を保存する際に手軽に使えるのが
PlayerPrefs と JSONでのファイル形式での保存 です。
この記事では、それぞれの特徴と使い方をまとめています。
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