Example #1
0
        internal void WriteElement(string name, object obj, Type elementType)
        {
            try
            {
                if (obj == null)
                {
                    writer.WriteStartElement(name);
                    writer.WriteAttributeString("Null", ToString(true));
                    writer.WriteEndElement();
                    return;
                }
                if (obj is UnityEngine.Object && (obj as UnityEngine.Object) == null)
                {
                    writer.WriteStartElement(name);
                    writer.WriteAttributeString("Null", ToString(true));
                    writer.WriteEndElement();
                    return;
                }
                if (obj is Bounds)
                {
                    Bounds b = (Bounds)obj;
                    writer.WriteStartElement(name);
                    writer.WriteElementString("c", ToString(b.center));
                    writer.WriteElementString("e", ToString(b.extents));
                    writer.WriteEndElement();
                    return;
                }
                if (obj is String)
                {
                    writer.WriteElementString(name, obj.ToString());
                    return;
                }
                if (obj is float)
                {
                    writer.WriteElementString(name, ToString((float)obj));
                    return;
                }
                if (obj is Double)
                {
                    writer.WriteElementString(name, ToString((Double)obj));
                    return;
                }
                if (obj is Boolean)
                {
                    writer.WriteElementString(name, ToString((Boolean)obj));
                    return;
                }
                if (obj is bool[])
                {
                    writer.WriteElementString(name, ToString(obj as bool[], (b) => ToString(b)));
                    return;
                }
                if (obj is int)
                {
                    writer.WriteElementString(name, obj.ToString());
                    return;
                }
                if (obj is int[])
                {
                    if (!obj.GetType().GetElementType().IsEnum)
                    {
                        writer.WriteElementString(name, ToString(obj as int[], (i) => ToString(i)));
                        return;
                    }
                }
                if (obj is List <int> )
                {
                    writer.WriteElementString(name, ToString((obj as List <int>).ToArray(), (i) => ToString(i)));
                    return;
                }
                if (obj is Guid)
                {
                    writer.WriteElementString(name, ToString((Guid)obj));
                    return;
                }
                if (obj is Vector2)
                {
                    writer.WriteElementString(name, ToString((Vector2)obj));
                    return;
                }
                if (obj is Vector2[])
                {
                    writer.WriteElementString(name, ToString(obj as Vector2[], (v) => ToString(v)));
                    return;
                }
                if (obj is Vector3)
                {
                    writer.WriteElementString(name, ToString((Vector3)obj));
                    return;
                }
                if (obj is Vector3[])
                {
                    writer.WriteElementString(name, ToString(obj as Vector3[], (v) => ToString(v)));
                    return;
                }
                if (obj is Vector4)
                {
                    writer.WriteElementString(name, ToString((Vector4)obj));
                    return;
                }
                if (obj is Vector4[])
                {
                    writer.WriteElementString(name, ToString(obj as Vector4[], (v) => ToString(v)));
                    return;
                }
                if (obj is Matrix4x4)
                {
                    writer.WriteElementString(name, ToString((Matrix4x4)obj));
                    return;
                }
                if (obj is Color)
                {
                    writer.WriteElementString(name, ToString((Color)obj));
                    return;
                }
                if (obj is Color[])
                {
                    writer.WriteElementString(name, ToString(obj as Color[], (c) => ToString(c)));
                    return;
                }
                if (obj is Rect)
                {
                    writer.WriteElementString(name, ToString((Rect)obj));
                    return;
                }
                if (obj is LayerMask)
                {
                    writer.WriteElementString(name, ((LayerMask)obj).value.ToString());
                    return;
                }
                if (obj is AnimationClipCurveData)
                {
                    AnimationClipCurveData acd = obj as AnimationClipCurveData;
                    writer.WriteStartElement(name);
                    writer.WriteElementString("path", acd.path);
                    writer.WriteElementString("propertyName", acd.propertyName);
                    if (acd.type != null)
                    {
                        writer.WriteElementString("type", resolver.ResolveTypeName(acd.type.FullName));
                    }
                    if (acd.target != null)
                    {
                        WriteElement("target", acd.target.GetInstanceID());
                    }
                    WriteElement("curve", acd.curve);
                    writer.WriteEndElement();
                    return;
                }
                if (obj is IDictionary)
                {
                    writer.WriteStartElement(name);
                    foreach (DictionaryEntry item in (obj as IDictionary))
                    {
                        writer.WriteStartElement("Item");
                        WriteElement("Key", item.Key);
                        WriteElement("Value", item.Value);
                        writer.WriteEndElement();
                    }
                    writer.WriteEndElement();
                    return;
                }
                if (obj is Material[])
                {
                    Material[] objArr = obj as Material[];
                    writer.WriteStartElement(name);
                    foreach (Material mat in objArr)
                    {
                        WriteElement("material", mat);
                    }
                    writer.WriteEndElement();
                    return;
                }
                if (obj is Material)
                {
                    WriteMaterial(name, obj as Material);
                    return;
                }
                if (obj is AudioClip)
                {
                    AudioClip audio = obj as AudioClip;
                    if (audio == null)
                    {
                        return;
                    }
                    writer.WriteElementString(name, audio.name);
                    assetHelper.ExportAudio(audio);
                    return;
                }

                if (obj is Texture2D)
                {
                    writer.WriteStartElement(name);
                    if ((obj as Texture2D) == null)
                    {
                        writer.WriteAttributeString("Null", ToString(true));
                    }
                    else
                    {
                        writer.WriteElementString("id", (obj as Texture2D).GetInstanceID().ToString());
                        if ((obj as Texture2D).name == "Default-Particle")
                        {
                            writer.WriteElementString("name", "Default-Particle");
                        }
                        else
                        {
                            writer.WriteElementString("name", Path.ChangeExtension(assetHelper.GetAssetName(obj as Texture2D), "").TrimEnd('.'));
                            assetHelper.ExportTexture(obj as Texture2D);
                        }
                    }
                    writer.WriteEndElement();
                    return;
                }
                if (obj is GameObject)
                {
                    GameObject go = (obj as GameObject);
                    writer.WriteStartElement(name);
                    if (obj == null || (go.GetInstanceID() == 0))
                    {
                        writer.WriteAttributeString("Null", ToString(true));
                    }
                    else
                    {
                        writer.WriteElementString("id", go.GetInstanceID().ToString());
                        writer.WriteElementString("isPrefab", ToString(true));
                        AddPrefab(go);
                    }
                    writer.WriteEndElement();
                    return;
                }
                if (obj is AnimationCurve)
                {
                    writer.WriteStartElement(name);
                    writer.WriteAttributeString("Type", resolver.ResolveObjectType(obj));
                    if (obj != null)
                    {
                        Components.AnimationCurveWriter acw = new Components.AnimationCurveWriter();
                        acw.Write(this, obj);
                    }
                    else
                    {
                        writer.WriteAttributeString("Null", ToString(true));
                    }
                    writer.WriteEndElement();
                    return;
                }

                if (obj is Component)
                {
                    Component theObject = (obj as Component);
                    writer.WriteStartElement(name);

                    if ((theObject != null) && (obj.GetType() != elementType))
                    {
                        writer.WriteAttributeString("Type", resolver.ResolveObjectType(obj));
                    }

                    if (theObject == null || !WriteComponent(theObject, true))
                    {
                        writer.WriteAttributeString("Null", ToString(true));
                        writer.WriteEndElement();
                        return;
                    }

                    AddPrefab(theObject);
                    writer.WriteEndElement();
                    return;
                }
                // Check if we have a Serializable array
                if (obj.GetType().IsArray)
                {
                    writer.WriteStartElement(name);
                    foreach (object mat in (Array)obj)
                    {
                        WriteElement("Item", mat);
                    }
                    writer.WriteEndElement();
                    return;
                }
                // Check if we have a List
                if (obj is IList)
                {
                    writer.WriteStartElement(name);
                    foreach (object item in (IList)obj)
                    {
                        WriteElement("Item", item);
                    }
                    writer.WriteEndElement();
                    return;
                }
                // Check if we have a Serializable class
                if (obj.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Length > 0 || (obj.GetType().IsValueType&& !obj.GetType().IsEnum))
                {
                    writer.WriteStartElement(name);
                    WriteMembers(obj, obj.GetType(), null);
                    writer.WriteEndElement();
                    return;
                }

                writer.WriteElementString(name, obj.ToString());
            }
            catch (Exception ex)
            {
                Debug.LogError("Exception when writing " + name + " with value " + obj + ": " + ex.Message + " (" + ex.GetType() + ")", obj as UnityEngine.Object);
                throw;
            }
        }