Почему, когда usig PlayerPrefs.Save () не сохраняет родительский объект? - PullRequest
0 голосов
/ 03 сентября 2018

В методе SaveTransform я сохраняю все изменения на жестком диске:

PlayerPrefs.Save();

Но затем при использовании точки останова в методе LoadTransform я вижу, что родительские элементы имеют значение null.

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

saveTransforms [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;
    }
}

Вот как я использую методы:

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

1 Ответ

0 голосов
/ 03 сентября 2018

Transforms не может быть сериализовано

(Но вы знали это, именно поэтому вы создали этот класс)

Тем не менее:

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

Вы все еще пытаетесь сериализовать Transform!

Вместо того, чтобы пытаться сериализовать преобразование таким образом (дочерний процесс), а как насчет сериализации другим способом? Если у преобразования есть дочерние элементы , создайте массив TransformInfo s и вставьте в него дочерние элементы преобразования (родительский вниз).

Следует также отметить, что PlayerPrefs не предназначен для такого рода данных. Он хранится в виде простого текста, который пользователь может легко находить и редактировать, и имеет очень ограниченный размер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...