I’m trying to send a LineRenderer over the network with RPC calls. Since there is no way to get information out of a line renderer after it is created, I can’t just get the points and do something clever like converting them to a byte array and sending that. I thought about using an XmlSerializer to convert the data to a string and send that, but I’m getting an error when attempting to serialize:
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(LineRenderer));
The above throws an error:
InvalidOperationException: To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. UnityEngine.Transform does not implement Add(System.Object).
What I don’t understand is: at no point does LineRenderer inherit from UnityEngine.Transform. If you follow the inheritance it goes LineRenderer->Renderer->Component->UnityEngine.Object. None of these appear to implement the IEnumerable interface.
Does anyone wiser than I in the ways of C# know what’s going on here?
The compiler is complaining about the
transform property from LineRenderer
(inherited from Component). To use
XmlSerializer all public properties
and fields must be serializable, so I
think you will need to do it by hand.
That solves it - I wasn’t understanding what Unity was trying to tell me. It was having an issue with the inheritance of a variable within the class it was trying to serialize, not the class itself.
Unfortunately, there is no way to serialize a LineRenderer by hand, since you can’t get at any of the LineRenderer data (there are no public variables or methods that return variables). I was hoping that I could get around that issue by serializing, but it appears not.
There no private members to read the data either. But you could create a class that holds the data needed to recreate the LineRenderer: a list of points, two colors and two width values. Something like:
[Serializable]
public class LineRendererData
{
public List<Vector3> points;
public float startWidth, endWidth;
public Color startColor, endColor;
public void UpdateLineRenderer(LineRenderer renderer)
{
renderer.SetVertexCount(points.Count);
for(int i = 0; i < points.Count; ++i)
renderer.SetPosition(i, points*);*
renderer.SetColors(startColor, endColor); renderer.SetWidth(startWidth, endWidth); } } If you need to create the points on the Editor you could write a script that has a public LineRendererData field, executes on edit mode and calls UpdateLineRenderer when the data was changed.