【Unity数据交互】游戏中常用到的Json序列化

news2024/11/28 2:50:53

ˊˊ

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==)持久数据文件夹
    • 🎶(==2==)JsonUtlity进行序列化
      • 🪶<font color=red>0. jsonUtilty的注意点(缺点)
      • 🪶1.将对象序列化成字符串(Json格式)
      • 🪶2.将Json反序列化成对象
      • 🪶3.练习(将序列化和反序列化变成方法调用)
    • 🎶(==3==)LitJson进行序列化
      • 🪶1.如何使用
      • 🪶<font color=red>2. LitJson的注意点
      • 🪶3.序列化
      • 🪶4.反序列化
      • 🪶5.练习
    • 🎶(==4==)JsonUtility和LitJson的区别ˊ---
    • 🎶(==5==)Json管理器---
    • 缺点


前言


🎶(1持久数据文件夹


在这里插入图片描述

  • 先获取文件夹的位置

print(Application.persistentDataPath);

  • 1.存储字符串到指定路径文件中

File.WriteAllText(Application.persistentDataPath + “/text.json”,“这是我创建的新json脚本” );

  • 2.在指定路径文件中读取字符串

string str = File.ReadAllText(Application.persistentDataPath + “/Test.json”);


🎶(2JsonUtlity进行序列化


JsonUtility是Unity引擎中的一个工具类,用于将JSON字符串转换为Unity对象或将Unity对象转换为JSON字符串。它可以方便地在Unity游戏中进行JSON数据的序列化和反序列化,使开发者可以更轻松地处理JSON数据。JsonUtility是一个非常强大和实用的工具,可以被广泛应用于Unity游戏中的数据管理、网络通信、游戏存档等方面。

  • 现实作用:
    1.将对象序列化成Json格式
    2.将Json格式反序列化为对象

在这里插入图片描述

  • 引用 using System.IO

IO通常是指Input/Output(输入/输出)的缩写。在计算机中,IO是指数据在计算机内部和外部设备之间的传输和交换。例如,键盘和鼠标输入数据到计算机中,打印机、屏幕和音箱从计算机中输出数据。这种数据的输入和输出过程就是IO。


🪶0. jsonUtilty的注意点(缺点)


😶‍🌫️注意:

    1.float序列化时看起来会有一些误差
    2.被包裹的自定义类需要加上序列化特性[System.Serializable]
    3.想要序列化私有变量 需要加上特性[SerializeField]
    4.JsonUtility不支持字典
    5.JsonUtlity存储null对象不会是null 而是默认值的数据,
    比如空int 会变成0
    6.JsonUtility无法直接反序列化读取数据集合"[]",需要用一个对象包裹它
    7.文本编码格式需要时UTF-8 不然无法加载

在这里插入图片描述

在这里插入图片描述


🪶1.将对象序列化成字符串(Json格式)


  • string jsonStr = JsonUtility.ToJson( dataGame );

           // DataGame 是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text1.json”, jsonStr);

         //将序列化后的字符串数据存在文件夹中
    

🪶2.将Json反序列化成对象


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text1.json”);

       //读取文件中的字符串 
    
  • DataGame dataGame = JsonUtility.FromJson< DataGame >(jsonStr);

      //使用Json字符串内容 转换成类对象
    
  • 代码

 jsonStr  = File.ReadAllText(Application.persistentDataPath + "/text1.json");
 
  DataGame dataGame = JsonUtility.FromJson<DataGame >(jsonStr);
 

🪶3.练习(将序列化和反序列化变成方法调用)


using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[System.Serializable]
public class Item
{
    public int id;
    public int num;

    public Item( int ID,int NUM)
    {
        id = ID;
        num = NUM;
    }
}

public class BossInfo
{
    public string name;
    public int attack;
    public int defence;
    public float moveSpeed;
    public double roundSpeed;
    public Item weapon;
    public List<int> listInt;
    public List<Item> itemList;
    public Dictionary<int, Item> itemDic1;
    public Dictionary<string, Item> itemDic2;
    [SerializeField ]
    private int self = 2 ;
    [SerializeField]
    protected int pro = 3;   

    //序列化
    public void serilized(BossInfo obj)
    {
        if(obj!=null )
        {
            string onjInfo = JsonUtility.ToJson(obj);
            File.WriteAllText(Application.persistentDataPath + ("/BossInfo.json"), onjInfo);
        }
       
    }

    //反序列化
    public BossInfo  RevSerilized(string path)
    {
        if (path != null)
        {
            string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+ path);
            return JsonUtility.FromJson<BossInfo>(objInfo);
        }
        else return null;
    } 
}

public class text : MonoBehaviour
{
    private void Start()
    {
        BossInfo boss = new BossInfo();
        boss.name = "鸭嘴兽";
        boss.attack = 100;
        boss.defence = 20;
        boss.moveSpeed = 50;
        boss.roundSpeed = 30;
        boss.weapon = new Item(001, 10);
        boss.listInt = new List<int>() { 1, 2, 3, 4 };
        boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };
        boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };
        boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };
        boss.serilized(boss); //JsonUyility 不支持字典
        print(Application.persistentDataPath);
         boss.RevSerilized("BossInfo.json");
    }
}


🎶(3LitJson进行序列化


LitJson是一个用于C#和Unity的Json解析器和生成器。它可以将Json格式的数据解析为C#对象,也可以将C#对象序列化为Json格式的数据。它具有高效,易用和可扩展性的特点,在游戏开发、网站开发、物联网等领域广泛应用。

它是一个第三方库是第三方编写的(而UtilityJson是自己编写的),用于处理Json的序列化和反序列化,LitJson是C#编写的,体积小、速度快、易于使用

🪶1.如何使用


  • 在官网中跳转GitHub获取最新版本
    在这里插入图片描述
  • 将下好的版本中的C#脚本拖到Unity中
    在这里插入图片描述

🪶2. LitJson的注意点


  • 1.序列化不需要加特性
  • 2.不能序列化私有变量
  • 3.需要引用命名空间
  • 4.可以保存null值
  • 5.可以序列化字典,但是键必须是字符串类型否则会报错
  • 6.序列化类的时候一定要确保它有无参构造函数否则会报错
  • 7.可以直接读取数据集合[]
  • 8.文本编码格式需要时UTF-8 不然无法加载

🪶3.序列化


  • 和方式JsonUtility一样

  • string jsonStr = JsonMapper.ToJson(obj);

            // obj是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text.json”, jsonStr);

            //将序列化后的字符串数据存在文件夹中
    

🪶4.反序列化


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text.json”);

  • objInfo 2 = JsonMapper.ToObject< objInfo> (jsonStr);

       //通过泛型转换更方便
    
  • ②JsonData data = JsonMapper.ToObject(jsonStr);

       //JsonData是LitJson提供的类对象
        访问其中的内容要用键值对的形式去
             print(data["age"]);
    

🪶5.练习


using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Item
{
    public int id;
    public int num;

    public Item() { } //因为有参把他替换了所以需要重新声明
    public Item( int ID,int NUM)
    {
        id = ID;
        num = NUM;
    }
}

public class BossInfo
{
    public string name;
    public int attack;
    public int defence;
    public float moveSpeed;
    public double roundSpeed;
    public Item weapon;
    public List<int> listInt;
    public List<Item> itemList;
    public Dictionary<int, Item> itemDic1;
    public Dictionary<string, Item> itemDic2;
    private int self = 2 ;
    protected int pro = 3;   


    //LitJson序列化
    public void LSerilized(BossInfo obj)
    {
        if (obj != null)
        {
            string objInfo = JsonMapper.ToJson(obj);
            File.WriteAllText(Application.persistentDataPath + ("/BossInfo2"), objInfo);
        }
    }

    //LitJson反序列化
    public BossInfo RevLSerilized(string path)
    {
       if(path != null )
        {
            string objInfo =  File.ReadAllText(Application.persistentDataPath +"/"+path );
            return   JsonMapper.ToObject<BossInfo>(objInfo);

        }
       else   return null;
    }
}

public class text : MonoBehaviour
{
    private void Start()
    {
        BossInfo boss = new BossInfo();
        boss.name = "鸭嘴兽";
        boss.attack = 100;
        boss.defence = 20;
        boss.moveSpeed = 50;
        boss.roundSpeed = 30;
        boss.weapon = new Item(001, 10);
        boss.listInt = new List<int>() { 1, 2, 3, 4 };
        boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };
        boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };
        boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };
        boss.LSerilized(boss); //JsonUyility 不支持字典
        print(Application.persistentDataPath);
        boss.RevLSerilized("BossInfo.json");
    }
}


🎶(4JsonUtility和LitJson的区别ˊ


  • 1.JsonUt1ity是Unity自带,LitJson是第三方需要引用命名空间
  • 2.JsonUt1ity使用时自定义类需要加特性,LitJson不需要
  • 3.JsonUt1ity支持私有变量(加特性),LitJson不支持
  • 4.JsonUt1ity不支持字典,LitJson支持(但是键只能是字符串)
  • 5.JsonUt1ity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
  • 6.JsonUt1ity对自定义类不要求有无参构造,LitJson需要
  • 7.JsonUt1ity存储空对象时会存储默认值而不是nu11,LitJson会存null

🎶(5Json管理器


using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

/// <summary>
/// 序列化和反序列化Json时  使用的是哪种方案
/// </summary>
public enum JsonType
{
    JsonUtlity,
    LitJson,
}

/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{
    private static JsonMgr instance = new JsonMgr();
    public static JsonMgr Instance => instance;

    private JsonMgr() { }

    public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson)
    {
      
        string path = Application.persistentDataPath + "/" + fileName + ".json";
        string jsonStr = "";

        switch (type)
        {
            case JsonType.JsonUtlity:
                jsonStr = JsonUtility.ToJson(data);
                break;
            case JsonType.LitJson:
                jsonStr = JsonMapper.ToJson(data);
                break;
        }
        
        File.WriteAllText(path, jsonStr);
    }

    /// <summary>
    /// Json反序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new()
    {
        //先判断 是否存在streamingAssets中
        string path = Application.streamingAssetsPath + "/" + fileName + ".json";

        //如果不存在默认文件 就从 persistentDataPath文件夹中去寻找
        if (!File.Exists(path))
            path = Application.persistentDataPath + "/" + fileName + ".json";
        //如果读写文件夹中都还没有 那就返回一个默认对象
        if (!File.Exists(path))
            return new T();

        //进行反序列化
        string jsonStr = File.ReadAllText(path);
        //数据对象
        T data = default(T);
        switch (type)
        {
            case JsonType.JsonUtlity:
                data = JsonUtility.FromJson<T>(jsonStr);
                break;
            case JsonType.LitJson:
                data = JsonMapper.ToObject<T>(jsonStr);
                break;
        }

        //把对象返回出去
        return data;
    }
}

缺点


  • 重复工作繁多,自定义数据类,需要自己取实现存储读取的功能而且代码的相似度极高
  • 数据容易被修改,只要找到文件位置,就可以轻易的进行数据修改

⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…

面向网络安全-Python语言

目录 1、变量 2、字符串 3、列表 4、字典 5、网络 6、条件选择语句 7、异常处理 1、变量 变量是指储存在某个内存地址上的数据 主要有&#xff1a;整型数、实数、布尔值、字符串、列表、元组、字典 这些数据在声明后&#xff0c;解释器就会自动确定每个变量的类型&…

【云原生 | Docker】Linux 定时自动化备份Mysql数据到本地 Windows 最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

C#,数值计算——偏微分方程,Mgfas的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Mgfas { public int n { get; set; } public int ng { get; set; } public double[,] uj; public double[,] uj1 { get; …

云安全-攻防视角下如何看待堡垒机

0x00 堡垒机简介 堡垒机是种网络安全设备&#xff0c;用于保护和管理企业内部网络与外部网络之间的访问。它作为一种中间节点&#xff0c;提供安全的访问控制和审计功能&#xff0c;用于保护内部网络免受未经授权的访问和攻击。堡垒机通常被用作跳板服务器&#xff0c;即堡垒机…

2023辽宁省数学建模A题铁路车站的安全标线完整原创论文详细讲解(含matlab代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模A题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B预计下午两点前更新完毕&#xff0c;A全…

【错误解决方案】TypeError: gca() got an unexpected keyword argument ‘projection‘

1. 错误提示 在 python程序中&#xff0c;使用Matplotlib库中的 gca() 函数出现错误&#xff0c;提示“TypeError: gca() got an unexpected keyword argument projection”。 2. 解决方案 这个错误的原因是 gca() 函数并不接受 projection 这个关键字参数。 gca() 函数是用来…

半导体芯片制造行业MES系统解决方案

半导体产业作为现代电子科技的重要支柱&#xff0c;驱动着电子设备和通信技术的飞速发展。随着技术不断演进&#xff0c;半导体制造企业面临着越来越多的挑战&#xff0c;如高度复杂的工艺流程、全球化的竞争、质量控制的要求以及能源效率等问题。 为了应对这些挑战&#xff0…

学电脑编程零基础,计算机编程入门先学什么

学电脑编程零基础&#xff0c;计算机编程入门先学什么&#xff0c;建议先从容易学习的语言入手&#xff0c;比如中文编程。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&…

第六章 Python函数

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

美颜SDK哪家便宜?企业级美颜工具包

在当今竞争激烈的企业宣传领域&#xff0c;一张优质的照片可以为企业带来巨大的价值。然而&#xff0c;由于各种原因&#xff0c;拍摄的照片、视频往往存在一些瑕疵&#xff0c;如肤色不均、背景杂乱等。为了解决这个问题&#xff0c;美摄科技特别推出了面向企业的专业美颜SDK&…

大数据之LibrA数据库系统告警处理(ALM-12017 磁盘容量不足)

告警解释 系统每30秒周期性检测磁盘使用率&#xff0c;并把磁盘使用率和阈值相比较。磁盘使用率有一个默认阈值&#xff0c;当检测到磁盘使用率超过阈值时产生该告警。 平滑次数为1&#xff0c;主机磁盘某一分区使用率小于或等于阈值时&#xff0c;告警恢复&#xff1b;平滑次…

当 Next.js 遇到 Wordpress 会发生什么?

Wordpress 作为一款小型的内容管理系统&#xff0c;受到很多站长的欢迎&#xff0c;特别是作为个人博客&#xff0c;丰富的插件和主题提供了更多的定制和自由度。 自从前后端分离的开发模式兴起之后&#xff0c;Wordpress 又被作为数据存储的后端服务提供接口给第三方的前端页面…

JVM类的声明周期

文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…

第四章 Python运算符与流程控制

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

【Unity之UI编程】如何用UGUI搭建一个登录注册面板

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

数据可视化:折线图

1.初看效果 &#xff08;1&#xff09;效果一 &#xff08;2&#xff09;数据来源 2.JSON数据格式 其实JSON数据在JAVA后期的学习过程中我已经是很了解了&#xff0c;基本上后端服务器和前端交互数据大多是采用JSON字符串的形式 &#xff08;1&#xff09;JSON的作用 &#…

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术&#xff0c;在游戏中实现无碰撞。正常情况下碰撞后角色死亡&#xff0c;修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

AD9371 官方例程 NO-OS 主函数 headless 梳理

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…