Unity入門

【Unity】データセーブ・ロード | PlayerPrefs・JSON・バイナリ(Application.persistentDataPath)

Unityでゲームを作る際、プレイヤーの進行状況や設定を保存する必要があります。

  • ハイスコア・設定・クリア状況を保存したい!
  • JSONやバイナリを使って複雑なデータを保存したい!
  • シーンをまたいでもデータを保存したい!

Unityには「PlayerPrefs」「JSONファイル」「バイナリファイル」など、データを保存する方法がいくつかあります。
この記事では、それぞれの特徴・実装方法・最適な使い方を詳しく解説します

この記事でわかること

  • 簡単なデータ保存方法(PlayerPrefs)
  • JSONファイルを使った複雑なデータ管理
  • バイナリファイルを使った暗号化データ保存
  • セーブ・ロード処理の最適化テクニック
  • おすすめデータ管理アセット

Unityのデータ保存の種類と特徴

簡単なデータはPlayerPrefs、複雑なデータはJSON / バイナリで管理!
※ PlayerPrefsは非推奨なので使用をおすすめはしません。

保存方法特徴使いどころ
PlayerPrefs文字列・数値の保存(簡易)設定データ・スコア保存
JSON(テキスト形式)構造化データを保存(可読性◎)キャラクター情報・ゲーム進行状況
バイナリ(Binary)圧縮して保存(セキュリティ◎)セーブデータ(暗号化)

簡単なデータの保存(PlayerPrefs)

PlayerPrefsを使うと、ゲームの設定やハイスコアを手軽に保存・取得できます。
また、以下のサイトのようにシーンの切り替え時の変数の割り当てに便利です。

PlayerPrefsの基本

簡単なデータ保存には最適!

// データの保存
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetFloat("Volume", 0.5f);
PlayerPrefs.SetString("PlayerName", "Hero");
PlayerPrefs.Save(); // 明示的に保存

//データの読み込み
int highScore = PlayerPrefs.GetInt("HighScore", 0);
float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
string playerName = PlayerPrefs.GetString("PlayerName", "Unknown");

JSONを使ったデータの保存

JSONを使って、キャラクター情報・ゲーム進行状況などのデータを構造化して保存できます。

JSONを使ったデータ保存

JSONは「データが保存される、編集しやすい」ので開発向けに最適!

保存するデータの構造を作成する

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int level;
    public int experience;
}


・ JSONを取得する

using UnityEngine;
using System.IO;

public class SaveSystem : MonoBehaviour
{
    public void SaveData()
    {
        PlayerData data = new PlayerData();
        data.playerName = "Hero";
        data.level = 5;
        data.experience = 1200;

        string json = JsonUtility.ToJson(data);
        File.WriteAllText(Application.persistentDataPath + "/saveData.json", json);
    }
}


・ JSONからロード

public void LoadData()
{
    string path = Application.persistentDataPath + "/saveData.json";
    if (File.Exists(path))
    {
        string json = File.ReadAllText(path);
        PlayerData data = JsonUtility.FromJson<PlayerData>(json);
        Debug.Log("Player Name: " + data.playerName);
    }
}

バイナリを使ったデータの保存(暗号化)

JSONは編集しやすい裏側、データ改ざんのリスクがあるためバイナリ(Binary)形式で保存するとセキュリティが向上します。

バイナリを使ったセーブデータの作成

バイナリなら、改ざんされにくく、データサイズも小さくなる!
※ バイナリは理解しにくいものなので使用するかは検討する必要があります。また、改ざんされないデータはほとんどないと思っているので割り切ることも大切かと思っています。

バイナリ保存(BinaryFormatterを使う)

using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class SaveBinary : MonoBehaviour
{
    public void SaveGame()
    {
        PlayerData data = new PlayerData();
        data.playerName = "Hero";
        data.level = 5;
        data.experience = 1200;

        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "/saveData.dat";
        FileStream stream = new FileStream(path, FileMode.Create);

        formatter.Serialize(stream, data);
        stream.Close();
    }
}


・バイナリデータのロード

public void LoadGame()
{
    string path = Application.persistentDataPath + "/saveData.dat";
    if (File.Exists(path))
    {
        BinaryFormatter formatter = new BinaryFormatter();
        FileStream stream = new FileStream(path, FileMode.Open);
        
        PlayerData data = formatter.Deserialize(stream) as PlayerData;
        stream.Close();

        Debug.Log("Loaded Player: " + data.playerName);
    }
}

セーブデータ管理の最適化

Application.persistentDataPathの活用

Application.persistentDataPathを使うと、OSごとに決められた保存場所にデータを保管可能!

persistentDataPathを使えば、どのOSでも問題なく保存データを管理できる!

OS保存先
WindowsC:\Users\ユーザー名\AppData\LocalLow\会社名\ゲーム名
Macbook~/Library/Application Support/会社名/ゲーム名
iOS/Android内部ストレージ/Android/data/パッケージ名/files

データをクラウドと同期する

Google PlayやiCloudを使って、クラウドに保存データを保存すると、マルチデバイス対応が可能です!

  • Google Play ゲームサービス(Android)
  • iCloud(iOS)
  • SQL

おすすめデータ管理アセット

これまでの保存方法ではGameObjectやTransformといった型の保存ができないものであるが、このアセットを使用することで保存が可能になる。
例えば、データを保存して再度ゲームを開くときに各オブジェクトのTransformを保存しておくことで保存時の状態がすぐに復元可能になる。

私が個人開発をやっていて、初めて購入した有料アセットがこれであり、私自身データ管理はゲームの唯一の肝と考えていたため、ミスをなくすためにもこのアセットを使用しています。

まとめ

設定やスコアの保存にはPlayerPrefs便利!
JSONが使えば、ゲームデータを構造化して保存できる!
バイナリを使えば、セーブデータを圧縮&改ざん防止!
Application.persistentDataPathを活用して、OSごとの保存場所を統一!