Unity使用Newtonsoft.Json本地化存档

news2025/5/17 7:38:57

我是标题

    • 1.依赖包
    • 2.原理:
    • 3.代码
    • 4.可用优化
    • 5.数据加密

1.依赖包

Newtonsoft请在PacakgeManager处下载。
参考:打工人小棋
在这里插入图片描述

2.原理:

把要存储的对象数据等使用JsonConvert.SerializeObject(object T)进行序列化为字符串,并且通过File.WriteAllText写入json文本文件。
读取的时候就通过反序列化读取存储的数据。
T data = JsonConvert.DeserializeObject(jsonContent);

3.代码

Unity官方推荐把存档文件放置到Application.persistentDataPath目录下。在Windows环境下路径为:在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
    public static void SavaUserData(UserData userData)
    {
        if(!File.Exists(Application.persistentDataPath + "/users"))
        {
            System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
        }
        // 序列化
        string jsonContent = JsonConvert.SerializeObject(userData);
        // 输出一个json文件 {0} 是占位符 类似printf的%d
        File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
    }
    public static UserData LoadUserData(string userName)
    {
        string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
        if(File.Exists(path))
        {
            // 读取路径文本数据
            string jsonContent = File.ReadAllText(path);
            // 反序列化
            UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
            return userData;
        }
        else
        {
            Debug.LogError("DO NOT EXIST");
            return null;
        }
    }
}

public class UserData
{
    public int level;
    public string name;
}

4.可用优化

由于硬盘的读写是比较耗时的操作,我们可以用字典存储<userName,userData>的键值对。
好处:读取相同的数据只有第一次需要使用文件读取,后续只需要使用字典访问。
由于每次退出程序DIctionary都会清空所以第一次访问同一个对象会比后续慢。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
    public static Dictionary<string, UserData> userDataDic = new Dictionary<string, UserData>();
    public static void SavaUserData(UserData userData)
    {
        if(!File.Exists(Application.persistentDataPath + "/users"))
        {
            System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
        }
        // 序列化
        string jsonContent = JsonConvert.SerializeObject(userData);
        // 输出一个json文件 {0} 是占位符 类似printf的%d
        File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
        if(userDataDic.ContainsKey(userData.name))
        {
            userDataDic[userData.name] = userData;
        }
        else
        {
            userDataDic.Add(userData.name, userData);
        }

    }
    public static UserData LoadUserData(string userName)
    {

        if(userDataDic.ContainsKey(userName))
        {
            return userDataDic[userName];
        }

        string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
        if(File.Exists(path))
        {
            // 读取路径文本数据
            string jsonContent = File.ReadAllText(path);
            // 反序列化
            UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
            return userData;
        }
        else
        {
            Debug.LogError("DO NOT EXIST");
            return null;
        }
    }
}

public class UserData
{
    public int level;
    public string name;
}

5.数据加密

因为一个数字异或同一个数字两次能得到原来的结果,所以可以借此来加密解密。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
    public static Dictionary<string, UserData> userDataDic = new Dictionary<string, UserData>();

    private static char[] chars = {'4','5','6'};
    private static string Encrypt(string data)
    {
        char[] temp = data.ToCharArray();
        for(int i = 0; i < temp.Length; i++)
        {
            temp[i] = (char) (temp[i] ^ chars[i % 3]);
        }
        return new string(temp);
    }
    public static void SavaUserData(UserData userData)
    {
        if(!File.Exists(Application.persistentDataPath + "/users"))
        {
            System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
        }
        // 序列化
        string jsonContent = JsonConvert.SerializeObject(userData);
        jsonContent = Encrypt(jsonContent);
        // 输出一个json文件 {0} 是占位符 类似printf的%d
        File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
        if(userDataDic.ContainsKey(userData.name))
        {
            userDataDic[userData.name] = userData;
        }
        else
        {
            userDataDic.Add(userData.name, userData);
        }

    }
    public static UserData LoadUserData(string userName)
    {

        if(userDataDic.ContainsKey(userName))
        {
            return userDataDic[userName];
        }

        string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
        if(File.Exists(path))
        {
            // 读取路径文本数据
            string jsonContent = File.ReadAllText(path);
            // 反序列化
            jsonContent = Encrypt(jsonContent);
            UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
            return userData;
        }
        else
        {
            Debug.LogError("DO NOT EXIST");
            return null;
        }
    }
}

public class UserData
{
    public int level;
    public string name;
}

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

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

相关文章

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 答案解析&#xff1a;https://blog.csdn.net/qq_33897084/article/details/147341458 一、单选题(共25题&#xff0c;共50分) 1. 在tkinter的…

Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常

一、问题背景&#xff1a;当浮点数运算遇见 “反直觉” 结果 在 Python 开发中&#xff0c;以下代码输出常让开发者困惑&#xff1a; print(round(0.675, 2)) # 预期0.67&#xff0c;实际0.68||预期0.68&#xff0c;实际0.67 print(0.1 0.2) # 预期0.3&…

【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

极狐GitLab 注册限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制&#xff1a; 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目&#xff1a;SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议&#xff1a;IEEE / CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://www.arxiv.org/abs/2503.16825 代码&#xff1a;https://githu…

Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化

一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…

加密和解密(大语言模型)

看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少&#xff0c;所以&#xff0c;我让大语言模型提供一些概论性质的东西&#xff0c;转发出来自娱自乐。期望了解p文件加密的复杂度&#xff0c;而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…

双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁

在全球能源结构深度转型与“双碳”目标的双重驱动下&#xff0c;工厂作为能源消耗的主力军&#xff0c;正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展&#xff0c;为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践&#xff0c;深度探索能源协同优…

React 更新 state 中的数组

更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象&#xff0c;它虽然是可变的&#xff0c;但是却应该被视为不可变。同对象一样&#xff0c;当你想要更新存储于 state 中的数组时&#xff0c;你需要创建一个新的数组&#xff08;或者创建一份已有数组…

ubantu18.04HDFS编程实践(Hadoop3.1.3)

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 第二步&am…

MySQL快速入门篇---库的操作

目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验&#xff08;排序&#xff09;规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 ​…

【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题

完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具&#xff0c;近年来在高校校园内得到了广泛应用。然而&#xff0c;共享单车的运营也面临一些挑战。某高校引入共享单车后&#xff0c;委托学生对运营情况进行调…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建

开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强&#xff0c;某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作&#xff0c;为了能够更好地进行体系规划与建设应用&#xff0c;特邀请智能制造专家小智来进行讨论交流。 王…

航电系统之通信技术篇

航电系统&#xff08;航空电子系统&#xff09;的通信技术是现代航空器的核心技术之一&#xff0c;其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备&#xff08;如地面控制中心、其他飞行器等&#xff09;之间高效、可靠的信息交互。随着航空技术的不断发展&#xf…

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…

深度学习3.1 线性回归

3.1.1 线性回归的基本概念 损失函数 梯度下降 3.1.2 向量化加速 %matplotlib inline import math import time import numpy as np import torch from d2l import torch as d2ln 1000000 #本机为了差距明显&#xff0c;选择数据较大&#xff0c;运行时间较长&#xff0c;可选…