当前位置: 首页 > news >正文

Unity数据持久化—Json存档

项目需求为:

1.实现存档列表,显示存档截图,可以查看之前保存的所有存档

2.点击存档直接加载到场景

首先,定义两个类,用于声明存档列表和存档所需要的List

[System.Serializable]
public class SaveData
{//存储目标物的位置和朝向public List<Vector3> targetPosition = new List<Vector3>();public List<Quaternion> targetRotation = new List<Quaternion>();//保存截图public string targetImg;
}[System.Serializable]
public class SaveList
{   //存档列表存储各个存档的地址public List<string> DataPath = new List<string>();
}

存储存档列表、存档

//存档
public void TestSave()
{        //取当前时间来做存档的名字string now = DateTime.Now.ToString("yyyy-M-d-HH-mm-ss");string path = Application.dataPath + "/StreamingFile/" + now;//调用存档方法SaveData saveData = CreatSave(path);//利用jsonutility将savedata转为jsonstring saveJson = JsonUtility.ToJson(saveData);//将json写入文件//新建StreamWriter,写入jsonStreamWriter streamWriter = new StreamWriter(path + ".json");streamWriter.Write(saveJson);//关闭StreamWriterstreamWriter.Close();TestListSave(path);Debug.Log("保存成功");
}/// <summary>
/// 存储存档列表
/// </summary>
/// <param name="pathname"></param>
void TestListSave(string pathname)
{SaveList sl = new SaveList();string path = Application.dataPath + "/StreamingFile/list.list";//alllist是临时List,用于存所有的存档个数alllist.Add(pathname);sl.DataPath = alllist;//将所有的存档个数打包保存(覆盖式)string saveList = JsonUtility.ToJson(sl);StreamWriter streamWriter = new StreamWriter(path);streamWriter.Write(saveList);streamWriter.Close();        
}/// <summary>
/// 创建Save对象,存储当前状态
/// </summary>
/// <returns></returns>
private SaveData CreatSave(string path)
{SaveData saveTest = new SaveData();//all是所有的目标物的父物体,将位置和旋转存入listfor (int i = 0;i < all.childCount;i++){saveTest.targetPosition.Add(all.GetChild(i).position);saveTest.targetRotation.Add(all.GetChild(i).rotation);}//将存档截图地址保存saveTest.targetImg = path;//截图功能CameraCapture(path, main, new Rect(0, 0, Screen.width, Screen.height));return saveTest;
}

截图相关代码

  
//指定相机指定范围
public static void CameraCapture(string i, Camera camera, Rect rect)
{        string path = Path.Combine(i, $"{i}.png");int w = (int)rect.width;int h = (int)rect.height;RenderTexture rt = new RenderTexture(w, h, 0);//将相机渲染内容存到指定RenderTexturecamera.targetTexture = rt;camera.Render();//激活指定RenderTextureRenderTexture.active = rt;//参数4:mipchain多级渐远纹理Texture2D t2D = new Texture2D(w, h, TextureFormat.ARGB32, true);//防止截黑屏,可能会报错//yield return new WaitForEndOfFrame();//把RenderTexture像素读到texture2dt2D.ReadPixels(rect, 0, 0);t2D.Apply();//存成PNGbyte[] bytes = t2D.EncodeToPNG();File.WriteAllBytes(path, bytes);//用完重置、销毁camera.targetTexture = null;RenderTexture.active = null;GameObject.Destroy(rt);
}public static Sprite LoadShot(string i)
{string shotPath = Application.dataPath + "/StreamingFile/Shot";var path = Path.Combine(shotPath, $"{i}.png");Texture2D t = new Texture2D(640, 360);t.LoadImage(GetImgByte(path));return Sprite.Create(t, new Rect(0, 0, t.width, t.height), new Vector2(0.5f, 0.5f));
}static byte[] GetImgByte(string path)
{FileStream s = new FileStream(path, FileMode.Open);byte[] imgByte = new byte[s.Length];s.Read(imgByte, 0, imgByte.Length);s.Close();return imgByte;
}public static void deleteShot(string i)
{string shotPath = Application.dataPath + "/StreamingFile/Shot";var path = Path.Combine(shotPath, $"{i}.png");if (File.Exists(path)){File.Delete(path);Debug.Log($"删除{i}");}
}

读取存档列表和存档

//读档
public void LoadTest(Text text)
{        string filepath = Application.dataPath + "/StreamingFile/" + text.text + ".json";if (File.Exists(filepath)){//创建StreamReader,读取jsonStreamReader streamReader = new StreamReader(filepath);//将json赋值给stringstring json = streamReader.ReadToEnd();//关闭streamReader.Close();//将字符串json转换为savedata对象SaveData saveData = JsonUtility.FromJson<SaveData>(json);SetLoadSave(saveData);}else{Debug.Log("没有存档");}
}
/// <summary>
/// 根据列表加载存档处理数据
/// </summary>
/// <param name="pathname"></param>
void TestListLoad()
{string path = Application.dataPath + "/StreamingFile/list.list";if (File.Exists(path)){//创建StreamReader,读取jsonStreamReader streamReader = new StreamReader(path);//将json赋值给stringstring json = streamReader.ReadToEnd();//关闭streamReader.Close();//将字符串json转换为SaveList对象SaveList saveList = JsonUtility.FromJson<SaveList>(json);if(saveList != null){for (int i = 0; i< saveList.DataPath.Count; i++){根据数据显示scroll view下的物体并将数据赋过去var obj = list.transform.GetChild(0).GetChild(0).GetChild(i);obj.gameObject.SetActive(true);obj.GetComponent<Image>().sprite = LoadShot(saveList.DataPath[i]);string str = saveList.DataPath[i].Split("/")[5];obj.GetChild(2).GetComponent<Text>().text = str.Substring(0, 18);//读档时候将之前的列表内容读到临时list暂存alllist.Add(saveList.DataPath[i]);}}}
}/// <summary>/// 将savedata数据赋值给当前场景/// </summary>/// <param name="saveData"></param>private void SetLoadSave( SaveData saveData){if (saveData != null){for (int i = 0; i < all.childCount; i++){all.GetChild(i).position = saveData.targetPosition[i];all.GetChild(i).rotation = saveData.targetRotation[i];}}}

项目地址:【免费】unity数据持久化json存档与读档资源-CSDN文库

相关文章:

Unity数据持久化—Json存档

项目需求为&#xff1a; 1.实现存档列表&#xff0c;显示存档截图&#xff0c;可以查看之前保存的所有存档 2.点击存档直接加载到场景 首先&#xff0c;定义两个类&#xff0c;用于声明存档列表和存档所需要的List [System.Serializable] public class SaveData {//存储目标…...

基于SSM的在线学习系统的设计与实现(论文+源码)_kaic

基于SSM的在线学习系统的设计与实现 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了在线学习系统的开发全过程。通过分析企业对于在线学习系统的需求&#xff0c;创建了一个计算机管理在线学习系统的方案。文章介绍了在线学习系…...

数据库SQL语言实战(二)

目录 检索查询 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 题目九&#xff08;本篇最难的题目&#xff09; 分析 实现&#xff08;两种方式&#xff09; 模板 总结 检索查询 按照要求查找数据库中的数据 题目一 找出没有选修任何课程的学…...

idea错误地commit后如何处理

如果你想使用命令行重新初始化 Git 仓库&#xff0c;可以按照以下步骤进行&#xff1a; 删除该项目的.git文件夹 打开命令行终端。 切换到项目所在的目录&#xff0c;使用 cd 命令。 在项目目录下运行以下命令来重新初始化 Git 仓库 git init这将在当前目录下创建一个新的 Git …...

VRTK(Virtual Reality Toolkit)深入介绍

VRTK是一个为Unity引擎设计的开源虚拟现实&#xff08;VR&#xff09;开发框架&#xff0c;旨在简化和加速VR应用的开发过程。这个工具包包含了一系列的模块和预设&#xff0c;使得开发者可以快速集成标准的VR功能&#xff0c;如物体交互、环境导航、用户界面管理等。下面将对V…...

【LeetCode热题100】【贪心算法】划分字母区间

题目链接&#xff1a;763. 划分字母区间 - 力扣&#xff08;LeetCode&#xff09; 要将一个字符串划分为多个子串&#xff0c;要求每个字母只能出现在一个子串里面 如果一个字母的当前位置是它在这个字符串里面最后一次出现的位置&#xff0c;那么这里就应该划分出来成为子串…...

第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛部分WP

这里写目录标题 检材下载&#xff1a;1.理论题2.数据安全&#xff1a;pb:Sepack&#xff1a; 3.数据分析&#xff1a;数据分析&#xff08;1&#xff09;数据分析1-1:数据分析1-2:数据分析1-3: 数据分析&#xff08;3&#xff09;数据分析3-1&#xff1a;数据分析3-2&#xff1…...

如何在Python中使用matplotlib库进行数据可视化?

如何在Python中使用matplotlib库进行数据可视化&#xff1f; 在Python中使用matplotlib库进行数据可视化 数据可视化是将数据以图形或图像的形式展示出来的过程&#xff0c;它有助于我们更好地理解和分析数据。在Python中&#xff0c;matplotlib是一个非常受欢迎的数据可视化…...

网工基础协议——TCP/UDP协议

TCP和UDP的不同点&#xff1a; TCP(Transmission Control Protocol&#xff0c;传输控制协议)&#xff1b; UDP(User Data Protocol&#xff0c;用户数据报协议)&#xff1b; TCP&#xff1a;传输控制协议&#xff0c;面向连接可靠的协议&#xff0c;只能适用于单播通信&…...

ClickHouse--16--普通函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数&#xff08;返回非日期&#xff09;2、时间或日期截取函数&#xff08;返回日期&#xff09;3、日期或时间日期生成函数 二、类…...

03-JAVA设计模式-组合模式

组合模式 什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;允许你将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构&#xff0c;并且能像单独对象一…...

C++发票识别、发票查验接口示例,您的“发票管理专家”

发票识别发票查验接口。当财务人员在进行发票的数字化管理时&#xff0c;仅需一键上传发票图片&#xff0c;翔云发票识别接口即可快速、精准对发票的全票面信息进行提取&#xff0c;翔云发票查验接口可根据识别接口提取的发票信息实时联网进行真伪查验。助财务工作者从发票海洋…...

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结...

第十五届蓝桥杯题解-数字接龙

题意&#xff1a;经过所有格子&#xff0c;并且不能进行交叉&#xff0c;走的下一个格子必须是当前格子值1%k&#xff0c;输出路径最小的那一条&#xff08;有8个方向&#xff0c;一会粘图&#xff09; 思路&#xff1a;按照8个方向设置偏移量进行dfs&#xff0c;第一个到达终…...

【vue】绑定事件 v-on

v-on 简写&#xff1a; clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

【应用】SpringBoot-自动配置原理

前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为&#xff1a;3.1.2。 前置知识 在看原理介绍之前&#xff0c;需要知道Import注解的作用&#xff1a; 可以导入Configuration注解的配置类、声明Bean注解的bean方法&#xff1b;可以导入ImportSele…...

中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏

在《愿神》的提瓦特大陆上&#xff0c;每一位冒险者都拥有自己的独特力量——“神之眼”&#xff0c;他们借助元素之力探索广袤的世界&#xff0c;解决谜题&#xff0c;战胜敌人。而在提瓦特的科技树中&#xff0c;存在着一项名为“协同程序”的高级秘术&#xff0c;它使冒险者…...

C++笔记之注册回调函数常见的5种情况对比

C++笔记之注册回调函数常见的5种情况对比 —— 2024-04-10 code review! 文章目录 C++笔记之注册回调函数常见的5种情况对比1.五种情况2.示例2.1. `RegisterCallback` 和 `Callback` 都是普通函数2.2. `RegisterCallback` 是成员函数,`Callback` 是普通函数2.3. `RegisterC…...

人工智能揭示矩阵乘法的新可能性

人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时&#xff0c;即使像乘法矩阵&#xff08;二维数字表&#xff09;这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性&#xff0c;但也很诱人。除了魔方…...

实在智能携手长江新零售俱乐部:探秘实在Agent数字员工,开启零售品牌增长新篇章

近日&#xff0c;实在智能携手长江新零售俱乐部成功举办了“AIGC&#xff1a;数字员工助力零售品牌新增长”主题活动&#xff0c;成功吸引了二十余家企业中高层管理精英的踊跃参与。在此次活动中&#xff0c;与会者围绕零售业数字化转型的当前态势、面临的挑战及其重要性进行了…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...