举个 本地XML例子,比如简洁的书籍阅读系统(楼主太懒了):
第一步:我们先定义一本书的基础属性
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 基础属性
/// </summary>
public class BookItemInfo {
//书籍id
public int Id;
//阅读进度
public int Schedule;
//书籍激活状态
public int ActiveState;
}
第二步:我们有很多本书,就需要创建一个字典,来存储每本书的 属性(其它 定义也都可以,比如玩家基础状况属性,就不需要字典了,直接定义就OK了)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 书籍集合信息
/// </summary>
public class ReadingInfo {
//书籍信息
public Dictionary<int, BookItemInfo> BookInfoList = new Dictionary<int, BookItemInfo> ();
}
第三步:在定义一下 XML 的存储路径(怎么合适就怎么存)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
/// <summary>
/// 定义
/// </summary>
public static class ReadingConsts {
//存储地址
public static readonly string ArchiveDir = Application.dataPath + "/ReadingData";
}
第四步:创建 本地保存于加载
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEngine;
/// <summary>
/// 保存数据
/// </summary>
public class ReadingSave : MonoBehaviour {
private static string[] nodeNames_Book = new string[] { "ID", "Schedule", "ActiveState" };
private static List<int> nodeValue = new List<int> ();
/// <summary>
/// 保存数据
/// </summary>
/// <param name="info"></param>
public static void PlaySave (ReadingInfo info) {
if (info != null)
if (!File.Exists (ReadingConsts.ArchiveDir)) {
//创建XML
XmlDocument xml = new XmlDocument ();
//创建最上一层的节点。
XmlElement root = xml.CreateElement ("ReadingData");
XmlElement item;
item = xml.CreateElement ("Reading");
if (info.BookInfoList != null)
foreach (BookItemInfo book in info.BookInfoList.Values) {
nodeValue.Clear ();
nodeValue.Add (book.Id);
nodeValue.Add (book.Schedule);
nodeValue.Add (book.ActiveState);
XmlElement magicItem = xml.CreateElement ("BookItem");
for (int i = 0; i < nodeNames_Book.Length; i++) {
XmlElement element = xml.CreateElement (nodeNames_Book[i]);
element.InnerText = nodeValue[i].ToString ();
magicItem.AppendChild (element);
}
item.AppendChild (magicItem);
}
root.AppendChild (item);
xml.AppendChild (root);
xml.Save (ReadingConsts.ArchiveDir + ".xml");
}
}
/// <summary>
/// 加载数据
/// </summary>
/// <returns></returns>
public static ReadingInfo PlayLoad () {
if (File.Exists (ReadingConsts.ArchiveDir + ".xml")) {
//创建xml
XmlDocument xml = new XmlDocument ();
//加载
xml.Load (ReadingConsts.ArchiveDir + ".xml");
ReadingInfo info = new ReadingInfo ();
try {
XmlNodeList nodeList = xml.GetElementsByTagName ("ReadingData");
nodeList = xml.GetElementsByTagName ("BookItem");
if (nodeList.Count != 0)
for (int i = 0; i < nodeList.Count; i++) {
int k = 0;
BookItemInfo item = new BookItemInfo ();
item.Id = int.Parse (nodeList[i].ChildNodes[k++].InnerText);
item.Schedule = int.Parse (nodeList[i].ChildNodes[k++].InnerText);
item.ActiveState = int.Parse (nodeList[i].ChildNodes[k++].InnerText);
info.BookInfoList.Add (item.Id, item);
}
} catch (Exception e) {
Debug.Log (e.Message);
}
return info;
} else {
return null;
}
}
}
第五步 :创建一个存档管理,用于初始化加载及保存进度(如果是联网,那关于加载,可以用传参等形式,接收服务器下发数据,更新数据等等,就不说了)。
using System.Collections;
using System.Collections.Generic;
using Framework;
using UnityEngine;
/// <summary>
/// 书籍存档管理
/// </summary>
/// <typeparam name="BookSaveMagaer"></typeparam>
public class BookSaveMagaer : MonoSingleton<BookSaveMagaer> {
//书籍信息
public ReadingInfo bookInfo;
//关卡数据
ReadingLevelData levelData = null;
/// <summary>
/// 初始化
/// </summary>
public void Init () {
if (bookInfo == null) {
bookInfo = ReadingSave.PlayLoad ();
if (bookInfo != null) {
// if (bookInfo.BookInfoList != null) {
// Debug.Log ("存档ID有误,可能是旧版本,重置存档");
// bookInfo = null;
// }
} else {
Debug.Log ("存档ID有误,可能是旧版本,重置存档");
bookInfo = null;
}
}
if (bookInfo == null) {
//如果没有存档xml,就创建一个
ResetLogin ();
}
}
/// <summary>
/// 初始化配置
/// </summary>
public void ResetLogin () {
Debug.Log ("初始化配置");
bookInfo = new ReadingInfo () {
BookInfoList = new Dictionary<int, BookItemInfo> () {
//自定义每本书的ID,进度,及激活状态
{ 1024, new BookItemInfo () { Id = 1024, Schedule = 0, ActiveState = 0 } },
{ 1026, new BookItemInfo () { Id = 1026, Schedule = 0, ActiveState = 0 } },
{ 1027, new BookItemInfo () { Id = 1027, Schedule = 0, ActiveState = 0 } },
{ 1028, new BookItemInfo () { Id = 1028, Schedule = 0, ActiveState = 0 } },
}
};
Save ();
}
/// <summary>
/// 本地保存数据
/// </summary>
public void Save () {
ReadingSave.PlaySave (bookInfo);
}
/// <summary>
/// 加载关卡数据
/// </summary>
/// <param name="Data">关卡数据</param>
public void LoadLevelData (ReadingLevelData Data) {
levelData = Data;
}
/// <summary>
/// 加载书签
/// </summary>
public void loadBookmark () {
if (bookInfo.BookInfoList.ContainsKey (levelData.ID)) {
Debug.Log ("书籍ID:" + levelData.ID);
Debug.Log ("书籍进度:" + bookInfo.BookInfoList[levelData.ID].Schedule);
if (bookInfo.BookInfoList[levelData.ID].Schedule > 0) {
ReadingMagaer.Instance.HighestRecord.text = bookInfo.BookInfoList[levelData.ID].Schedule.ToString ();
Debug.Log ("加载书签");
} else {
Debug.Log ("加载书签失败");
}
}
}
/// <summary>
/// 保存书签
/// </summary>
public void SaveBookmark () {
BookItemInfo temp;
if (bookInfo.BookInfoList.TryGetValue (levelData.ID, out temp)) {
temp.Schedule = ReadingMagaer.Instance.SquareHeight;
ReadingSave.PlaySave (bookInfo);
Debug.Log ("保存书签-成功");
} else {
Debug.Log ("保存书签-失败");
}
}
}
第六步 :来杯鲜榨白开水,补充下水分
补充:关卡数据是本人项目中的书籍文件配置,与基础属性类差不多一样,用来验证所选择的书籍,并获得对应的参数。