ちゃんとした 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; } }
ということで、メモでした。