Unity本地存储之XML存档

本文介绍了一种使用XML格式进行游戏数据存储和读取的方法。该方法通过遍历游戏中的目标位置和怪物类型等数据,将其转换为XML格式进行存储,并能够从XML文件中读取这些数据以恢复游戏状态。

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

  //XML:存档
    private void SaveByXml()
    {
        Data data = new Data();
        //创建XML文件的存储路径
        string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
        //创建XML文档
        XmlDocument xmlDoc = new XmlDocument();
        //创建根节点,即最上层节点
        XmlElement root = xmlDoc.CreateElement("data");
        //设置根节点中的值
        root.SetAttribute("name", "dataFile");

        //创建XmlElement
        XmlElement target;
        XmlElement targetPosition;
        XmlElement monsterType;

        //遍历data中存储的数据,将数据转换成XML格式
        for(int i = 0; i < data.livingTargetPositions.Count; i++)
        {
            target = xmlDoc.CreateElement("target");
            targetPosition = xmlDoc.CreateElement("targetPosition");
            //设置InnerText值
            targetPosition.InnerText = data.livingTargetPositions[i].ToString();
            monsterType = xmlDoc.CreateElement("monsterType");
            monsterType.InnerText = data.livingMonsterTypes[i].ToString();

            //设置节点间的层级关系 root -- target -- (targetPosition, monsterType)
            target.AppendChild(targetPosition);
            target.AppendChild(monsterType);
            root.AppendChild(target);
        }

        //设置射击数和分数节点并设置层级关系  xmlDoc -- root --(target-- (targetPosition, monsterType), shootNum, score)
        XmlElement shootNum = xmlDoc.CreateElement("shootNum");
        shootNum.InnerText = data.shootNum.ToString();
        root.AppendChild(shootNum);

        XmlElement score = xmlDoc.CreateElement("score");
        score.InnerText = data.score.ToString();
        root.AppendChild(score);

        xmlDoc.AppendChild(root);
        xmlDoc.Data(filePath);

        if(File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt"))
        {
            UIManager._instance.ShowMessage("保存成功");
        }
    }

 

  //XML:读档
    private void LoadByXml()
    {
        string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
        if(File.Exists(filePath))
        {
            Data data= new Data();
            //加载XML文档
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filePath);

            //通过节点名称来获取元素,结果为XmlNodeList类型
            XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
            //遍历所有的target节点,并获得子节点和子节点的InnerText
            if(targets.Count != 0)
            {
                foreach(XmlNode target in targets)
                {
                    XmlNode targetPosition = target.ChildNodes[0];
                    int targetPositionIndex = int.Parse(targetPosition.InnerText);
                    //把得到的值存储到data中
                    data.livingTargetPositions.Add(targetPositionIndex);

                    XmlNode monsterType = target.ChildNodes[1];
                    int monsterTypeIndex = int.Parse(monsterType.InnerText);
                    data.livingMonsterTypes.Add(monsterTypeIndex);
                }
            }
            
            //得到存储的射击数和分数
            XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");
            int shootNumCount = int.Parse(shootNum[0].InnerText);
            data.shootNum = shootNumCount;

            XmlNodeList score = xmlDoc.GetElementsByTagName("score");
            int scoreCount = int.Parse(score[0].InnerText);
            data.score = scoreCount;

            SetData(data);
            UIManager._instance.ShowMessage("");

        }
        else
        {
            UIManager._instance.ShowMessage("存档文件不存在");
        }
    }
 

Unity中,XML(Extensible Markup Language)可以作为一种简单的方式来进行游戏数据的存档与读档。这是因为XML结构化良好,易于理解和编辑,并且支持跨平台操作。以下是使用XMLUnity中实现存档与读档的一般步骤: 1. **创建XML文件**:首先,你可以创建一个XML文件,例如`GameData.xml`,其中包含需要存储的游戏对象属性、关卡信息等数据。 ```xml <Archive> <Character name="Player" health=100 strength=50 /> <Level id="1"> <Room x="0" y="0" width="100" height="100"> <!-- Room contents go here --> </Room> </Level> </Archive> ``` 2. **保存数据**:当你需要保存数据时,通常会在`OnApplicationSave()`这样的生命周期事件中,将游戏状态序列化到XML文件中。 ```csharp void OnApplicationSave() { string xmlData = SaveGameToXml(); // Write xmlData to the file "GameData.xml" } ``` 3. **读取数据**:在游戏开始或加载时,通过解析XML文件来重构游戏状态。 ```csharp string xmlFromFile = File.ReadAllText("GameData.xml"); Dictionary<string, object> gameData = LoadGameDataFromXml(xmlFromFile); // Access and initialize game objects using gameData ``` 4. **解析工具**:使用Unity的`System.Xml`库或其他第三方库如`TinyXML`来处理XML的读写操作。 ```csharp public Dictionary<string, object> LoadGameDataFromXml(string xml) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); return ParseXmlNode(xmlDoc.DocumentElement); // Your custom parsing logic } private string SaveGameToXml() { // Convert your game data to a dictionary or another serializable format var dataDict = new Dictionary<string, object>(); // ... fill dataDict with your game state ... return SerializeDictionaryToXml(dataDict); // Custom serialization function } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值