【Unity】ゲームの設定データをJSON形式で保存する

スポンサーリンク

Unityでゲームを作っていると、当然の様にデータを保存したい事が出てきますよね。
当然、Unity初心者の自分もやり方がわからなかったので調べました。
今回はその結果としてできたコードをペタッと紹介。

何かのサービスを使っても良いけど、そんなに大規模・複雑なデータじゃないなら、
自前でファイルを読み書きしちゃう方法になってます。
また、保存するデータ形式は、項目の拡張がしやすくて扱いやすいJSON形式としました。

スポンサーリンク

実装

using System;
using System.IO;
using UnityEngine;

public static class FileManager
{
    private static string GetFullPath(string filename)
    {
        return Path.Combine(Application.persistentDataPath, fileName);
    }

    public static bool WriteToFile(string filename, string contents)
    {
        var fullPath = GetFullPath(filename);
        try
        {
            File.WriteAllText(fullPath, contents);
            Debug.LogError($"Success to write to {fullPath}");
            return true;
        }
        catch (Exception e)
        {
            Debug.LogError($"Failed to write to {fullPath} with exception {e}");
            return false;
        }
    }

    public static bool LoadFromFile(string filename, out string result)
    {
        var fullPath = GetFullPath(filename);
        try
        {
            result = File.ReadAllText(fullPath);
            Debug.LogError($"Success to read from {fullPath}");
            return true;
        }
        catch (Exception e)
        {
            Debug.LogError($"Failed to read from {fullPath} with exception {e}");
            result = "";
            return false;
        }
    }
}

[System.Serializable]
public class SettingsData
{
    public string userName;

    public string ToJson()
    {
        return JsonUtility.ToJson(this);
    }

    public void LoadFromJson(string json)
    {
        JsonUtility.FromJsonOverwrite(json, this);
    }
}

public static class SettingsDataManager
{
    private static string FILENAME = "settings.dat";
    private static SettingsData settingsData = null;

    public static void SetUserName(string userName)
    {
        if (settingsData == null) LoadData();

        settingsData.userName = userName;

        FileManager.WriteToFile(FILENAME, settingsData.ToJson());
    }

    public static string GetUserName()
    {
        if (settingsData == null) LoadData()

        return settingsData.userName;
    }

    private static bool LoadData()
    {
        settingsData = new SettingsData();

        if (FileManager.LoadFromFile(FILENAME, out var json))
        {
            settingsData.LoadFromJson(json);
            return true;
        }
        else return false;
    }
}

使い方はこんな感じ

// ファイルにユーザー名を保存
SettingsDataManager.SetUserName("ユーザー名");
// ファイルからユーザー名を取得
var username = SettingsDataManager.GetUserName();

保存ファイル

上の実装で動かすと、下記内容のファイルが出来上がります。

ファイルの保存場所

ファイルの読み書きした時のログにファイルパスが表示されますので、それをご確認下さい。
MacのUnity Editorで実行した場合は
~/Library/Application Support/{user_name}/{project_name}/SaveSettings.dat
に作成されました。

保存されたJSONファイル

{"userName":"ユーザー名"}

さいごに

実装の詳細を説明しても良いけど、特に難しいことはしていないので、今回は省略しちゃいました。
SettingsDataManagerクラスをstaticにしてますが、シングルトンでインスタンス化して、コンストラクタでファイル読み出しをする方が最終的にはコードが少なくなると思います。
その辺は、都度カスタマイズして頂ければと思います。

参考

https://github.com/UnityTechnologies/UniteNow20-Persistent-Data

スポンサーリンク