Exemplo n.º 1
0
    /// <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();
        }
    }
Exemplo n.º 2
0
    /// <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);
            }
        }
    }