なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Unity の Vector3 を Newtonsoft.Json でシリアライズ・デシリアライズしたい

ちゃんとした Unity アプリケーションを作っていると、 Json でアプリケーションデータを永続化したくなることがあると思います。
ただ、 PlayerPrefs はゴミらしいのと、 Unity 標準の JsonUtility だと物足りない......!となると、やはり Json.NET が選択肢に出てくるはず。
ということで、今回は Json.NET で Vector3 を SerDe する方法についてのメモです。

まずはデフォルトのまま使うと、 Vector3 をシリアライズしようとすると以下のようにエラーが出ます。

JsonSerializationException: Self referencing loop detected for property 'normalized' with type 'UnityEngine.Vector3'. Path 'normalized'.

これを回避してくれるのが、 Newtonsoft.Json-for-Unity.COnverters です。
これで提供されている Converter を指定することで、 Vector3 等もシリアライズ出来るようになります。

使い方はこんな感じ、まぁ Json.NET 使っていれば簡単ですね。

private string _path;
private JsonSerializerSettings _settings;

public void Awake()
{
    _path = Path.Combine(Application.persistentDataPath, "settings.json");
    _settings = new JsonSerializerSettings
    {
        Converters = new JsonConverter[]
        {
            new StringEnumConverter(),
            new Vector3Converter()
        }
    };
}

public void Save()
{
    var json = JsonConvert.SerializeObject(Settings, Formatting.Indented, _settings);
    using var sw = new StreamWriter(_path);
    sw.WriteLine(json);
}

public void Load()
{
    try
    {
        using var sr = new StreamReader(_path);
        var json = sr.ReadToEnd();
        Settings = JsonConvert.DeserializeObject<WidgetSettings>(json, _settings) ?? WidgetSettings.Default;
    }
    catch (Exception e)
    {
        Debug.LogError(e.Message);
        Settings = WidgetSettings.Default;
    }
}

ということで、メモでした。