前言
- 在场景里面创建一些物体,然后把场景里的物体数据存入Json文本。接着读取json文本里的信息放到unity
场景物体数据存储
- 在场景里创建几个物体并且改变形状位置等
- 创建一个脚本,先拿到单个物体的数据,包含大小角度坐标名字
- ObjectVO代表一个物体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public class ObjectVO
{
public Vector3 pos;
public Vector3 rot;
public Vector3 sca;
public string name;
}
- 再创建一个脚本,将多个物体存入,以数组的形式
- 这两个脚本可以并入一个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class DataVO
{
public List<ObjectVO> listObjs = new List<ObjectVO>();
}
- 最后创建脚本,写入物体信息
- Selection类是选择场景物体,
- Selection.activeObject 选择某一个物体,返回值是object
- Selection.activeGameObject 选择的是某一个游戏物体 返回值是gameobject
- Selection.gameObjects 选择所有的物体 返回的是gameobject的数组
- 接着使用for循环读取物体的数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class WriteJson
{
[MenuItem("Tools/WriteJson")]
static void Write()
{
string path = Application.dataPath + "/MyJson.json";
GameObject[] objs= Selection.gameObjects;
DataVO data = new DataVO();
for (int i = 0; i < objs.Length; i++)
{
ObjectVO obj = new ObjectVO();
obj.name = objs[i].name;
obj.pos = objs[i].transform.position;
obj.rot = objs[i].transform.eulerAngles;
obj.sca = objs[i].transform.localScale;
data.listObjs.Add(obj);
}
string s= JsonUtility.ToJson(data);
File.WriteAllText(path, s);
}
}
-
回到unity,选中三个物体,点击Tools里面的WriteJson,这个是为了方便测试不用点击运行的一个方法,之后会出一篇文章说明,相当于点击了运行。
-
右击Assets刷新,里面多了一个json文档,存入的是选中三个物体的信息,
场景物体数据还原
- 创建一个脚本,读取刚才存入的物体信息放入unity
- 先把之前创建的三个物体失活,
- GameObject.CreatePrimitive方法创建Unity 3D系统自带的基本游戏对象,参数要的是枚举值,我们可以拿到json里面物体的名字,是字符串,所以要将字符串转换成枚举
- obj就是上面的方法创建出来的对象,接下来读取数据然后赋值。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;
public class ReadJson {
[MenuItem("Tools/ReadJson")]
static void Read()
{
string path = Application.dataPath + "/MyJson.json";
string s = File.ReadAllText(path);
DataVO data = JsonUtility.FromJson<DataVO>(s);
for (int i = 0; i < data.listObjs.Count; i++)
{
GameObject obj= GameObject.CreatePrimitive((PrimitiveType)Enum.Parse(typeof(PrimitiveType), data.listObjs[i].name));
obj.transform.position = data.listObjs[i].pos;
obj.transform.eulerAngles = data.listObjs[i].rot;
obj.transform.localScale = data.listObjs[i].sca;
}
AssetDatabase.Refresh();
}
}
- 回到unity,不用选择场景的物体,直接点击ReadJson
- 读入的物体和之前的一样