Unity XmlDocument功能并不总是有效

时间:2011-02-01 00:06:09

标签: c# xmldocument unity3d delayed-execution

在unity3d中使用XmlDocument函数时有什么需要考虑的吗? 我有这个奇怪的问题:当从Awake()或OnGUI()调用使用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);
}

当我在save()xmlDocument函数之前打印结果字符串时,它显示新项目但不知何故xml文件保持不变。 我错过了可能与执行顺序相关的重要内容吗?像超时这样的东西?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

当它跳回到场景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();
}