|
Unity常见的三种数据本地持久化方案 转载作者:VisionWong
做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件。
一. PlayerPrefs
这是Unity自带的解决方案,会自动生成文件存储于本地,API简单,封装了繁琐的序列化反序列化过程,但他只支持几种基本数据类型,string、int、float,比较简单的数据存读取功能的话,用这个会比较方便。
示例:
早前做历史最高分数的功能,只用到了Get和Set便能实现,Get的第二个参数表示没有取到的默认值。
//记录分数
PlayerPrefs.SetInt("lastScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("lastLength", GameUIController.Instance.bodyLength);
if (PlayerPrefs.GetInt("bestScore", 0) < GameUIController.Instance.score)
{
PlayerPrefs.SetInt("bestScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("bestLength", GameUIController.Instance.bodyLength);
}
API非常简单,Get和Set会用就掌握大半了:
二. Json(Newtonsoft)
Json的话就可以存储复杂一点的对象,从而实现游戏的存读档。提供一个Json的格式化校验网址:链接
示例:
这里用到的是Newtonsoft的API,需要下载ddl(官网链接),将下载的包放入Assets任意子目录下,通过引入命名空间 using Newtonsoft.Json; 即可使用
以下为早前通过Json文档读取UI界面类型的简单案例:
[
{"panelType":"MainMenu",
"path":"UIPanels/MainMenuPanel"},
{"panelType":"Battle",
"path":"UIPanels/BattlePanel"},
{"panelType":"Skill",
"path":"UIPanels/SkillPanel"},
{"panelType":"Knapsack",
"path":"UIPanels/KnapsackPanel"},
{"panelType":"Setting",
"path":"UIPanels/SettingPanel"},
{"panelType":"Task",
"path":"UIPanels/TaskPanel"}
]
/// <summary>
/// 解析UI界面Json文档
/// </summary>
private void ParseUIPanelJson()
{
panelPathDict = new Dictionary<UIPanelType, string>();
//首先读取Resources文件夹下的Json文档
TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
//解析Json文档,用这个库的好处就是能直接反序列化成对象列表,操作简便
List<UIPanelInfo> infoList = JsonConvert.DeserializeObject<List<UIPanelInfo>>(ta.text);
//存入字典保存
foreach (var info in infoList)
{
panelPathDict.Add(info.panelType, info.path);
}
}
三. XML
XML一样可以存储复杂数据对象,相较于Json优点是可读性良好,但效率较低,适合大量的数据配置
第一步要先写XML模板文件,一个怪物的配置模板示例:(必须写两个一样的结点Excel才能映射)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
</root>
第二步:
1、将模板文件导入Excel(只能是微软Excel,WPS没有此功能,如无法使用微软Excel,请自行编辑XML文件)在Excel中打开自定义菜单:文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项卡。
2、在开发工具面板里:XML-源-XML映射-添加模版文件
3、选中源面板里的模版,映射到表格里。
4、在Excel中填充数据数据所有类型,最终都会转化为字符串类型
5、从Excel中导出附带数据的xml文件在开发工具面板里:XML-导出
填充数据后的Excel表格示例:
第三步:
将XML文件存放至Assets\StreamingAssets目录下(StreamingAssets第一次需要自行创建文件夹)
第四步:
使用脚本加载XML文件
public TextAsset TestXMLAsset;
public XmlDocument TestXMLDocument;
public XmlNodeList TestXMLNodeList;
public void Start()
{
//加载物品信息XML
string TestXMLPath = Path.Combine(Application.streamingAssetsPath, "XMLMain/test.xml");
if (!File.Exists(TestXMLPath))
{
print("文件不存在:" + TestXMLPath);
}
else
{
print("文件存在:" + TestXMLPath);
TestXMLDocument = new XmlDocument();
//读取物品信息XML
TestXMLDocument.Load(TestXMLPath);
//解析获取XML的Tag为列表
TestXMLNodeList = TestXMLDocument.GetElementsByTagName("resPath");
//从XmlElement里获取名称为"resPath"的数据
print("XML读取第1个物品图片资源信息" + TestXMLNodeList[0].InnerText);
}
}
|