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

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Простая загрузка через xml
pixeyeДата: Среда, 18 Апреля 2012, 20:49 | Сообщение # 1
Red Winter Software
Сейчас нет на сайте
О сохранении можно почитать Тут

Загрузка в нашем случае будет мало чем отличаться от сохранения, это обратный процесс и не более.
Возьмем болванку xml для наглядности.

<Level>
<player position_x="4" position_y="5" position_z = "10" > </player>
<monster position_x="4" position_y="5" position_z = "10" > </monster>
</Level>

Создаем некий скрипт Loader.cs

В самом начале прописываем:

using UnityEngine;
using System;
using System.Collections.Generic;
using System.Xml;

В качестве переменной пропишем

public Vector3 playerPosition = new Vector3(0,0,0);

дальше методы

Code

void Awake(){     
LoadData();
}

void LoadData(){     

     string filepath = "data.xml";     
     XmlDocument xmlDoc = new XmlDocument ();     
     xmlDoc.Load(filepath);     

      XmlNodeList levelList = xmlDoc.GetElementsByTagName ("Level");         
                    foreach (XmlNode level in levelList)     
                          {
                       XmlNode  node = level.SelectSingleNode("player");
                       XmlAttributeCollection attr = node.Attributes;
                       string s1 = attr[0].Value;
                       float x_coord = System.Convert.ToSingle (s1);
                       s1 = attr[1].Value;
                       float y_coord = System.Convert.ToSingle (s1);
                       s1 = attr[2].Value;
                       float z_coord = System.Convert.ToSingle (s1);
                       playerPosition = new Vector3(x_coord,y_coord,z_coord);

                           }

}


Итак,
Code
XmlNodeList levelList = xmlDoc.GetElementsByTagName ("Level");  
Создаем список с элементами под тегом уровень. Это нужно для того чтобы при необходимости загружать все уровни разом. В нашем примере правда значение позиции игрока будет переписано много раз если уровней будет несколько. Это просто пример чтобы показать как все работает.

Code
foreach (XmlNode level in levelList)
- Прогоняем по списку.
Code
  XmlNode node = level.SelectSingleNode("player");
- Находим элемент "player".
Code
  XmlAttributeCollection attr = node.Attributes;
- коллекция атрибутов найденного объекта player.

Code
      
                       string s1 = attr[0].Value;
                       float x_coord = System.Convert.ToSingle (s1);
                       s1 = attr[1].Value;
                       float y_coord = System.Convert.ToSingle (s1);
                       s1 = attr[2].Value;
                       float z_coord = System.Convert.ToSingle (s1);


Загружаем значения с атрибутов и сразу добавляем их в наши временные переменные. Convert.ToSingle перегоняет значения во float. Это нужно так как изначально данные идут как текст.

Code
playerPosition = new Vector3(x_coord,y_coord,z_coord);


- назначаем позиции игрока новые значения из временных переменных.


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Четверг, 19 Апреля 2012, 19:45
Nekit_AutДата: Среда, 18 Апреля 2012, 22:16 | Сообщение # 2
The Dizziness - Man
Сейчас нет на сайте
pixeye, хммм... Ругается на "node"... и XmlAttributeCollection... Делал и загрузку и сохранение в одном скрипте...



Сообщение отредактировал Nekit_Aut - Среда, 18 Апреля 2012, 22:20
pixeyeДата: Среда, 18 Апреля 2012, 22:40 | Сообщение # 3
Red Winter Software
Сейчас нет на сайте
Quote (Nekit_Aut)
pixeye, хммм... Ругается на "node"... и XmlAttributeCollection... Делал и загрузку и сохранение в одном скрипте...


Выложи  полностью ошибку) я писал сразу сюда по памяти, мог накосячить


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Среда, 18 Апреля 2012, 23:52
Nekit_AutДата: Четверг, 19 Апреля 2012, 17:16 | Сообщение # 4
The Dizziness - Man
Сейчас нет на сайте
Их две...
Quote
Assets/MinMenu/MenuForGame.cs(20,22): error CS0103: The name `node' does not exist in the current context

Quote
Assets/MinMenu/MenuForGame.cs(21,52): error CS0103: The name `node' does not exist in the current context


pixeyeДата: Четверг, 19 Апреля 2012, 19:46 | Сообщение # 5
Red Winter Software
Сейчас нет на сайте
Исправил;-)

XmlNode перед node поставь) объявил переменную без типа;-)


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

nilremДата: Четверг, 19 Апреля 2012, 19:57 | Сообщение # 6
Просветленный разум
Сейчас нет на сайте
C xml можно работать проще. Пример(псевдокод):

Code

  public class Player
     {
         public string Name;
         public int PosX;
         public int PosY;
         public Player()
         {
             ;
         }
         public Player(string name,int x, int y)
         {
             Name = name;
             PosX=x;
             PosY=y;
         }
     }

Player hero = new Player("qwe",50,100);
         public void Save()
         {
             TextWriter tr = new StreamWriter("savefile");
             XmlSerializer sr = new XmlSerializer(hero.GetType());
             sr.Serialize(tr, hero);
             tr.Close();
          }

         public void Load()
         {
             Player p = new Player();
             XmlSerializer serializer = new XmlSerializer(p.GetType());
             StreamReader reader = new StreamReader("savefile");
             p = (Player)serializer.Deserialize(reader);
         }


Называется оно сериализация, для использования заюзать System.Xml.Serialization.
И нечего заморачиваться с внутренностями Xml.
Правда я не в курсе, будет ли оно работать в Юнити.


Windmill 2

WindMill 2D Game Engine
pixeyeДата: Четверг, 19 Апреля 2012, 20:30 | Сообщение # 7
Red Winter Software
Сейчас нет на сайте
Quote (nilrem)
Правда я не в курсе, будет ли оно работать в Юнити.


Сериализация в юнити работает, об этом отдельно можно написать. Спасибо, nilrem


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

Nekit_AutДата: Четверг, 19 Апреля 2012, 21:01 | Сообщение # 8
The Dizziness - Man
Сейчас нет на сайте
Quote (pixeye)
XmlNode перед node поставь) объявил переменную без типа;-)

ok) Спасибо)


  • Страница 1 из 1
  • 1
Поиск:

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