一、前期准备:
1、Json库:Json有很多库,较常用的是LitJson.dll;
(PS:这个库,大家自己网上搜吧,我这边不知道怎么上传,也不太清楚我使用的库具体是几年前的了,就不贴)
另外,可能版本问题,由于测试中发现两个问题:
(1)数据转换成json格式时发生改变:限定好float保留小数点后1位,结果转为Json,保存的数据小数点后位数会出现不止一位的问题;
(2)保存的Json数据在文件里一行存储,看着挺不舒服的;
故格式转换和存储一些部分使用Newtonsoft.Json的API,而不是LitJson;
2、小技巧:限定float小数点后几位:
(1)Mathf.Round();(2)Math.Round(Double num1,Int32 num2);(3)String.Format(string value,F1);(4)value.ToString("0.0");
有需要的可以看我的另一篇学习文章:
C# 数据处理——(包括但不限)浮点数设置小数点后位数_逍遥乐平的博客-CSDN博客
二、 Json格式文件存储读取
1、数据Datas类
(1)这里使用类以清晰、方便的保存多个数据,也可以不使用类,直接存储某个某些数据等。
(2)简单说明Json格式存储读取数据,只使用了简单的数据类型,复杂的比如List列表,Array数组,enum枚举等等可自己添加使用;
(3)要序列化和反序列化类,要添加可序列化标记:[Serializable]
using System;
[Serializable]
public class Datas
{
public string title;
public int A;
public float ValueB;
public float cst;
}
2、文件file:
(1)存储的路径filePath:
1)路径可以在用的时候再申明个局部变量,也可以直接创建一个全局变量。个人更喜欢使用全部变量,不用反复修改创建。
2)我这里是存储为json文件,文件名为jsonDatas.json,也可以保存为txt文件,文件名改为jsonDatas.txt;同理其他文件格式;
2)关于文件存储地址:
①Resources文件夹:用来存放资源的特殊文件夹,仅在unity编辑器里使用,unity可以方便快速加载Resources文件夹里的资源。
filePath = "jsonDatas.txt";//路径名,资源已经在Resources文件夹中了
Resources.Load(filePath);//直接读取Resources文件夹下的指定资源,路径不需要加Resources文件夹前缀。
②Assets/xx/xx.xxx路径:Asset文件夹下任意位置任意资源,也仅是在编辑器环境下运行使用。打包后不存在Asset文件。
③streamingAssets文件夹:流文件夹,一般是预存的信息,不要改动 ;在打包后项目运行时只能读不能写,不同平台该文件的路径也不同。一般将初始的AssetsBundle资源放在该文件夹下
④Application.dataPath路径:相对项目工程安装位置的相对路径,
⑤Application.streamingAssetsPath路径:
⑥Application.persistenDataPath路径:和项目安装位置无关的绝对路径,是用户信息,保存用户数据,升级版本不会影响到这些数据;
⑦Application.temporaryCachePath路径:是用来放缓存和临时的,用户可以清理掉;
考虑多平台的话,尽量存到Application.persistenDataPath;
(2)判断是否存在目标文件/是否有存档(文件)
可以使用File.Exists(FilePath),来判断目标文件是否存在;
public Ddatas datas;//数据
public string filePath;//存档路径
private void Awake()
{
filePath = Application.persistentDataPath + "/jsonDatas.json";
}
private void OnEnable()
{
//if (!Directory.Exists(filePath))
if (!File.Exists(filePath))
{
Debug.Log("本地没有存档");
......
......
SaveDatasJson();//存档
}
ReadDatasJson();//读档
}
3、数据存储和读取
(1)这里使用到Json库,可以选择LitJson库也可以选择.net的Json;
我这里列出三种转换格式,前两种转换后生成的文件,打开后,是一堆数据,没有格式;不方便阅读查看。
没注释的是最后选择使用的,生成的json文件里数据,有换行显示,看起来比较舒服易读;
(2)数据读写用得到using System.IO命名空间;
包括后面的读取文件,也是要使用using System.IO命名空间。
using System.IO;
(3) 数据转换数据流进行读写操作
1)将目标数据转为数据流
如:string jsonStr = JsonMapper.ToJson(tempDatas);
2)根据给的路径查找文件:
StreamWriter sw = new StreamWriter(FilePath);
这里会自动根据给的路径查找文件,文件存在则读写文件,文件不存在会根据路径新建文件,再进行读写;
2)将数据流进行写入或读出
sw.WriteLine(jsonStr);//写入
string ReadStr = sr.ReadToEnd();//读出
3)结束读写操作后,记得关闭数据流:
sw.Close();
(4)存储数据示例(以Json格式文件为例)
//存储为Json格式Json文件
private void SaveDatasJson()
{
Datas tempDatas = datas;
//将Datas的数据转换为Json格式数据
//string jsonStr = JsonMapper.ToJson(tempDatas);//使用LitJson库
//string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(tempDatas);//使用.net的Json库
string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(tempDatas,Newtonsoft.Json.Formatting.Indented);//规范Json数据格式
//根据文件路径,创建/打开目标文件,使用到I/O;
StreamWriter sw = new StreamWriter(FilePath);
//把Json数据写入文件中
sw.WriteLine(jsonStr);
//关闭数据流
sw.Close();
Debug.Log("保存成功");
}
(5)读取数据示例:读取数据并转为所需要的格式;
//读取Json文件数据,并把数据转回目标格式赋值目标数据
private void ReadDatasJson()
{
if (!File.Exists(FilePath))
{
Debug.Log("找不到存档文件");
}
else
{
//根据文件路径创建数据流
StreamReader sr = new StreamReader(FilePath);
//读取Json数据
string ReadStr = sr.ReadToEnd();
//关闭数据流
sr.Close();
//将获取到的Json数据转为Datas类数据,使用到LitJson库
Ddatas tempDatas= JsonMapper.ToObject<Datas>(ReadStr);
//把读取的数据赋值给目标数据
datas= tempDatas;
Debug.Log("本地存档读取赋值成功");
}
}
注:草稿到现在,中间隔得有点久了,有的想不起来了,后面想起来有空在补充。。。。