主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2022/06/19
ちゃんとした 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;
}
}
ということで、メモでした。