Очень странный глюк при работе с xml файлом?

Общие вопросы о Unity3D

Очень странный глюк при работе с xml файлом?

Сообщение EIvanov 29 апр 2023, 12:54

В рабочем примере возник странный глюк, предположительно, с чтением/записью xml файла.
Поэтому, я создал тестовый пример, код которого привел ниже.

Глюк заключается в том, что
в режиме запуска сцены (ну когда тестируем сцену - кнопка плей вверху) текст на сцене изменяется только при переключении экрана юнити (alt+tab), на любое другое приложение - блокнот, браузер, что угодно
в режиме билда или запуска игры текст вообще не изменяется

Вот видео, где я показываю как переключаюсь с экрана юнити на блокнот и только тогда текст на сцене изменяется.


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

https://youtu.be/MCLSbT-cj1k
[youtube]https://youtu.be/MCLSbT-cj1k[/youtube]

Файлы

XMLReader - читает настройки из xml
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;

public static class XMLReader
{

public static string GetXMLValue(string pathToXMLFile, string NodeName1, string NodeName2)
{  
// Загрузить xml файл из папки Resources (передаем путь и название файла без расширения xml).
TextAsset textAsset = Resources.Load<TextAsset>(pathToXMLFile);

// Загрузить XML-документ из текстового файла.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(textAsset.text);

// Найти узел.
XmlNode node = xmlDoc.SelectSingleNode(NodeName1+"/"+NodeName2);
string nodeValue = node.InnerText;

return nodeValue;

}
}



XMLWriter пишет настройки в xml
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
using System.IO;


public static class XMLWriter
{
public static void SetXMLValue(string pathToXMLFile, string nodeName1, string nodeName2, string nodeName2Value)
{  
// Загрузить xml файл из папки Resources (передаем путь и название файла без расширения xml).
TextAsset textAsset = Resources.Load<TextAsset>(pathToXMLFile);

// Загрузить XML-документ из текстового файла.
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);
}

}



DataHolder - вызывает XMLReader, читает настройки из xml и хранит их в своих полях.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class DataHolder
{
public static string gameLanguage;


public static void UpdateData()
{      
try
{      
gameLanguage=XMLReader.GetXMLValue("GameSettings", "GameSettings", "game_language");
}
catch
{
Debug.LogError("Возникло исключение!");
}

Debug.Log("Вызов метода UpdateData в DataHolder. Поле gameLanguage="+gameLanguage);
}
}



Скрипт на сцене - обрабатывающий клик по кнопке, для чтения/записи в xml
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SetGameLanguageScript : MonoBehaviour
{


private GameObject gameLanguageTextObject;
private Text gameLanguageText;


private void Start()
{
DataHolder.UpdateData();
gameLanguageTextObject = GameObject.Find("GameLanguageText");
gameLanguageText = gameLanguageTextObject.GetComponent<Text>();
Debug.Log("Старт сцены DataHolder.gameLanguage="+DataHolder.gameLanguage);
}


private void Update()
{
//DataHolder.UpdateData();
gameLanguageText.text =DataHolder.gameLanguage;
//Debug.Log(DataHolder.gameLanguage);
}



public void ReadXMLButtonButtonClick()
{
DataHolder.UpdateData();
gameLanguageText.text =DataHolder.gameLanguage;
Debug.Log("Клик по кнопке чтения из XML DataHolder.gameLanguage="+DataHolder.gameLanguage);
}



public void WriteRUXMLButtonButtonClick()
{
XMLWriter.SetXMLValue("GameSettings", "GameSettings", "game_language","RU");
Debug.Log("Клик по кнопке записи значения RU в XML");
}
 
 
public void WriteENGMLButtonButtonClick()
{
XMLWriter.SetXMLValue("GameSettings", "GameSettings", "game_language","ENG");
Debug.Log("Клик по кнопке записи значения ENG в XML");
}
 

}
 
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Очень странный глюк при работе с xml файлом?

Сообщение 1max1 29 апр 2023, 14:14

Закрой полностью блокнот, возможно он блокирует чтение/запись для юнити.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Очень странный глюк при работе с xml файлом?

Сообщение EIvanov 30 апр 2023, 06:12

Закрой полностью блокнот, возможно он блокирует чтение/запись для юнити.

Пробовал - бесполезно. Ничего не помогает кроме - переключения с окна юнити на любое другое. И это очень странно.
Как и писал выше - создал тестовый пример с нуля. Три простых скрипта и вот такой странный глюк.

Чтение напрямую из XML , без Dataholder также вызывает такую же ошибку.
Синтаксис:
Используется csharp
gameLanguageText.text =XMLReader.GetXMLValue("GameSettings", "GameSettings", "game_language");


----
Создал в этой же папке текстовый файл всё работает. Читает, пишет, выводит.
Синтаксис:
Используется csharp
WriteAllText(filePath, "RU");


То есть с txt работает, c xml нет.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Очень странный глюк при работе с xml файлом?

Сообщение Tolking 01 май 2023, 18:56

1) Resources.Load<TextAsset>(pathToXMLFile); в билде не будет сохраняться
2) находи измененный файл в ресурсах, правой клавишей на него и делай реимпорт... Скорее всего поможет...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27