Easy way to write and read some Transform to a text file in Unity3d?

后端 未结 2 1037
忘了有多久
忘了有多久 2021-01-22 21:53

This is strictly in Unity3D, I have an array of 100 Transform,

I want to write those to a file on the PC desktop, and later read them.

Consider ...<

2条回答
  •  孤独总比滥情好
    2021-01-22 22:34

    You can use Json and the Playerprefs to save the Transform. This is a TransformSaver extension class that can do that:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public static class TransformSaver
    {
    
        [System.Serializable]
        public class TransformInfo
        {
            public Vector3 pos;
            public Quaternion rot;
            public Vector3 scale;
        }
    
        //Save Transform
        public static void SaveTransform(this Transform trans, Transform[] tranformToSave)
        {
            TransformInfo[] trnfrm = new TransformInfo[tranformToSave.Length];
            for (int i = 0; i < trnfrm.Length; i++)
            {
                trnfrm[i] = new TransformInfo();
                trnfrm[i].pos = tranformToSave[i].position;
                trnfrm[i].rot = tranformToSave[i].rotation;
                trnfrm[i].scale = tranformToSave[i].localScale;
            }
    
            string jsonTransform = JsonHelper.ToJson(trnfrm, true);
            PlayerPrefs.SetString("transform", jsonTransform);
        }
    
        //Load Transform
        public static Transform[] LoadTransform(this Transform trans)
        {
            string jsonTransform = PlayerPrefs.GetString("transform");
            if (jsonTransform == null)
            {
                return null;
            }
            //Debug.Log("Loaded: " + jsonTransform);
    
            TransformInfo[] savedTransforms = JsonHelper.FromJson(jsonTransform);
            GameObject[] gameObjects = new GameObject[savedTransforms.Length];
            Transform[] loadedTransforms = new Transform[savedTransforms.Length];
    
            for (int i = 0; i < gameObjects.Length; i++)
            {
                gameObjects[i] = new GameObject("_");
                gameObjects[i].hideFlags = HideFlags.HideAndDontSave;
                loadedTransforms[i] = gameObjects[i].transform;
                loadedTransforms[i].position = savedTransforms[i].pos;
                loadedTransforms[i].rotation = savedTransforms[i].rot;
                loadedTransforms[i].localScale = savedTransforms[i].scale;
            }
            return loadedTransforms;
        }
    
        public static void CopyTransform(this Transform trans, Transform source, Transform target, bool createNewInstance = false)
        {
            if (source == null)
            {
                return;
            }
    
            if (target == null || createNewInstance)
            {
                GameObject obj = new GameObject("_");
                obj.hideFlags = HideFlags.HideAndDontSave;
                target = obj.transform;
            }
    
            target.position = source.position;
            target.rotation = source.rotation;
            target.localScale = source.localScale;
        }
    
        public static void CopyTransform(this Transform trans, Transform[] source, Transform[] target, bool createNewInstance = false)
        {
            if (source == null || source.Length <= 0)
            {
                return;
            }
    
            for (int i = 0; i < target.Length; i++)
            {
                CopyTransform(null, source[i], target[i], createNewInstance);
                if (i >= target.Length - 1)
                {
                    break;
                }
            }
        }
    }
    

    JsonHelper script for converting arrays to json and vice versa:

    using UnityEngine;
    using System.Collections;
    using System;
    
    public class JsonHelper
    {
    
        public static T[] FromJson(string json)
        {
            Wrapper wrapper = UnityEngine.JsonUtility.FromJson>(json);
            return wrapper.Items;
        }
    
        public static string ToJson(T[] array, bool prettyPrint)
        {
            Wrapper wrapper = new Wrapper();
            wrapper.Items = array;
            return UnityEngine.JsonUtility.ToJson(wrapper, prettyPrint);
        }
    
        [Serializable]
        private class Wrapper
        {
            public T[] Items;
        }
    }
    

    Usage:

    using UnityEngine;
    using System.Collections;
    
    public class TransformTest : MonoBehaviour
    {
    
        public Transform[] objectToSave;
    
        // Use this for initialization
        void Start()
        {
            //Save Transform
            transform.SaveTransform(objectToSave);
    
            //Load Transform
            Transform[] loadedTransform = transform.LoadTransform();
            transform.CopyTransform(loadedTransform, objectToSave);
        }
    }
    

    It's not perfect and can be improved. Improvement includes making the LoadTransform function take transform array as parameter instead of returning an array.

提交回复
热议问题