Функция Unity XmlDocument не всегда работает - PullRequest
2 голосов
/ 01 февраля 2011

Есть ли что-то, что следует учитывать при использовании функции XmlDocument в unity3d?У меня возникла странная проблема: когда функция, использующая XmlDocument, вызывается из Awake () или OnGUI (), документ успешно редактируется.Но когда он вызывается изнутри события кнопки, то есть, несмотря на то, что перед сохранением документа я получаю хорошо отредактированную строку, он не может изменить сам документ.

Функция, которая редактирует файл (иногда):

    public static void addTestProfile () {

            string path = Application.dataPath + "/Documents/Profiles.xml";
            Hashtable tempTable = new Hashtable();
            tempTable.Add("user", "chuck II");
            tempTable.Add("url", "funny");
            tempTable.Add("passwrod", "1234asdf");
            General.StoreProfile(tempTable, path);
        }


public static void StoreProfile(Hashtable profile, string path) {
        Debug.Log("profile to store name: " + profile["password"]);
        XmlDocument doc = new XmlDocument();
        doc.Load(profilesPath);

        XmlElement element = doc.CreateElement("Profile");

        XmlElement innerElement1 = doc.CreateElement("user");
        innerElement1.InnerText = profile["user"] as string;
        element.AppendChild(innerElement1);

        XmlElement innerElement2 = doc.CreateElement("url");
        innerElement2.InnerText = profile["url"] as string;
        element.AppendChild(innerElement2);

        XmlElement innerElement3 = doc.CreateElement("password");
        innerElement3.InnerText = profile["password"] as string;
        element.AppendChild(innerElement3);
        doc.DocumentElement.AppendChild(element);

        doc.Save(profilesPath);
        Debug.Log(doc.InnerXml);
    }

Я создал новый проект только для проверки этой проблемы, файл не редактируется при вызове непосредственно перед вызовом Application.loadLevel ();

Здесь он работает хорошо исам файл редактируется:

void OnGUI () {
         General.addTestProfile();  // General is the singleton class that contains the function implementation
}

Но кое-как, как это не работает:

// GUI Save btn
if (GUI.Button(new Rect(255, 20, 60, 35), "Add")) {
      General.addTestProfile();   // General is the singleton class that contains the function implementation
      Application.LoadLevel(0);
}

Когда я печатаю результирующую строку прямо перед функцией save () xmlDocument, она показываетновый элемент, но каким-то образом XML-файл остается прежним.Я что-то упустил, может быть, что-то связанное с порядком исполнения?Что-то вроде тайм-аута?

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Когда он вернулся к сцене 1, он переписывал исходный файл.

"Debug.Log" - отстой! эта инструкция никогда не печатала второй вызов функции createProfilesFile (). Так что пропала только одна строка:

if (System.IO.File.Exists(profilesPath)) return;

Здесь функция createProfilesFile ():

public static void CreateProfilesFile (string path) {
    Debug.Log("create init");      // This line wasn't called the second time ... 

    if (System.IO.File.Exists(path)) return;

    // Create a new file specified path
    XmlTextWriter textWriter = new XmlTextWriter(path,null);
    // Opens the document
    textWriter.WriteStartDocument();
    // Write comments
    textWriter.WriteComment("This document contains the profiles that have been created.");
    textWriter.WriteStartElement("Profiles");
        textWriter.WriteStartElement("Profile");
            textWriter.WriteStartElement("user");
                textWriter.WriteString("foo user");
            textWriter.WriteEndElement();
            textWriter.WriteStartElement("url");
                textWriter.WriteString("foo url");
            textWriter.WriteEndElement();       
            textWriter.WriteStartElement("password");
                textWriter.WriteString("foo password");
            textWriter.WriteEndElement();
        textWriter.WriteEndElement();
    textWriter.WriteEndElement();
    // Ends the document.
    textWriter.WriteEndDocument();
    // close writer
    textWriter.Close();
}
1 голос
/ 01 февраля 2011

это просто дикое предположение, но может ли это сработать?

// PSEUDOCODE
bool pressed

function OnGUI()
   if GUI.Button then
      pressed = true
   end if
   if pressed then
      addTestProfile();
   end if
end function

Я получил помощь по этой ссылке: http://answers.unity3d.com/questions/9538/new-to-unity-3d-gui-button-help-needed-please

...