如何在运行时保存和更新“.xml”文件?

我正在开发一个游戏项目,我们将玩家收集的物品保存到 .xml 文件中,我们这样做是为了跟踪玩家的开发过程。例如,您要进入地牢杀死敌人。杀死敌人后,游戏会随机掉落物品,如果您想将该物品添加到库存中,只需单击它即可。这就是问题所在。将新项目保存到 xml 文档的功能工作正常,但如果我手动刷新 xml 页面或重新启动游戏,它只会添加收集的项目。(在这种情况下我们不希望)有什么方法或解决方法可以让我在游戏运行时更新 xml 文档并保存它?


我尝试使用“XmlTextWriter”类来解决该问题,但最终会从数据库中删除所有项目并开始再次插入所有项目。这让我思考性能。


这是将新项目保存到数据库的函数。“ContentDataCarrier”是包含有关项目的信息的类。(ID、名称、效果、售价等)


 public void AddItemToDatabase(ContentDataCarrier contentDataCarrier)

 {

            var databaseDocument = new XmlDocument();


            // Load the database XML document with the file path.

            // Note: We need to make sure if "AssetDatabase.GetAssetPath()" function also works at runtime. 

            databaseDocument.Load(AssetDatabase.GetAssetPath(_itemProgressDatabase));


            // Now create new nodes for each property that "contentDataCarrier" has.

            XmlNode itemWrapperNode = databaseDocument.CreateElement("item");


            XmlNode idNode = databaseDocument.CreateElement("ID");

            idNode.InnerText = LastAddedItemID++.ToString();


            XmlNode levelNode = databaseDocument.CreateElement("level");

            levelNode.InnerText = contentDataCarrier.Level.ToString();


            XmlNode nameNode = databaseDocument.CreateElement("name");

            nameNode.InnerText = contentDataCarrier.Name; 


            XmlNode descriptionNode = databaseDocument.CreateElement("description");

            descriptionNode.InnerText = contentDataCarrier.Description;


            XmlNode spriteNode = databaseDocument.CreateElement("sprite");

            spriteNode.InnerText = "null"; // Somehow find a way to save sprite id and load it into game.


}


我希望在运行时将玩家收集的项目保存到 xml 文件中。


ABOUTYOU
浏览 141回答 1
1回答

炎炎设计

使用 XMLSerializer,我可以随时从“.xml”文件中保存和获取数据。using System.Collections.Generic;using System.IO;using System.Xml.Serialization;using UnityEngine;[DisallowMultipleComponent]internal sealed class XMLManager : MonoBehaviour{    public ItemDatabase ItemDatabase = new ItemDatabase();    public void SaveItem()    {        var xmlSerializer = new XmlSerializer(typeof(ItemDatabase));        var fileStream = new FileStream(Application.dataPath + "/StreamingFiles/XML/Items.xml", FileMode.Create);        xmlSerializer.Serialize(fileStream, ItemDatabase);        fileStream.Close();    }    public void LoadItem()    {        var xmlSerializer = new XmlSerializer(typeof(ItemDatabase));        var fileStream = new FileStream(Application.dataPath + "/StreamingFiles/XML/Items.xml", FileMode.Open);        ItemDatabase = xmlSerializer.Deserialize(fileStream) as ItemDatabase;        fileStream.Close();    }}[System.Serializable]public sealed class Item{    public string Name;    public string Description;    public int Damage;    public Source Element;    public enum Source { Fire, Water, Air };}[System.Serializable]public sealed class ItemDatabase{    public List<Item> items = new List<Item>();}这是适合我的代码。希望这能帮助那里的人。
打开App,查看更多内容
随时随地看视频慕课网APP