正确将XML导入Unity的语法

时间:2019-01-07 16:38:24

标签: c# xml unity3d

我必须将XML文件导入Unity,但是无法找出正确的语法。

因此,我创建了Road类和RoadContainer类,如本文所示: 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和XmlElementAttributes的另一个类(不在此代码中,而在另一个代码中),但是没有任何作用

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

如果有人能帮助我提供一些代码或指向Unity c#中的porper XML语法的良好文档的链接,这将是很好的。

1 个答案:

答案 0 :(得分:0)

对于每个进一步嵌套的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 ...
}

请注意,如果XML文件中的标记应与变量名相同,则可以跳过标记名定义(XmlAttribute("xyz"))。仅在文件中的标签未在脚本中使用变量名的情况下才需要它。

您还应该考虑制作所有这些XML类[Serializable],以便可以轻松地在Unity的Inspector中查看和编辑值。使在不同脚本中将所需的初始XML数据一起单击变得容易得多,例如喜欢

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

当然,您应该实现一些用于在脚本中进行读写的功能,以便能够从编辑器中保存和加载数据。

还要注意,这是c#=>不必将它们放在一个文件中,但是如果需要,您可以为每个类使用一个脚本。