/// <summary> /// Save all the savables /// </summary> /// <param name="blocking"> /// whether the opeartion of flushing the xml file to the disk is blocking. /// </param> public void Save(bool blocking = true) { var savables = FindObjectsOfType <MonoBehaviour>().OfType <ISavable>(); if (!savables.Any()) { return; } EnsureExistance(scenePath); if (SceneSavingStarted != null) { SceneSavingStarted(); } string filePath = Path.Combine(scenePath, SceneSaver.SavablesFileName); XmlDocument doc = new XmlDocument(); XmlElement rootElement = doc.CreateElement(SavablesDocumentElementTag); doc.AppendChild(rootElement); foreach (var savable in savables) { XmlElement containerElement = doc.CreateElement(SceneSaver.SavablesContainerElementTag); var attributes = containerElement.Attributes; var containerNameAttr = doc.CreateAttribute("name"); containerNameAttr.InnerText = savable.ToString(); attributes.Append(containerNameAttr); doc.DocumentElement.AppendChild(containerElement); XmlSavableStore store = new XmlSavableStore(doc, containerElement); savable.OnSave(store); } if (blocking) { SaveXmlDocumentBlocking(doc, filePath); } else { SaveXmlDocumentNonBlocking(doc, filePath); } if (SceneSavingEnded != null) { SceneSavingEnded(); } }
/// <summary> /// Load all the savables /// </summary> public void Load() { var savables = FindObjectsOfType <MonoBehaviour>().OfType <ISavable>(); if (!savables.Any()) { return; } EnsureExistance(scenePath); var filePath = Path.Combine(scenePath, SceneSaver.SavablesFileName); if (!File.Exists(filePath)) { return; } XmlDocument doc = new XmlDocument(); doc.Load(filePath); Dictionary <string, XmlElement> containerElements = new Dictionary <string, XmlElement>(); foreach (XmlElement container in doc.DocumentElement.ChildNodes) { string name = container.Attributes[0].InnerText; containerElements.Add(name, container); } foreach (var savable in savables) { XmlElement containerElement; if (containerElements.TryGetValue(savable.ToString(), out containerElement)) { XmlSavableStore store = new XmlSavableStore(doc, containerElement); savable.OnLoad(store); } } }