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; } }