Суббота, 23 Ноября 2024, 00:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Работа с XML
shizofrenДата: Пятница, 11 Октября 2013, 20:40 | Сообщение # 1
Starting MS-DOS...
Сейчас нет на сайте
Руководство, как работать с 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); //Сохраняем этот файл с тем же путем, что и открывали.
}


Моя команда
SomeOneInTheMaskДата: Пятница, 11 Октября 2013, 22:17 | Сообщение # 2
Stranger
Сейчас нет на сайте
для новичков это будет полезно smile
но есть проблема этот и другие уроки уплывут вниз... поэтому я все-таки предлагаю чтобы сделать, что-то типа ветки, где будут все желающие постить уроки, и поставить модератора, чтобы он убирал бесполезные уроки, или хотя бы в этой ветке как-то отделить уроки от простых темам...


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
romgermanДата: Пятница, 11 Октября 2013, 23:55 | Сообщение # 3
старожил
Сейчас нет на сайте
Почему бы не Xml.Linq?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг