PlayerPrefsでカスタムクラスの配列を保存する

Unityで複数のGameObjectの位置、回転、スケールをまとめて保存するための方法です。

ゲームデータの保存には、PlayerPrefsを使っていきます。

保存するクラスは以下のようにしました。

[System.Serializable]
public class MovableObj
{
    public Vector3 position;
    public Vector3 rotation;
    public Vector3 scale;

    public MovableObj(Vector3 position,Vector3 rotation,Vector3 scale) {
        this.position = position;
        this.rotation = rotation;
        this.scale = scale;
    }
}

保存したいGameObjectをインスペクタでセットします。

    [SerializeField] GameObject[] gm;

    public void Save()
    {

        var objs = new MovableObj[gm.Length];


        for (int i = 0; i < gm.Length; i++)
        {
            objs[i] = new MovableObj(gm[i].transform.position,
                gm[i].transform.localEulerAngles, gm[i].transform.localScale);
        }
        PlayerPrefs.SetString("Parameter", JsonHelper.ToJson(objs));
    }

    public void Load()
    {
        var json = PlayerPrefs.GetString("Parameter", "nodata");

        if (json.Equals("nodata"))
        {
            Debug.Log("nodata");
        }
        else
        {
            MovableObj[] objs = JsonHelper.FromJson<MovableObj>(json);

            for (var i = 0; i < objs.Length; i++)
            {
                gm[i].transform.position = objs[i].position;
                gm[i].transform.localEulerAngles = objs[i].rotation;
                gm[i].transform.localScale = objs[i].scale;
            }
        }
    }

    public void Delete()
    {
        PlayerPrefs.DeleteKey("Parameter");
    }

JsonHelperとはなんぞや。

JsonUtilityを使うとJsonのシリアライズができますが、配列は対応していないみたい。

なので以下のヘルパークラスを作って補います。

public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }

    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    }

    public static string ToJson<T>(T[] array, bool prettyPrint)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    [System.Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}

参考:https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog