Daniel Lip
Daniel Lip

Reputation: 11325

Why when usig PlayerPrefs.Save() it's not saving the parent of objects?

In the SaveTransform method I'm saving all the changes to the hard disk:

PlayerPrefs.Save();

But then when using a break point in the LoadTransform method I see that the parent/s are null.

loadedTransforms[i].parent = savedTransforms[i].parent;

savedTransforms[i].parent is null.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine.SceneManagement;

public static class TransformSaver
{
    [System.Serializable]
    public class TransformInfo
    {
        public string sceneName;
        public string name;
        public Transform parent;
        public Vector3 pos;
        public Quaternion rot;
        public Vector3 scale;
    }

    //Save Transform
    public static void SaveTransform(Transform[] tranformToSave)
    {
        TransformInfo[] trnfrm = new TransformInfo[tranformToSave.Length];
        for (int i = 0; i < trnfrm.Length; i++)
        {
            trnfrm[i] = new TransformInfo();

            trnfrm[i].sceneName = tranformToSave[i].gameObject.scene.name;
            trnfrm[i].name = tranformToSave[i].name;
            trnfrm[i].parent = tranformToSave[i].parent;
            trnfrm[i].pos = tranformToSave[i].localPosition;
            trnfrm[i].rot = tranformToSave[i].localRotation;
            trnfrm[i].scale = tranformToSave[i].localScale;
        }

        string jsonTransform = JsonHelper.ToJson(trnfrm, true);
        PlayerPrefs.SetString("transform", jsonTransform);
        PlayerPrefs.Save();
    }

    //Load Transform
    public static Transform[] LoadTransform()
    {
        string jsonTransform = PlayerPrefs.GetString("transform");
        if (jsonTransform == null)
        {
            return null;
        }

        TransformInfo[] savedTransforms = JsonHelper.FromJson<TransformInfo>(jsonTransform);
        GameObject[] gameObjects = new GameObject[savedTransforms.Length];
        Transform[] loadedTransforms = new Transform[savedTransforms.Length];

        for (int i = 0; i < gameObjects.Length; i++)
        {
            SceneManager.SetActiveScene(SceneManager.GetSceneByName(savedTransforms[i].sceneName));
            gameObjects[i] = new GameObject();
            loadedTransforms[i] = gameObjects[i].transform;

            loadedTransforms[i].name = savedTransforms[i].name;
            loadedTransforms[i].parent = savedTransforms[i].parent;
            loadedTransforms[i].localPosition = savedTransforms[i].pos;
            loadedTransforms[i].localRotation = savedTransforms[i].rot;
            loadedTransforms[i].localScale = savedTransforms[i].scale;
        }
        return loadedTransforms;
    }
}

This is how I'm using the methods:

private void SaveLoad()
    {
        if (GUILayout.Button("Save"))
        {
            var selected = Selection.objects.OfType<GameObject>().ToList();
            if (selected.Count > 0)
            {
                for (var i = selected.Count - 1; i >= 0; --i)
                {
                    var select = selected[i];
                    transformSelection.Add(select.transform);
                }

                TransformSaver.SaveTransform(transformSelection.ToArray());
                tempSelections = transformSelection;
                transformSelection = new List<Transform>();
            }
        }

        if (GUILayout.Button("Load"))
        {
            TransformSaver.LoadTransform();
        }
    }

Upvotes: 0

Views: 134

Answers (1)

Transforms can't be serialized

(But you knew that, which is why you created this class)

Yet:

public Transform parent;
...
trnfrm[i].parent = tranformToSave[i].parent;

You're still trying to serialize a Transform!

Rather than trying to serialize a transform in this manner (child-up) how about serializing a different way? If a transform has children create an array of TransformInfos and stuff the transform's children into it (parent-down).

It should also be noted that PlayerPrefs isn't meant for this kind of data. It's stored in plain text which the user can easily find and edit freely, and has a very limited size.

Upvotes: 1

Related Questions