【发布时间】:2019-07-22 08:48:43
【问题描述】:
我正在开发一个游戏项目,我们将玩家收集的物品保存到 .xml 文件中,我们这样做是为了跟踪玩家的开发过程。例如,您要进入地牢杀死敌人。杀死敌人后,游戏会掉落随机物品,如果您想将该物品添加到您的库存中,只需单击它即可。这就是问题发生的地方。将新项目保存到 xml 文档的功能工作正常,但如果我手动刷新 xml 页面或重新启动游戏,它只会添加收集的项目。 (在这种情况下我们不希望这样做)我有什么方法或解决方法可以在游戏运行时更新 xml 文档并保存它?
我试图通过使用“XmlTextWriter”类来解决这个问题,但它最终从数据库中删除了所有项目并开始再次插入所有项目。 这让我想到了性能。
这是将新项目保存到数据库的功能。 “ContentDataCarrier”是包含项目信息的类。 (ID、名称、效果、SellPrice 等)
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.
XmlNode qualityNode = databaseDocument.CreateElement("quality");
qualityNode.InnerText = contentDataCarrier.Quality.ToString();
XmlNode slotTypeNode = databaseDocument.CreateElement("slotType");
slotTypeNode.InnerText = contentDataCarrier.SlotType.ToString();
XmlNode sellPriceNode = databaseDocument.CreateElement("sellPrice");
sellPriceNode.InnerText = contentDataCarrier.SellPrice.ToString();
XmlNode buyPriceNode = databaseDocument.CreateElement("buyPrice");
buyPriceNode.InnerText = contentDataCarrier.BuyPrice.ToString();
XmlNode sellableNode = databaseDocument.CreateElement("sellable");
sellableNode.InnerText = contentDataCarrier.Sellable.ToString();
XmlNode droppedFromEnemyNode = databaseDocument.CreateElement("droppedFromEnemy");
droppedFromEnemyNode.InnerText = contentDataCarrier.DroppedFromEnemy.ToString();
XmlNode itemEffectsListNode = databaseDocument.CreateElement("effects");
AddItemEffectsToDatabase(databaseDocument, itemEffectsListNode, contentDataCarrier.ItemEffects);
// Save the new item.
itemWrapperNode.AppendChild(idNode);
itemWrapperNode.AppendChild(levelNode);
itemWrapperNode.AppendChild(nameNode);
itemWrapperNode.AppendChild(descriptionNode);
itemWrapperNode.AppendChild(spriteNode);
itemWrapperNode.AppendChild(qualityNode);
itemWrapperNode.AppendChild(slotTypeNode);
itemWrapperNode.AppendChild(sellPriceNode);
itemWrapperNode.AppendChild(buyPriceNode);
itemWrapperNode.AppendChild(sellableNode);
itemWrapperNode.AppendChild(droppedFromEnemyNode);
itemWrapperNode.AppendChild(itemEffectsListNode);
databaseDocument.DocumentElement.InsertAfter(itemWrapperNode,
databaseDocument.DocumentElement.LastChild);
databaseDocument.Save(AssetDatabase.GetAssetPath(_itemProgressDatabase));
}
我希望在运行时将播放器收集的项目保存到 xml 文件中。
【问题讨论】:
-
使用:databaseDocument.Save(filename);
-
@derHugo 感谢您的回复,正在调查。
-
@jdweng 感谢您的回复,我已经在函数末尾添加了。
-
您还有问题吗?
标签: c# xml unity3d xmldocument