Unity XML存储之相同元素多数据保存及加载的实现

本文介绍了一个基于Unity的简单书籍阅读系统实现方案,包括定义书籍属性、使用XML进行数据存储与读取,以及如何管理和更新阅读进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举个 本地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 ("保存书签-失败");
		}
	}
}

第六步 :来杯鲜榨白开水,补充下水分

 

补充:关卡数据是本人项目中的书籍文件配置,与基础属性类差不多一样,用来验证所选择的书籍,并获得对应的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值