КОДЕКС

Давайте поговорим о таблицах данных в видеоиграх

Создание простой системы квестов с использованием активов данных в Unreal Engine 4 (C ++ и Blueprints)

Unreal Engine 4 дает вам различные варианты работы с данными, когда вы хотите включить в свою игру такие вещи, как диалоги или квесты.

Я предпочитаю использовать два типа: Таблицы данных или Активы данных:

Таблицы данных. Как и электронные таблицы, они содержат строки данных и идеально подходят только для текстовых данных, например диалогов. Они могут содержать другие типы, и вы можете экспортировать файл в CSV и, например, импортировать его в документы Google.

Активы данных: являются расширением таблиц данных, но они позволяют вам иметь ссылки на активы, такие как текстуры, статические сетки, чертежи… Я предпочитаю этот второй тип, когда знаю, что у меня будут разные типы объектов. в каждом ряду.

Вы можете следить за видеоуроком:
https://youtu.be/UbiIE8Nescs

Вы можете найти файлы проекта здесь:
https://drive.google.com/file/d/1V2NSk1jAOfIcKCuSM0Tugl27d4-49-ll/view?usp=sharing

Пример квестовой системы

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

Персонаж или объект NPC может дать игроку задание, и синица будет добавлена ​​в список заданий.

Каждый раз, когда игрок взаимодействует с NPC или объектом, если у него есть квест, он будет добавлен в список после игрока,

Актив данных квеста

В этом примере мы собираемся создать базовую систему квестов с использованием Data Assets.

Как вы можете видеть в приведенном выше примере, у нас есть 2 квеста в активе данных Quest.

DataAsset содержит список квестов. Каждый квест доступен для поиска по QuestID, который представляет собой уникальный идентификатор.

Другие данные, которые вы видите в квесте:

  • CharacterName: имя персонажа или объекта, содержащего квест.
  • Сообщение: диалоговое окно (в данном случае однострочное), которое вы будете видеть всякий раз, когда вы взаимодействуете с NPC или объектом, у которого есть квест для вас.
  • Краткое описание: краткое описание, которое отображается, когда мы принимаем квест, на правой боковой панели.
  • Завершенное сообщение: после завершения квеста сообщение, которое вы получаете от NPC или объекта.
  • ItemID: это предмет, который необходимо выполнить для выполнения квеста. Это также уникальный идентификатор, поскольку он связан с другим DataAsset.
  • Ссылка на значок: это двухмерная текстура для сообщения.

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

Цель этого руководства - показать, как использовать актив данных на практическом примере. Мы могли бы значительно усложнить структуру и, например, добавить больше диалоговых строк.

Код C ++ для данных Quest

Мы создадим структуру FQuest с метасловом BlueprintType для доступа через Blueprint для создания этого актива данных.

Нам также понадобится класс типа UDataAsset, содержащий TArray типов FQuest.
Это позволит нам иметь список квесты в нашем активе данных.

Эти 2 элемента определены в файле Definitions.h, который представляет собой очень легкий заголовок, содержащий структуры.
Теперь мы можем создать ресурс данных на основе UQuestData и начать заполнять поля.
Перейдите в браузер содержимого, нажмите щелкните правой кнопкой мыши и выберите Актив данных в разделе Разное.
В следующем всплывающем окне найдите и выберите тип QuestData , чтобы создать пустой DataAsset на основе UQuestData.

Вы готовы создать несколько квестов:

Связывание ресурса данных квеста с игрой

Теперь настало время сообщить игре, что этот стол существует. Это можно сделать разными способами. Вы можете ссылаться на таблицу на плеере или, как в моем случае, на GameMode.
GameMode существует для каждой карты и доступен для любого актера на карта; для меня этого достаточно.
Если вам нужно что-то более статичное на всех картах, вы можете использовать GameInstance, который является постоянным.

Откройте файл HowToGameMode.h и посмотрите, как я объявляю ссылку:

Переменная представляет собой указатель с UPROPERTY, EditDefaultsOnly и только для чтения.
Мы хотим изменить эту переменную только при создании чертежа, а не во время выполнения.
Нам понадобится функция поиска, чтобы найти конкретный квест по квесту ID:

Эту функцию можно вызвать в чертеже, но она также имеет реализацию на C ++.
Это означает, что мы можем вызвать функцию в чертеже, и она также будет запускать часть C ++.

Функция просто просматривает список QuestData квеста и сравнивает заданный QuestID.

Наконец, давайте свяжем фактический актив данных с планом BP_MainGameMode (который настроен на текущем уровне, очень важно!)

Создание списка квестов по функциям игрока и помощника

Чтобы отслеживать квесты, которые мы принимаем, у нас будет TArray FQuestItem, который будет содержать идентификатор квеста, а также информацию о том, завершен он или нет.

Этот список будет храниться на персонаже HowToCharacter

Структура FQuestItem объявлена ​​на Definitions.h

У нас есть несколько вспомогательных функций в HowToCharacter.h, чтобы проверять, принял ли игрок квест, выполнил или просто нашел квест в списке:

FindQuest Body

Принять квест

MarkQuestCompleted

UpdateAndShowQuestList - это метод для сбора списка текста для отображения в пользовательском интерфейсе списка квестов. Это будет позже.

Эти 3 функции будут использоваться для персонажа Кошки и любого другого актера при применении логики квеста.

Взаимодействие с NPC и принятие квеста

В этом уроке есть 2 примера: кошка просит еды и сундук просит ключ.

Кошка - это персонаж, который реализует интерфейс, позволяющий взаимодействовать с игроком.

Вы можете взглянуть на мой предыдущий урок, чтобы понять, как это работает на примере:
https://bluebubblebee.medium.com/lets-talk-about-interfaces-in-game-development-519232319e01

CatCharacter имеет QuestID, который мы используем для поиска в GameMode, и QuestActivated, чтобы узнать, активирован ли квест или нет:

Когда игрок приближается к кошке, нажимает кнопку действия на контроллере, будет выполняться функция OnInteract_Implementation.

Сначала мы получаем информацию о квесте из GameMode, вызывая FindQuest:

Следующим шагом будет поиск квеста в списке игроков.
Если квест еще не принят, мы берем его и показываем информацию о нем в интерфейсе пользователя:

Если квест был принят, но не выполнен (это будет наш второй визит к коту), мы проверяем, есть ли у игрока предмет, необходимый для выполнения квеста.

Если у игрока есть предмет, мы вынимаем его из рук, помечаем квест как завершенный и показываем новое сообщение в пользовательском интерфейсе:

Во второй раз мы взаимодействуем с нужным предметом, сашими:

Пример сундука работает точно так же.

События, полученные игроком по чертежу

Пришло время заняться пользовательским интерфейсом, который я подготовил для этого урока.

Когда мы приближаемся к кошке или сундуку и взаимодействуем с ними, у игрока вызываются 3 события чертежа:

OnShowQuestInfo: это событие вызывается, когда сундук или кошка дает квест в первый раз после взаимодействия с ними.
Появится нижний интерфейс с квестом. и описание значка, если оно существует. Взгляните на пример сундука:

OnShowQuestCompleted: событие, вызываемое, когда мы второй раз посещаем сундук кошки. Если у нас есть нужный предмет (еда для кота и ключ от сундука), квест завершен.
Это событие обновит нижний интерфейс с сообщением о завершении.

OnShowUpdatedQuestList: это событие вызывается каждый раз, когда мы принимаем новый квест или выполняем существующий.

Событие покажет список текущих квестов на правой панели.

Событие получает TArray FText, который создается с помощью метода UpdateAndShowQuestList на плеере.

Очень просто, метод получает информацию о каждом квесте, который игрок в данный момент имеет в GameMode, но он еще не завершен. Мы добавляем его во временный список, который мы отправили в событии в качестве параметра.

Интерфейс квеста

Три реализуемых события схемы поступают в схему ThirdPersonCharacter (в проекте).

Я использую 2 разных схемы виджетов для отображения информации о квесте, WBP_PlayerUI для информации о новом квесте и WBP_Quest для списка квестов.

WBP_PlayerUI

Он содержит несколько элементов и несколько вспомогательных функций для заполнения информации.

Когда событие OnShowQuestInfo получено на ThirdPersonCharacter, мы вызываем функцию ShowQuestInfo на WBP_PlayerUI.

Отправляем изображение для квеста и текст для показа.

Чтобы показать, что квест завершен, ThirdPersonCharacter получает событие OnShowQuestCompleted и вызывает функцию ShowQuestCompleted с WBP_PlayerUI с отображаемым сообщением:

WBP_Quest

Этот виджет содержит только список из 5 квестов. Я ограничил количество квестов, потому что это всего лишь пример, и я не хочу слишком усложнять.
Виджет содержит список элементов квеста, заполненных конструкцией, и вспомогательную функцию для отображения правильного количества квестов из игрок.

Каждый дочерний текстовый элемент в QuestLIstVerticalBox содержится в списке текстовых элементов, заполняемых при построении:

Это полезно, чтобы позже показать список квестов, повторяющих этот список.

Событие OnShowUpdatedQuestList в ThirdPersonCharacter получает список текста квеста. Это представляет собой незавершенные квесты, которые есть у игрока.

Когда функция UpdateQuestList получает список, она проверяет, пустой он или нет, и отображает весь холст или нет.
Она также будет перебирать массив, чтобы отобразить каждый элемент в соответствующем текстовом поле:

И это конец урока! В этом примере не рассматривается сложная система квестов, но вы можете использовать ее в качестве основы и повторять ее.

Надеюсь, этот урок был вам полезен!

Мне искренне нравится писать о программировании, математике, видеоиграх и объединять все вместе!

В настоящее время я работаю над новой инди-игрой под названием Академия ведьм.
Я делаю эту игру на Unreal Engine 4, и мне очень приятно поделиться некоторыми своими приемами и системами, которые я использую.

В Академии ведьм вы переживаете приключения ученика волшебника, живете в академии и посещаете разные классы, например, ботанический, где вы заботитесь о своем собственном саду.
И у вас есть духовный компаньон - кошка!

Если вам нравятся кошки, волшебники, магия и успокаивающий опыт, эта игра для вас!

Я планирую выпустить игру для ПК и Nintendo Switch!

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