• 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);
        }
    }
  • 相关阅读:
    Silverlight+WCF 实战网络象棋最终篇之房间装修WCF端(二)
    win7下如何添加虚拟网卡(转)
    Python天天美味(12) 条件判断的缩写(转)
    MENUITEMINFO结构的翻译(转)
    C语言写Python extension实践(转)
    Python天天美味(15) Python正则表达式操作指南(re使用)(转)
    Python Import机制备忘模块搜索路径(sys.path)、嵌套Import、package Import(转)
    python单例模式(转)
    Python 操作剪贴板(转)
    Base64加密原理(转)
  • 原文地址:https://www.cnblogs.com/madinglin/p/8490721.html
Copyright © 2020-2023  润新知