Очень странный баг при работе с XML файлом. Как его исправить?

Рейтинг: 0Ответов: 0Опубликовано: 30.04.2023

Регулярно работаю с 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

Что это за баг и как его исправить?

Ответы

Ответов пока нет.