Vector2Int や Vector3Int を Json として保存するために JsonUtility を利用したところうまくいかず
試しにログを見てみたところ正しく変換できていなかった
var json = JsonUtility.ToJson(Vector2Int.left);
Debug.Log(json); // {}
JsonUtility.ToJson
private フィールド、static フィールドや NonSerialized 属性を適用されるフィールドのようなサポートされていないフィールドは無視されます。
JsonUtility.ToJson を見てみると上記のように記載されています。 つまり変換できないということは内部値はシリアライズできない値となっていると推測されます
公式リポジトリからVector2Intのコードを見てみると、private なフィールドであることが分かります
public struct Vector2Int : IEquatable<Vector2Int>, IFormattable { private int m_X; private int m_Y; }
これではそのまま Json に変換できないので、一つクラスを経由して変換する必要がでてきます
JsonUtility 用クラス
面倒だが以下のクラスを経由することで json として扱える
var json = JsonUtility.ToJson(new VectorIntJson(Vector2Int.left)); Debug.Log(json); // {"x":-1,"y":0,"z":0} var v2i = VectorIntJson.Convert2Int(json); Debug.Log(v2i); //(-1, 0)
using System; using UnityEngine; [Serializable] public struct VectorIntJson { [SerializeField] private int x; [SerializeField] private int y; [SerializeField] private int z; public VectorIntJson(Vector2Int vector) { x = vector.x; y = vector.y; z = 0; } public VectorIntJson(Vector3Int vector) { x = vector.x; y = vector.y; z = vector.z; } public static Vector2Int Convert2Int(string json) { var vij = JsonUtility.FromJson<VectorIntJson>(json); return new Vector2Int(vij.x, vij.y); } public static Vector3Int Convert3Int(string json) { var vij = JsonUtility.FromJson<VectorIntJson>(json); return new Vector3Int(vij.x, vij.y, vij.z); } }