代码之家  ›  专栏  ›  技术社区  ›  jdoedoe doedoe

为什么使用PlayerPrefs.保存()不保存对象的父对象?

  •  0
  • jdoedoe doedoe  · 技术社区  · 6 年前

    PlayerPrefs.Save();
    

    但是当在LoadTransform方法中使用断点时,我看到父级为null。

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    4 年前

    Transforms

    然而:

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

    你还在尝试序列化 Transform !

    有孩子吗 TransformInfo 并将变换的子对象填充到其中(父对象向下)。