在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文件保持不变。 我错过了可能与执行顺序相关的重要内容吗?像超时这样的东西?
答案 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();
}