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