Синтаксис для правильного импорта XML в Unity - PullRequest
0 голосов
/ 07 января 2019

Я должен импортировать файл XML в Unity, но не могу понять правильный синтаксис.

Итак, я создал Road Class и RoadContainer Class, как показано в этой статье: http://wiki.unity3d.com/index.php/Saving_and_Loading_Data:_XmlSerializer

using System.Xml.Serialization;
using System.Xml;

public class Road {
[XmlAttribute("name")]
public string name;
[XmlAttribute("id")]
public float id;
[XmlAttribute("junction")]

Это контейнерный класс

using System.Xml;
using System.IO; 

[XmlRoot("OpenDrive")]
public class RoadsContainer {

[XmlArray("Roads")]
[XmlArrayItem("Road")]
public List<Road> roads = new List<Road>();

public static RoadsContainer Load(string path){

var serializer = new XmlSerializer(typeof(RoadsContainer));
using (var stream = new FileStream(path, FileMode.Open))
{
 return serializer.Deserialize(stream) as RoadsContainer;
}
}

Я хочу добавить что-то подобное в класс:

<OpenDrive>
  <Raods>
    <Road name="" ... >
      <link>
         <successor elementId="1" elementType="Road" />
      </link>
      <planview>
         <geometry attribute1 attribute2 ...>
         <line/>
         </geometry>
     </planview>
   </Road>
   <Road>
   </Road>
 </Roads>
</OpenDrive>

Я пытался добавить «ссылку» в качестве другого класса с XmlElement «successor» и XmlElementAttributes (не в этом коде, а в другом), но ничего не получалось

public class link {
[XmlElement("successor")]
public float elementId;
public string elementType;
public string contactPoint; 
}    

Было бы неплохо, если бы кто-нибудь помог мне с кодом или ссылкой на хорошую документацию по синтаксису porper XML в Unity c #.

1 Ответ

0 голосов
/ 07 января 2019

У вас должен быть выделенный класс для каждого XmlElement (вложенного тега), который далее вложен.

Так что-то вроде

[Serializable]
public class Road 
{
     [XmlAttribute] public string name;
     [XmlAttribute] public float id;

     // ...

     [XmlElement] public Link link; 
     [XmlElement] public PlanView planview;
}

[Serializable]
public class Link {
    [XmlElement] public Successor successor;
}    

[Serializeable]
public class Successor
{
   [XmlAttribute] public string elementId;
   [XmlAttribute] public string elementType;
}

[Serializable]
public class PlanView
{
    [XmlElement] public Geometry geometry;
}

[Serializable]
public class Geometry 
{
    [XmlAttribute] public <type> Attribute1;
    [XmlAttribute] public <type> Attribute2;

    [XmlElement] public Line line;
}

[Seializable]
public class Line
{
    // etc ...
}

Обратите внимание, что вы можете пропустить определение имени тега (XmlAttribute("xyz")), если тег в файле XML должен совпадать с именем переменной. Он нужен только в том случае, если тег в файле не соответствует имени переменной в скрипте.

Вам также следует рассмотреть возможность создания всех этих классов XML [Serializable], чтобы вы могли легко просматривать и редактировать значения в Инспекторе в Unity. Облегчает объединение исходных данных XML, которые вам нужны, в другом скрипте, например. как

public class XmlManager : MonoBehaviour
{
    public RoadsContainer container = new RoadsContainer;
}

Конечно, вы должны реализовать что-то для записи и чтения в этот скрипт, чтобы иметь возможность сохранять и загружать данные из редактора.

Также обратите внимание, что это c # => Их не нужно размещать в одном файле, но вы можете иметь один сценарий для каждого класса, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...