Json操作之游戏对象存储读取位置信息数据 之个人简单笔记

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 + @"ResourcesJson.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);
    }
}
原文地址:https://www.cnblogs.com/madinglin/p/8490721.html