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版权协议,转载请附上原文出处链接和本声明。