将线渲染器的所有点作为对象存储在 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);
}
我在将 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);
}