为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ABOUTYOU 2023-07-09 15:14:49
我正在开发一个游戏项目,我们将玩家收集的物品保存到 .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 文件中。
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

使用 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>();

}

这是适合我的代码。


希望这能帮助那里的人。


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信