Jump to content

Как извлечь текстовые данные из Xml (аналог TextAsset в Unity)


photo

Recommended Posts

Всем привет! 

Когда я занимался Unity, то разработал несложную систему диалогов для своей игры. Когда же настала пора перенести всё это дело в Unigine возникли сложности. Прошу уважаемое сообщество оказать посильную помощь)

Суть вопроса. В Unity я использовал вот такой код для извлечения текстовых файлов:

using UnityEngine;
using System.Xml.Serialization;
using System.IO;

[XmlRoot("dialog")]
public class Dialog_xml
{
    [XmlElement("node")]
    public Node[] nodes;

    public static Dialog_xml Load(TextAsset _xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Dialog_xml));
        StringReader reader = new StringReader(_xml.text);
        Dialog_xml dial = serializer.Deserialize(reader) as Dialog_xml;
        return dial;       
    }    
}

Потом в другом скрипте, при инициализации Start() использую так:  dialog = Dialog_xml.Load(xml_file); 

Далее. Получить данные из xml в Unigine нет ничего проще:

xml_dialog = new Xml();
            xml_dialog.Load("script/xml_file/dialog_0.xml");

Но как мне использовать их в готовом решении скрипта C# описанного выше? Вместо  TextAsset _xml я вставлял xml_dialog но это не работает, так как у него нет расширения  .text 

Возможно, в Unigine есть какой-то способ адаптировать скрипт Unity. 

Спасибо за любую помощь!

Link to comment

Добрый день, Yurickon!

Чтобы получить иерархию Вашего xml файла в виде одной строки, Вы можете использовать следующий метод GetFormattedSubTree() на вашей переменной xml_dialog. Для получения полной иерархии от корня, используйте этот метод без аргументов.

Но могу я узнать причину, по которой Вы хотели бы использовать данные из Xml в Вашем скрипте таким образом?

Загрузив xml данные так, как это сделали Вы:

xml_dialog = new Xml();
xml_dialog.Load("script/xml_file/dialog_0.xml");

Вы уже можете напрямую обращаться к элементам иерархии xml через переменную xml_dialog с помощью методов GetChild().

  • Like 1
Link to comment

Приветствую, moody_pooch!

Спасибо за всегда точный ответ! Да, проверил, действительно, метод GetFormattedSubTree() возвращает весть текст xml файла. Только что теперь мне с этим делать?)

2 hours ago, moody_pooch said:

Но могу я узнать причину, по которой Вы хотели бы использовать данные из Xml в Вашем скрипте таким образом?

Причина тривиальна. Хотел адаптировать код из Unity в UNIGINE с минимальными переделками. Но, боюсь, этого не произойдёт. Я уже сделал небольшую наработку с использованием прямого доступа к xml файлу. Но пока добился только добавления 2-х пунктов в списке диалогов. Это, собственно, один диалог и выход из окна диалога.  Это не есть хорошо. Добавить другие пункты меню проблематично. Надо точно определять callback для каждой кнопки и точно прописывать на ней строку диалога... Ещё та задачка. 

Спасибо за ответ!  Ну и как всегда скриншот того что получилось:

 

dialog_0.jpg

  • Like 1
Link to comment

Спасибо за скриншот! Как и раньше было интересно посмотреть, что у Вас получилось)

1 hour ago, Yurickon said:

Только что теперь мне с этим делать?)

Предполагалось, что это должно было решить проблему со следующей строкой: 

 StringReader reader = new StringReader(_xml.text);

_xml.text возвращает содержимое текстового ассета Unity (в данном случае xml файла) в виде строки string. Метод Xml.GetFormattedSubTree() также возвращает строку. Таким образом можно заменить _xml.text на xml_dialog.GetFormattedSubTree().

On 2/15/2023 at 6:36 PM, Yurickon said:

Но как мне использовать их в готовом решении скрипта C# описанного выше? Вместо  TextAsset _xml я вставлял xml_dialog но это не работает, так как у него нет расширения  .text 

Либо, если Вы больше нигде не используете xml_dialog кроме приведенного Вами выше скрипта, можно попробовать считывать содержимое файла методами C# (например, File.ReadAllText()) без использования Unigine класса Xml и уже полученную от этих методов строку подставлять в конструктор StringReader вместо _xml.text.

Link to comment

moody_pooch, спасибо за поддержку!

Поразобрался я тут со своими диалогами. Пришлось свой старый скрипт на Unity переоборудовать под UNIGINE.  Вот такая конструкция у меня в конечном итоге получилась. И она прекрасно работает!

public static Dialog_xml Load( Xml _xml)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Dialog_xml));
            StringReader reader = new StringReader(_xml.GetFormattedSubTree());
            Dialog_xml dial = serializer.Deserialize(reader) as Dialog_xml;
            return dial;      
        }  

Остался, правда еще один вопрос. Он как бы не точно по теме, но я думаю тут будет уместен. Систему диалогов я разработал. Вопрос: как сделать так, что бы при добавления диалога, полоска прокрутки автоматически смещалась вниз, что бы игрок мог прочитать последний диалог из истории? А так, приходится постоянно мышкой прогонять её вниз, что неправильно в данном случае...

На скриншоте, надеюсь, всё понятно.

 

dialog_1.jpg

Link to comment

Добрый день, Yurickon!

 

Сместить полосу прокрутки вниз Вы можете следующию образом:

box.VScrollValue = box.VScrollObjectSize - box.VScrollFrameSize;

где box - это ваш WidgetScrollBox.

Значение VScrollValue может меняться от нуля (полоса прокрутки установлена в начало) до VScrollObjectSize - VScrollFrameSize (полоса прокрутки установлена в конец).

  • Like 1
  • Thanks 1
Link to comment

Приветствую moody_pooch!

Да, примерно, о такой конструкции я и подозревал. Сейчас на работе, применить нет возможности. Но уверен, будет работать)

Спасибо за поддержку!  

Link to comment
  • bmyagkov featured and unfeatured this topic
×
×
  • Create New...