Очень странный баг при работе с XML файлом. Как его исправить?
Регулярно работаю с PHP/Delphi/CSharp и такого бага там не встречал. Так что немного удивлен.
Unity 2021.3. - тестовый проект, специально созданный для тестирования этого бага.
Моя задача элементарна - записать в xml файл значение, а потом прочитать его оттуда.
Итого в проекте - одна сцена, 3 кнопки, 3 скрипта.
Скрипт XMLReader.cs - читает данные их XML файла
public static class XMLReader
{
public static string GetXMLValue(string pathToXMLFile, string NodeName1, string NodeName2)
{
TextAsset textAsset = Resources.Load<TextAsset>(pathToXMLFile);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(textAsset.text);
XmlNode node = xmlDoc.SelectSingleNode(NodeName1+"/"+NodeName2);
string nodeValue = node.InnerText;
return nodeValue;
}
}
XMLWriter.cs - пишет данные в XML файл
public static class XMLWriter
{
public static void SetXMLValue(string pathToXMLFile, string nodeName1, string nodeName2, string nodeName2Value)
{
TextAsset textAsset = Resources.Load<TextAsset>(pathToXMLFile);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(textAsset.text);
XmlNode node = xmlDoc.SelectSingleNode("/"+nodeName1+"/"+nodeName2);
node.InnerText = nodeName2Value;
File.WriteAllText(Application.dataPath + "/Resources/"+pathToXMLFile+".xml", xmlDoc.OuterXml);
}
}
Скрипт SetGameLanguageScript - обработчик, повешенный на кнопки для вызова скрипта записи и скрипта чтения.
public class SetGameLanguageScript : MonoBehaviour
{
private GameObject gameLanguageTextObject;
private Text gameLanguageText;
private void Start()
{
gameLanguageTextObject = GameObject.Find("GameLanguageText");
gameLanguageText = gameLanguageTextObject.GetComponent<Text>();
}
// Прочитать значение из XML файла и вывести его в текст на сцене.
public void ReadXMLButtonButtonClick()
{
gameLanguageText.text = XMLReader.GetXMLValue("GameSettings", "GameSettings", "game_language");
Debug.Log("Клик по кнопке чтения значения из XML");
Debug.Log("gameLanguageText.text="+gameLanguageText.text);
}
// Записать в XML файл значение RU.
public void WriteRUXMLButtonButtonClick()
{
XMLWriter.SetXMLValue("GameSettings", "GameSettings", "game_language","RU");
Debug.Log("Клик по кнопке записи значения RU в XML");
}
// Записать в XML файл значение ENG.
public void WriteENGMLButtonButtonClick()
{
XMLWriter.SetXMLValue("GameSettings", "GameSettings", "game_language","ENG");
Debug.Log("Клик по кнопке записи значения ENG в XML");
}
}
А теперь самое интересное.
Запуск сцены из редактора юнити:
- При нажатии кнопки записи в xml файл, а потом чтения из xml файла - ничего не происходит и текст не изменяется.
- При нажатии кнопки записи в xml файл и переключении с Unity на любое другое окно, приложение (калькулятор например) а потом чтения из xml файла - текст изменяется. Порядок что и когда нажали не важен - главное переключиться на другое окно или приложение.
Запуск сцены build and run или запуск готового exe файла приложения:
- смены текста не происходит, даже переключении на другое приложение. В xml файле значение не изменяется.
Антивирус отключал. В папке Assets\Resources размещал простой текстовый файл и писал туда, читал оттуда WriteAllText(filePath, "ENG");. Всё прекрасно работает - пишет и читает.
Видео с багом https://youtu.be/QAqa9YHL2Go
Что это за баг и как его исправить?