Мое последнее обновление для системы динамической базы данных ArcLight закончило создание основы базы данных диалогов для хранения и извлечения фрагментов диалогов из таблиц SQLite в качестве ссылок на сериализованный текстовый файл JSON. Недавно я смог расширить эту систему базы данных SQLite, включив в нее нашу систему квестов, неглубокую систему инвентаризации игроков и базовую таблицу статистики игроков для отслеживания опыта игрока.

Как группа, мы решили, что эти серверные системы должны быть разделены, чтобы они не мешали друг другу, иони также должны иметь возможность взаимодействовать друг с другом через свои соединения с базами данных для отправки и получения данных. данные друг от друга по мере необходимости. По сути, нам нужна была разделенная иерархия разделения базы данных на таблицы, при которой ни одна таблица не имела более высокий приоритет, чем другая.

Мы также решили, что должен быть базовый сценарий взаимодействия, функционирующий как класс интерфейса, и базовый сценарий элемента, функционирующий как абстрактный класс для всех интерактивных элементов, от которых можно наследовать. Эта функциональность позволяет всем интерактивным объектам, с которыми соприкасается игрок, таким как добыча, NPC или другие квестовые предметы, иметь базовые методы Interact() и CleanUp(). Метод Interact() инициирует начало взаимодействия, а метод CleanUp() инициирует завершение взаимодействия и обновление всех относительных данных в серверной системе.

Исходя из этих параметров, вот такой дизайн бэкенд-системы, который мне удалось придумать:

База данных SQLite диктует поток данных в эту серверную систему и из нее. Каждый из столпов интерактивных систем управления данными — менеджер диалогов, менеджер квестов, менеджер дерева навыков и менеджер инвентаря игроков — все имеют свои собственные подключения к источнику данных, который является базой данных SQLite. Квест-менеджер имеет уникальную возможность перекрестно ссылаться на таблицы диалога, дерева навыков и инвентаря игрока, но это подключение с разрешением только для чтения. Все данные записываются через отдельные соединения SQLite каждого менеджера компонентов, чтобы предотвратить перезапись данных из нескольких источников, что приводит к ошибкам ввода данных.

С точки зрения игрока, игрок будет взаимодействовать с заскриптованным объектом в трехмерном пространстве мира. К этому объекту будет прикреплен сценарий I-Interactable, который классифицирует его тип взаимодействия. В зависимости от типа взаимодействия (Диалог, Бой, Предмет и т. д.) будет вызван метод Interact(), и данные нового игрока начнут записываться в виде сериализованного объекта. Как только взаимодействие помечено как завершенное, система событий вызывает метод CleanUp(). В методе CleanUp() окончательные данные о событии игрока будут отформатированы специально для сериализации JSON, затем переданы в виде файла JSON в соответствующий скрипт менеджера, а затем из менеджера в базу данных SQLite. Затем база данных заполняется путями файлов к сериализованным данным JSON. Эти пути к файлам JSON могут быть повторно открыты их системными администраторами, чтобы преобразовать данные обратно в строки, распознаваемые человеческим глазом.

К счастью, в Unity есть собственный встроенный инструмент сериализации JSON, который очень хорошо работает с объектами сценариев Unity. Это прекрасное сочетание сериализации JSON и объектов сценариев позволяет всей команде быстро вносить изменения в подсистемы базы данных SQLite, не вникая в мельчайший код и не беспокоясь о том, что эти изменения сломают какие-либо системы.

Это означает, что любой член команды — без предварительных знаний о том, как устроена наша серверная система и как она работает в кодовой базе — может войти в Unity, создать свой собственный объект Dialogue Scriptable Object и присоединить этот объект к объекту Dialogue Trigger I-Interactable в 3D-мире. пространство, чтобы игрок мог взаимодействовать с ним.

Можно спросить: «Зачем использовать Scriptable Object и базу данных? Разве это не перебор?». Ответ и да, и нет.

Да,можно было бы только использовать объекты, поддерживающие сценарии, и иметь постоянные данные для статическихобъектов, не зависящих от игрока. действия, такие как статические NPC или объекты-указатели. Однако для динамических объектов, которые будут сохраняться и загружаться во время выполнения, таких как инвентарь игрока, управляемый выбором диалог, статистика игрока и данные квеста, эти объекты требуют особого внимания при их хранении и организации; в противном случае вы потеряете данные между игровыми сессиями, а это никому не нужно! Другими словами — Нет, Scriptable Objects — это не универсальное решение для управления данными игрового процесса, особенно данными, сохраняемыми между открытием и закрытием каждого игрового сеанса в окончательной сборке.

Имея это в виду, лучшим вариантом является сочетание Scriptable Objects для статических объектов сцены и сериализованных динамических объектов JSON, которые сохраняются и загружаются как объектные файлы JSON из организованного каталога базы данных.

Каждое взаимодействие с I-Interactable GameObject проще представить как последовательность сканирования штрих-кода. Сканируемый объект — это GameObject в 3D-пространстве, наклейка — это Scriptable Object, прикрепленный к 3D GameObject, изображение штрих-кода на наклейке — это сериализованный файл JSON, а номер штрих-кода под наклейкой — это запись в таблице базы данных, которая сохраняет и загружает файл под своим уникальным идентификатором. Наконец, сценарий I-Interactable функционирует как сканер, поскольку этот трехмерный сериализованный объект взаимодействует с игроком в мировом пространстве.

Надеемся, что этот обзор системы динамической базы данных ArcLight поможет объяснить некоторые из более высоких тайн внутренних сценариев в Unity. Для моей следующей цели я планирую завершить обработку данных, управляемую событиями, в системе Quest. Прямо сейчас в нем много заполнителей из-за отладки, но поскольку наша команда закончила раскадровку для нашего первого квеста, пришло время подключить реальные данные к серверной части квестовой системы. Я также буду работать с Заредом над разработкой сценариев взаимодействия с пользовательским интерфейсом, чтобы он был не только красивым, но и полностью функциональным и поддерживался всеми серверными системами.

Следите за обновлениями ArcLight! Как всегда, мы очень ценим ваши отзывы и поддержку!

Ресурсы: