Простая загрузка через 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) Спасибо)
|
|
| |