将线渲染器的所有点作为对象存储在 XML 文件中

Store line renderer's all points as a object in XML file

我在将 Line Renderer 的所有点作为单个对象存储在 XML 文件中时遇到问题。我想要做的是使用线条渲染器在空中绘制一些东西,并将该绘图作为一个点存储在 XML 文件中以重新创建它。除了每个点都变成单个对象而不是在单个对象下生成之外,我能够正确保存所有内容。下面是我的代码:

AirDrawObject.cs

using UnityEngine;
[System.Serializable]
public class AirDrawObject
{
    public string pointIndex;
    public Vector3 pointPosition;
}

XMLDataExporter.cs

public AirDrawObject newAirDrawObject;
public ObjectDatabase objectDB;

public void SaveFeedback(GameObject parentGameObject)
    {
        Transform[] childObjects = parentGameObject.transform.GetComponentsInChildren<Transform>();
         if (childObjects[i].gameObject.tag == "AirDraw")
            {
                LineRenderer lineRenderer = childObjects[i].gameObject.GetComponent<LineRenderer>();
                int count = lineRenderer.positionCount;
                int[] array = new int[count];
                for (int l = 0; l < array.Length; l++)
                {
                    newAirDrawObject = new AirDrawObject();
                    newAirDrawObject.pointIndex = "Point " + l.ToString();
                    newAirDrawObject.pointPosition = lineRenderer.GetPosition(l);
                    objectDB.airDrawObjectList.Add(newAirDrawObject);
                }
            }
     }

XML 文件:

<airDrawObjectList>
    <AirDrawObject>
      <point>Point 0</point>
      <pointPosition>
        <x>-0.0537847765</x>
        <y>0.03524115</y>
        <z>0.518784344</z>
      </pointPosition>
    </AirDrawObject>
    <AirDrawObject>
      <point>Point 1</point>
      <pointPosition>
        <x>-0.0537847765</x>
        <y>0.03524115</y>
        <z>0.518784344</z>
      </pointPosition>
    </AirDrawObject>
    <AirDrawObject>
      <point>Point 2</point>
      <pointPosition>
        <x>-0.0537847765</x>
        <y>0.03524115</y>
        <z>0.518784344</z>
      </pointPosition>
    </AirDrawObject>

预期结果:

 <AirDrawObject>
  <point>Point 1</point>
   <pointPosition>
     <x>-0.0537847765</x>
     <y>0.03524115</y>
     <z>0.518784344</z>
   </pointPosition>
  <point>Point 2</point>
  <pointPosition>
    <x>-0.0537847765</x>
    <y>0.03524115</y>
    <z>0.518784344</z>
  </pointPosition>
  <point>Point 3</point>
  <point>Point 4</point>
 </AirDrawObject>
<AirDrawObject>
  ....
</AirDrawObject>

谁能告诉我我做错了什么?

为什么不简单地让你的 class

[Serializable]
[XmlRoot("ObjectDatabase")]
public class ObjectDatabase
{
    [XmlArray("AirDrawList")]
    [XmlArrayItem("AirDraw")]
    public List<XmlAirDraw> AirDrawList = new List<XmlAirDraw>();
}

[Serializable]
public class XmlAirDraw
{
    [XmlArray("points")]
    [XmlArrayItem("point")]
    public List<Vector3> points = new List<Vector3>();
}

然后点赞收藏

public void SaveFeedback(GameObject parentGameObject)
{
    objectDb.AirDrawList.Clear();      

    var lines = parentGameObject.transform.GetComponentsInChildren<LineRenderer>(true);

    foreach (var line in lines)
    {
        if(!line.CompareTag("AirDraw")) continue;

        line.GetPositions(out var linePoints);
        var xmlInstance = new AirDrawInstance
        {
            points = linePoints;
        };  

        objectDb.AirDrawList.Add(newAirDrawObject);
     }
 }

请注意,我是在智能手机上打字,但我希望思路清晰,这应该会产生 XML 喜欢

<ObjectDataBase>
    <AirDrawList>
        <AirDraw>
            <points>
                <point>
                   <x>-0.0537847765</x>
                   <y>0.03524115</y>
                   <z>0.518784344</z>
                </point>
                <point>
                    <x>-0.0537847765</x>
                    <y>0.03524115</y>
                    <z>0.518784344</z>
                </point> 
                ...   
            </points>
        </AirDraw>
        <AirDraw>  
            <points>
                ...   
            </points>
        </AirDraw> 
        ...   
    </AirDrawList>
</ObjectDataBase>

所以我自己想通了。我已经更改了点和 airDrawPoint 的 class,如下所示。

AirDrawPoint.cs

[System.Serializable]
public class AirDrawPoint
{
    public string index;
    public float X;
    public float Y;
    public float Z;
}

AirDrawObject.cs

[System.Serializable]

public class AirDrawObject
{
    public List<AirDrawPoint> pointList = new List<AirDrawPoint>();
}

XMLDataExporter.cs

if (childObjects[i].gameObject.tag == "AirDraw")
            {
                newAirDrawObject = new AirDrawObject();
                LineRenderer lineRenderer = childObjects[i].gameObject.GetComponent<LineRenderer>();
                int count = lineRenderer.positionCount;
                int[] array = new int[count];
                for (int l = 0; l < array.Length; l++)
                {
                    point = new AirDrawPoint();
                    Vector3 position = lineRenderer.GetPosition(l);
                    point.index = "Point " + l.ToString();
                    point.X = position.x;
                    point.Y = position.y;
                    point.Z = position.z;
                    newAirDrawObject.pointList.Add(point);
                }
                objectDB.airDrawObjectList.Add(newAirDrawObject);
            }