当前位置: 首页 > 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文库

http://www.lryc.cn/news/340671.html

相关文章:

  • 基于SSM的在线学习系统的设计与实现(论文+源码)_kaic
  • 数据库SQL语言实战(二)
  • idea错误地commit后如何处理
  • VRTK(Virtual Reality Toolkit)深入介绍
  • 【LeetCode热题100】【贪心算法】划分字母区间
  • 第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛部分WP
  • 如何在Python中使用matplotlib库进行数据可视化?
  • 网工基础协议——TCP/UDP协议
  • ClickHouse--16--普通函数
  • 03-JAVA设计模式-组合模式
  • C++发票识别、发票查验接口示例,您的“发票管理专家”
  • 【电控笔记6.2】拉式转换与转移函数
  • 第十五届蓝桥杯题解-数字接龙
  • 【vue】绑定事件 v-on
  • 【应用】SpringBoot-自动配置原理
  • 中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
  • C++笔记之注册回调函数常见的5种情况对比
  • 人工智能揭示矩阵乘法的新可能性
  • 实在智能携手长江新零售俱乐部:探秘实在Agent数字员工,开启零售品牌增长新篇章
  • 计算机科学与导论 第十七 十八章 计算理论,人工智能
  • linux 设置定时任务---学习
  • 钡铼IOy系列模块深挖工业场景需求提供丰富多样的I/O解决方案
  • 【刷题笔记】第三天
  • 开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)
  • STM32-模数转化器
  • 算法刷题记录2
  • 中国代工巨头旗下芯片公司遭网络攻击,千兆字节数据被泄露
  • 【ARM 裸机】汇编 led 驱动之基本语法
  • scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)
  • OSPF星型拓扑和MGRE全连