うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Vector2Int, Vector3Int は JsonUtility を利用できない

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);
        }
    }