2

unity3d で XmlDocument 関数を使用する際に考慮すべきことはありますか? 私はこの奇妙な問題を抱えています: 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 ファイルは同じままです。実行順序に関連している可能性のある重要なものがありませんか? タイムアウトみたいなもの?

4

2 に答える 2

1

これは単なる推測ですが、これでうまくいくでしょうか?

// 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

于 2011-02-01T02:36:47.573 に答える
1

シーン 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();
}
于 2011-02-09T16:21:05.693 に答える