Domanda

C'è qualcosa da considerare quando si utilizza la funzione di documento XMLD in Unity3D? Sto avendo questo strano problema: quando la funzione che utilizza XMLDocument viene chiamata da Awake () o onGui () il documento viene modificato correttamente. Ma quando viene chiamato dall'interno di un evento di pulsante, evento duro ottengo una stringa ben modificata prima di salvare il documento, non è in grado di modificare il documento stesso.

Funzione che modifica il file (a volte):

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

Ho creato un nuovo progetto solo per testare questo problema, il file non viene modificato quando viene chiamato appena prima di chiamare Application.loadLevel ();

Qui funziona bene e il file stesso è modificato:

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

Ma in qualche modo come non funziona:

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

Quando stampano la stringa risultante proprio prima della funzione Save () XMLDocument, mostra il nuovo elemento ma in qualche modo il file XML rimane lo stesso. Mi manca qualcosa di importante forse legato all'ordine di esecuzione? Qualcosa di simile al timeout?

È stato utile?

Soluzione 2

Quando è tornato alla scena 1, stava riscrivendo il file originale.

"Debug.log" fa schifo! , questa istruzione non ha mai stampato la seconda chiamata per creare ProfilesFile (). Quindi mancava solo una riga:

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

Qui la funzione 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();
}

Altri suggerimenti

Questa è solo un'ipotesi selvaggia, ma potrebbe funzionare?

// PSEUDOCODE
bool pressed

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

Ho preso aiuto da questo link: http://answers.unity3d.com/questions/9538/new-to-unity-3d-gui-button-help-needed-lease

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top