Json操作之游戏对象存储读取位置信息数据
准备工作:
一个Cube预制体,Resouses文件夹,Json.jon文本文件,
一个用于管理新生成子物体的gamemanager空GameObject做为父物体,并挂载gameManagerDemo3脚本
gamemanager下创建几个子物体用于演示
创建一个CubeItem脚本做为中转类
实现效果:
按A键存储当前游戏物体位置信息。
按D键读取已存储的位置信息,并重新生成新的游戏物体。
using System.Collections.Generic; using UnityEngine; using LitJson; using System.IO; using System; public class gameManagerDemo3 : MonoBehaviour { //字段 private Transform m_Transform; private Transform[] all_transform; private KeyCode keyCodeA=KeyCode.A; private KeyCode keyCodeD=KeyCode.D; private List<CubeItem> CubeList; private List<CubeItem> ToObjectList; private GameObject m_Prefab; //开始事件,只执行一次。 void Start () { m_Transform=gameObject.GetComponent<Transform>(); //预制体引用 m_Prefab = Resources.Load<GameObject>("Cube"); //初始化集合 CubeList = new List<CubeItem>(); ToObjectList = new List<CubeItem>(); } //更新事件,每帧执行一次。 void Update () { if (Input.GetKeyDown(keyCodeA)) { ObjectToJson(); } if (Input.GetKeyDown(keyCodeD)) { JsonToObject(); } } //方法 /// <summary> /// 写入 /// </summary> private void ObjectToJson() { //集合使用前先清空,避免重复添加数据 CubeList.Clear(); //只有按下才找子物体组件 all_transform = m_Transform.GetComponentsInChildren<Transform>(); for (int i = 1 ; i < all_transform.Length; i++) { Vector3 pos = all_transform[i].position; //Json不支持Float类型数据,所以需要一个中转 //定义一个含有相应数据信息的实体类CubeItem用来中转操作,需要相应的数据做为参数 //实例化一个中转类的对象, 同时将小数位限制在2位,Math.Round CubeItem itemp = new CubeItem(Math.Round( pos.x,2).ToString(), Math.Round(pos.y, 2).ToString(), Math.Round(pos.z, 2).ToString()); //加入集合 CubeList.Add(itemp); } //集合对象转Json, 并以string类型接收存储 string str = JsonMapper.ToJson(CubeList); print(str); //创建写入文件对象 //Application.dataPath 取运行目录 StreamWriter sw = new StreamWriter(Application.dataPath + @"\Resources\Json.json"); //写入文件 sw.Write(str); //写入操作完成后,别忘记手动关闭打开的文件 sw.Close();
//所有工作完成后,记得刷新一下资源文件夹,不手动刷新的话,unity不会自动刷新,导致在读取数据时不准,或读空数据的bug AssetDatabase.Refresh();//项目打包时这句要注释掉,并且删除 using UnityEditor; } /// <summary> /// 读取 /// </summary> private void JsonToObject() {
//先刷新一下资源文件夹再进行操作,存档后刷新,这里不刷新也行,预防万一还是刷一下
AssetDatabase.Refresh();//项目打包时这句要注释掉,并且删除 using UnityEditor; //清空需要用到的集合 ToObjectList.Clear(); //将Json文件内容读取为TextAsset类型的文本数据 TextAsset tex = Resources.Load<TextAsset>("Json"); //TextAsset类型的文本数据转换成JsonData类型,即文本转对象 JsonData jsda= JsonMapper.ToObject(tex.text); //遍历 ,并加入集合 for (int i = 0; i < jsda.Count; i++) { //Json转对象 CubeItem temp2= JsonMapper.ToObject<CubeItem>(jsda[i].ToJson()); //加入集合 ToObjectList.Add(temp2); } //遍历重新生成物体 for (int i = 0; i < ToObjectList.Count; i++) { //string 类型的数据转为可以使用的Vector3类型 Vector3 pos = new Vector3(float.Parse(ToObjectList[i].PosX), float.Parse(ToObjectList[i].PosY), float.Parse(ToObjectList[i].PosZ)); //生成物体到管理器下 GameObject.Instantiate<GameObject>(m_Prefab,pos,Quaternion.identity,m_Transform); } //JsonData 用完后同样需要清空。 jsda.Clear(); } }
中转实体类,不需要继承,不需要挂载
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; //数据实体类 public class CubeItem { // private string posx; private string posy; private string posz; // public string PosX { get { return posx; } set { posx = value; } } public string PosY { get { return posy; } set { posy = value; } } public string PosZ { get { return posz; } set { posz = value; } } // public CubeItem() { } public CubeItem(string x, string y, string z) { this.posx = x; this.posy = y; this.posz = z; } public override string ToString() { return string.Format("x ={0} y ={1} z = {2}", PosX, PosY, PosZ); } }