Руководство, как работать с XML файлами в движке Unity3D.
XML-файлы используются для хранения и структурирования данных. С помощью этих файлов легко ораганизовать файл настроек программы или файл сохранений. Для работы с этими файлами мы будем использовать класс XmlDocument. XML-файлы имеют свою структуру. Мы разберем работу с простейшей структурой:
Код
<section>
<attribute1 key1="value1" key2="value2" />
<attribute2 key1="value3" key2="value4" />
</section>
В секции section содержатся атрибуты attribute1 и attribute2. От теории к практике.
Наша задача: Написать функцию, которая загружает позицию игрока и позицию врага, а также может записать эти позиции в файл.
Чтение из файла
Для начала создадим файл сохранения. Он должен лежать в папке Assets вашего проекта. Содержимое файла такое:
Код
<section>
<save key="playerPos" posX="10" posY="20" posZ="100" />
<save key="enemyPos" posX="100" posY="20" posZ="10" />
</section>
В данном файле содержаться позиции игрока и врага. Все условно, данные характеристики были выбраны только для наглядности. Считаем их в переменную типа Vector3. Сначала подключаем к нашему классу нужные пространства имен:
Код
using System.Xml;
using System.IO;
Примечание: файл в данном примере назван config.xml, в вашем проекте он может быть назван как угодно и их может быть сколько угодно.
Код
Vector3 posPlayer, posEnemy; //Переменные для позиций игрока и врага (в них мы будем считывать данные)
string savesPath=Application.dataPath; //Переменная для пути к нашему файлу. Она равна полному пути к папке с данными (азетами)
savesPath+="/"; //Добавляем к переменной пути слеш
savesPath+="config.xml"; //И имя самого файла
if(File.Exists(savesPath)) //Если данный файл существует
{
XmlDocument xmlSave = new XmlDocument(); //Создаем переменную для нашего файла
xmlSave.Load(savesPath); //Открываем файл по пути, который мы разобрали выше
XmlNodeList nodeList = xmlSave.GetElementsByTagName("save"); //Получаем все атрибуты с тегом save
foreach(XmlNode node in nodeList) //Перебираем все атрибуты по отдельности
{
if(node.Attributes["key"].Value == "playerPos") //Если значение поля key будет равно playerPos (позиция игрока)
{
posPlayer.x = int.Parse(node.Attributes["posX"].Value); //Записываем значение X из поля posX как целочисленный
posPlayer.y = int.Parse(node.Attributes["posY"].Value); //Записываем значение Y из поля posY как целочисленный
posPlayer.z = int.Parse(node.Attributes["posZ"].Value); //Записываем значение Z из поля posZ как целочисленный
}
if(node.Attributes["key"].Value == "enemyPos") //Если значение поля key будет равно enemyPos(позиция врага)
{
posEnemy.x = int.Parse(node.Attributes["posX"].Value); //Записываем значение X из поля posX как целочисленный
posEnemy.y = int.Parse(node.Attributes["posY"].Value); //Записываем значение Y из поля posY как целочисленный
posEnemy.z = int.Parse(node.Attributes["posZ"].Value); //Записываем значение Z из поля posZ как целочисленный
}
}
}
Запись в XML-файл
Теперь запишем данные о игроке и враге в наш config.xml. Некоторые участки кода не расписываются, так как были расписаны в прошлом коде.
Код
Vector3 posPlayer, posEnemy; //Переменные для позиций игрока и врага (в них хранятся данные о позициях игрока и врага)
string savesPath=Application.dataPath;
savesPath+="/";
savesPath+="config.xml";
if(File.Exists(savesPath))
{
XmlDocument xmlSave = new XmlDocument();
xmlSave.Load(savesPath);
XmlNodeList nodeList = xmlSave.GetElementsByTagName("save");
foreach(XmlNode node in nodeList)
{
if(node.Attributes["key"].Value == "playerPos") //Если текущая перебираемая секция playerPos (позиция игрока)
{
node.Attributes["posX"].Value = posPlayer.x.ToString(); //Присваиваем полю posX переменную posPlayer.x
node.Attributes["posY"].Value = posPlayer.y.ToString(); //Присваиваем полю posY переменную posPlayer.y
node.Attributes["posZ"].Value = posPlayer.z.ToString(); //Присваиваем полю posZ переменную posPlayer.z
}
if(node.Attributes["key"].Value == "enemyPos") //Если текущая перебираемая секция enemyPos (позиция врага)
{
node.Attributes["posX"].Value = enemyPos.x.ToString(); //Присваиваем полю posX переменную enemyPos.x
node.Attributes["posY"].Value = enemyPos.y.ToString(); //Присваиваем полю posY переменную enemyPos.y
node.Attributes["posZ"].Value = enemyPos.z.ToString(); //Присваиваем полю posZ переменную enemyPos.z
}
}
xmlSave.Save(savesPath); //Сохраняем этот файл с тем же путем, что и открывали.
}