2011-02-01 5 views
2

unity3dでXmlDocument関数を使用する際に考慮すべきことはありますか? 私はこの奇妙な問題を抱えています:XmlDocumentを使用する関数がAwake()またはOnGUI()から呼び出されると、その文書は正常に編集されます。しかし、ボタンイベントの内部から呼び出されたときには、イベントを厳しくする必要があります。ドキュメントを保存する前によく編集された文字列を取得します。ドキュメント自体を変更することはできません。ファイルを編集Unity XmlDocument関数が常に動作しない

機能(時々):

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

I)は、(右保存する前に、結果の文字列を印刷するときxmlDocument関数は、新しい項目を表示しますが、何とかxmlファイルは同じままです。 実行順序に関係する重要なものがありませんか?タイムアウトのようなもの?

答えて

1

、それが元のファイルを再度書いていました。

「Debug.Log」が吸う! 、この命令はcreateProfilesFile()関数への2番目の呼び出しを決して出力しませんでした。だから、ちょうど1行が欠落していました:

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(); 
} 
+0

を私はGUIのループ内でファイルIOを実行することをお勧めしません。ほとんどの場合、OnGUI呼び出しが複数回呼び出されたことに気が付いたので、何らかの形式のコルーチンを使用して関数を実行することをお勧めします。一般に、OnGUIコールで実際にGUIを描画していないものを実行することは決してありません。 –

関連する問題