unity 以文件形式 保存场景对象的Transform信息

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

[Serializable]
public class ObjectData
{
    public float xPos, yPos, zPos;
    public float xRot, yRot, zRot;
    public float xScl, yScl, zScl;

    public string h_prefabName; // Hierarchy name
    public string p_prefabPath; // Project name
}

public class SerializableObjTr
{

    private static string GetPathName(Transform tr)
    {
        string name = tr.name;
        string path = string.Empty;

        while(tr.parent != null)
        {
            path = tr.parent.name + "&" + path;

            tr = tr.parent;
        }

        if(string.IsNullOrEmpty(path))
        {
            path = name;
        }
        else
        {
            path = path + name;
        }
        
        return path;
    }

    private static string GetFilePath()
    {
        return Application.dataPath.Substring(0, Application.dataPath.LastIndexOf("/"));
    }

    [MenuItem("GameObject/SaveTr", priority = 0)]
    // 将序列化的对象保存到 一个 路径下,生成一个文本保存信息
    public static void SaveTr()  
    {
        Transform root = Selection.activeGameObject.transform;

        BinaryFormatter bf = new BinaryFormatter();

        //Debug.Log(GetPathName(root));

        FileStream file = File.Open(GetFilePath()  + "/"  + GetPathName(root) + ".txt", FileMode.OpenOrCreate);

        List<ObjectData> objData = new List<ObjectData>();

        Transform []trs = root.GetComponentsInChildren<Transform>();

        for (int i = 0; i < trs.Length; i++)
        {
            objData.Add(new ObjectData());
        }
        for (int i = 0; i < trs.Length; i++)
        {
            objData[i].xPos = trs[i].transform.localPosition.x;
            objData[i].yPos = trs[i].transform.localPosition.y;
            objData[i].zPos = trs[i].transform.localPosition.z;
            objData[i].xRot = trs[i].transform.localEulerAngles.x;
            objData[i].yRot = trs[i].transform.localEulerAngles.y;
            objData[i].zRot = trs[i].transform.localEulerAngles.z;
            objData[i].xScl = trs[i].transform.localScale.x;
            objData[i].yScl = trs[i].transform.localScale.y;
            objData[i].zScl = trs[i].transform.localScale.z;

            objData[i].h_prefabName = trs[i].name;
            objData[i].p_prefabPath = GetPathName(trs[i]).Replace("&", "/");
        }

        bf.Serialize(file, objData);
        file.Close();
    }

    [MenuItem("GameObject/LoadTr", priority = 0)]
    // 读取保存的信息,还原物体属性
    public static void Load() 
    {
        Transform root = Selection.activeGameObject.transform;

        if (File.Exists(GetFilePath() + "/" + GetPathName(root) + ".txt"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(GetFilePath() + "/" + GetPathName(root) + ".txt", FileMode.Open);
            
            List<ObjectData> objData = (List<ObjectData>)bf.Deserialize(file);

            file.Close();
            for (int i = 0; i < objData.Count; i++)
            {
                string path = objData[i].p_prefabPath;
                GameObject obj = GameObject.Find(path);

                obj.transform.localPosition = new Vector3(objData[i].xPos, objData[i].yPos, objData[i].zPos);
                obj.transform.localRotation = Quaternion.Euler(new Vector3(objData[i].xRot, objData[i].yRot, objData[i].zRot));
                obj.transform.localScale = new Vector3(objData[i].xScl, objData[i].yScl, objData[i].zScl);

            }
        }
        else
        {
            Debug.Log("不存在此文件:" + GetFilePath() + "/" + GetPathName(root) + ".txt");
        }
    }
}

 


版权声明:本文为qq_39849535原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。