84 6 6MB
Easy Survival RPG Документация
Введение Easy Survival RPG - проект - прототип для создания сетевых игр в жанрах Survival или RPG на движке Unreal Engine 4. В его основе лежит множество механик, начиная от базового управления персонажем и взаимодействия с окружающим миром, до создания мультиплеерных сессий с сохранением и загрузкой состояний игроков. Данный проект является очень комплексной системой, на основе которой могут создаваться другие проекты. Все системы и механики интегрированы друг в друга и не могут с легкостью быть извлечены по отдельности. Проект должен быть использован как основа для ваших проектов или как референс для создания похожих механик в готовых проектах. В этой документации собрана базовая информация по работе с мультиплеерными проектами, а также полная информация описывающая все механики и принципы их работы, а также руководства по работе с ними.
2
Оглавление Введение
2
Оглавление
3
Базовые понятия
7
Основные классы Работа с интерфейсами
10
Работа с таблицами данных
11
Работа с библиотеками
13
Работа с Gameplay Tags
14
Работа с сетью
16
Описание основных классов
18
BP_GameInstance
18
Описание
18
Переменные настроек
19
Переменные состояния
19
BP_PlayerController
20
Описание
20
Макросы
21
Переменные
21
BP_HUD_Game
22
Описание
22
Функции
23
Переменные
24
BP_GameSave_Settings
25
Описание
25
Переменные
25
Функции
26
BP_GameSave_Session
27
Описание
27
Переменные
27
BP_PlayerManagerComponent
3
7
28
Описание
28
Переменные - Ссылки
29
Переменные - Данные игрока
30
Переменные - Состояние
30
Переменные - Настройки
30
Функции
31
Связывающие события
32
Описание основных систем
33
Система взаимодействия с объектами Описание
33
BPI_InteractionObject
34
BP_InteractionComponent
36
Переменные
37
Функции
37
Связывающие события
37
Система взаимодействия с предметами
38
Описание
38
Структуры
39
Полная информация о предмете
40
Классификация предметов
42
BP_Item
44
BP_ContainerComponent
46
BP_EquipmentComponent
48
BP_HotbarComponent
49
BP_CraftingComponent
50
BP_FuelGeneratorComponent
52
BP_TradeComponent
54
Взаимодействие игрока с инвентарем и экипировкой
55
Взаимодействие игрока с другими контейнерами
56
Взаимодействие игрока с компонентом производства
57
Взаимодействие игрока с компонентом генератора
58
Взаимодействие игрока с компонентом торговли
59
Взаимодействие игрока с панелью быстрого доступа
60
Система строительства
4
33
62
Описание
62
STR_BuildingObject
63
BP_Building_BuildingObject
65
BP_BuildComponent
68
Переменные
68
Функции
70
Связывающие события
70
Типы строительных объектов Система заменяемых инстансов
74
Описание
74
BP_FoliageCheckerComponent
75
BP_InstancedComponent_Base
76
Настройка заменяемых инстансов
77
Система диалогов
78
Описание
78
STR_Dialogue
80
STR_DialogueReply
81
BP_Dialogue_Base
82
Условия реплик
83
События реплик
84
Схема диалога
85
Система квестов
86
Описание
86
BP_Quest_Base
87
BP_QuestTaskComponent_Base
90
Записи в дневнике
92
Система сохранения и загрузки
94
Описание
94
STR_SaveData_Player
95
STR_SaveData_Level
97
BP_GameSave_Settings
99
BP_GameSave_Session
101
BPI_SaveData
103
Сохранение и загрузка уровня
105
Персонажи Базовый класс персонажа
107 107
Описание
107
Компоненты
108
Переменные
109
Функции
113
Компоненты персонажа
117
BP_AttributesComponent
117
BP_FootstepComponent
120
BP_FoliageCheckerComponent
124
Класс игрового персонажа
5
71
125
Описание
125
Компоненты
126
Переменные
128
Функции
133
Работа с анимациями
141
Анимационные нотифаи
141
Список нотифаев
142
Анимационный блюпринт
145
Искусственный интеллект
152
Описание
152
Блекборд BB_Base
153
Дерево поведения BT_Base
154
Настройки проекта
159
Настройки коллизии
159
Настройки управления
160
Настройки навигации ИИ
161
Настройки плагинов
162
Настройки STEAM
163
6
Базовые понятия Основные классы Для создания проектов в Unreal Engine 4 необходимо знать основные классы, которые будут постоянно использоваться для определенных целей. К таким классам относятся GameInstance, GameMode, PlayerController, HUD и другие. GameInstance - основной класс игры, экземпляр которого создается при запуске игры. Как правило, должен содержать методы и переменные для переходов между уровнями, методы настройки игры и методы загрузки и сохранения игры. Имеет события вызывающиеся при запуске и завершении приложения, а также при возникновении сетевых или технических ошибок. Эти события могут быть переопределены по желанию. Поменять GameInstance можно в Project Settings.
GameMode - класс, экземпляр которого создается при запуске любого уровня для локального игрока. Содержит информацию о других классах, которые будут созданы вместе с ним, таких как PlayerController, PlayerState, GameState, H UD, а также информацию о персонаже, который будет создан по-умолчанию при запуске уровня и который будет управляться игроком. Необходим для выбора вышеперечисленных классов, которые будут созданы при подключении к уровню. Имеет события, вызывающиеся при подключении и отключении игрока к текущему уровню, смене игроком имени, выбора точки спавна и респавна игрового персонажа и другие. Эти события могут быть переопределены по желанию.
7
Может быть задан глобально для всей игры в P roject Settings во вкладке M aps & Modes.
Также может быть выбран отдельно для каждого уровня в окне W orld Settings текущего уровня.
8
PlayerController - класс игрока, экземпляр которого создается после GameMode. Как правило, должен содержать различные компоненты игрока для взаимодействия с миром, а также методы управления персонажем и пользовательским интерфейсом. Также может содержать информацию о состоянии игрока, имеющемся опыте, предметах и тд. Однако для этого есть отдельный класс PlayerState. Может быть задан в GameMode классе во вкладке D etails.
HUD - класс, экземпляр которого создается после G ameMode. Необходим для создания и отображения пользовательского интерфейса для игрока. Также может быть задан в GameMode классе. 9
Работа с интерфейсами Использование блюпринт интерфейсов позволяет использовать одинаковые функции для взаимодействия с различными классами объектов. Для этого не нужно будет приводить объект к определенному классу, у которого есть требуемые функции. К примеру, можно создать интерфейс с функциями изменения здоровья объекта и добавить его в блюпринт персонажа и блюпринт здания, а затем прописать логику для этих интерфейсных функций внутри этих блюпринтов. После этого станет возможным вызывать функцию изменения здоровья у персонажа и здания вне зависимости от его класса. Также интерфейсы упрощают интеграцию одной сложной системы в другую. Для создания интерфейса нужно нажать на зеленую кнопку A dd New в Content Browser и выбрать Blueprint Interface в разделе Blueprints. Чтобы добавить интерфейс для определенного актора, нужно открыть C lass Settings, нажать на кнопку A dd и выбрать нужный интерфейс.
Имплементировать логику для интерфейсной функции можно нажав на скрытую кнопку O verride на панели функций и выбрать нужную функцию из списка.
10
Работа с таблицами данных Таблицы данных нужны для хранения большого количества информации и доступа к ней из блюпринтов. Отличным решением будет использовать таблицы данных, если вы планируете добавлять огромное количество предметов, диалогов, заданий, рецептов и так далее в свой проект.
Для добавления таблицы требуется структура, на основе которой будут добавляться строки. На рисунке ниже представлена структура для экземпляра предмета используемая в проекте E asy Survival RPG.
11
Для добавления таблицы необходимо нажать на зеленую кнопку Add New в Content Browser и выбрать Data Table в разделе Miscellaneous, а затем выбрать структуру на основе которой создается таблица.
Получить доступ к структуре данных таблицы внутри блюпринтов можно с помощью функции GetDataTableRow.
12
Работа с библиотеками При разработке крупных проектов приходится использовать одни и те же последовательности функций огромное число раз. Эти последовательности можно объединить в библиотеку функций и вызывать в любых блюпринтах проекта. Создать библиотеки функций и макро можно нажав на зеленую кнопку Add New в C ontent Browser и выбрав B lueprint Function Library и B lueprint Macro Library в разделе B lueprints.
13
Работа с Gameplay Tags Gameplay Tags могут быть использованы для разных целей, начиная от игровых и погодных событий до атрибутов и типов предметов. В Easy Survival RPG они используются для определения прогресса игры для игрока и мира в целом, классификации атрибутов и классификации предметов.
Можно создавать таблицы данных на основе G ameplay Tags и добавлять новые таги в таблицу по мере разработки проекта.
14
Подгружать таблицы тагов можно в Project Settings в разделе GameplayTags.
Таги можно использовать для проверки определенных условий на уровне. К примеру, вE asy Survival RPG они используются для заданий для игроков. Скелет-торговец не выдаст вам задание на убийство скелетов, пока вы не выполните задание на морские звезды.
15
Работа с сетью Работа сети в Unreal Engine 4 - это очень комплексная система, для описания которой понадобится ни один десяток страниц, поэтому стоит знать базовые понятия относительно движка, которыми нужно руководствоваться при создании проекта. 1. При запуске игры, ваша машина по умолчанию считается сервером. 2. При подключении к другой машине ваша машина превращается в клиента. 3. Объекты на сервере и клиентах могут различаться. Создавая новый класс актора, вам необходимо указывать - будет ли он реплицироваться. Если репликация включена, то создавая объект на сервере, он будет создаваться и на клиентах и ссылка на объект будет общей. Реплицировать необходимо только важные объекты, которые влияют на геймплей.
4. Некоторые переменные в объектах также необходимо реплицировать, иначе на сервере и клиенте значение переменных будет отличаться. Реплицированная переменная должна изменяться только на сервере.
Для переменных существует два типа репликации: Replicated - значение переменной дублируется на клиенты, когда оно изменяется на сервере. RepNotify - значение переменной дублируется на клиенты и вызывается функция, которую можно изменить по своему усмотрению. К примеру, это можно использовать для изменения меша оружия персонажа при изменении значения определенной переменной.
16
5. Некоторые компоненты также должны быть реплицируемыми, если их данные и переменные должны дублироваться, или они будут использоваться как аргументы в серверных методах. 6. Существует три типа серверных методов:
Run on Server - событие будет вызвано только на серверной машине. Run on Client - событие будет вызвано только на машине клиента. Multicast - событие будет вызвано на всех машинах.
Reliable - событие произойдет обязательно, даже при плохом соединении сети. Можно отключать для некоторых косметических событий (спавн партиклей, различных эффектов и так далее, то есть всего того, что не влияет на основной геймлпей). 7. Серверные методы будут вызваны только если вызываются из класса PlayerController или вызываются из класса, владельцем которого является PlayerController. 8. Чтобы клиенты могли подключиться к серверу, нужно открыть уровень с опцией listen.
17
Описание основных классов BP_GameInstance Описание Наследуется от класса GameInstance. В данном классе находятся все функции для старта, продолжения и загрузки игры, перехода между уровнями и перехода в главное меню. Также функции для получения и изменения пользовательских настроек игры, графики, звука и настроек управления. К тому же здесь проводится проверка железа машины и выбор оптимальных настроек графики. Класс имплементирует интерфейс B PI_GameInstance и его можно легко заменить на другой GameInstance, который тоже имплементирует функции этого интерфейса. Функции этого интерфейса можно вызывать для обычного GameInstance класса, полученного с помощью функции G etGameInstance.
Также здесь прописаны глобальные геймплейные функции, такие как спавн предметов, затемнение экрана и добавление глобальных игровых тагов.
18
Переменные настроек
SettingsGameSaveSlot - слот, в который сохраняются, и из которого загружаются пользовательские настройки игры. SingleplayerStartLevel - стартовый уровень для режима одиночной игры. MultiplayerStartLevel - стартовый уровень для режима многопользовательской игры. MainMenuLevel - уровень главного меню игры.
Переменные состояния
IsGameStarted - показатель того, что игра была запущена из главного меню, а не из вьюпорта уровня. IsMultiplayer - показатель того, что игра происходит в многопользовательском режиме. CurrentGameSave - ссылка на объект сохранения текущей игры. SettingsGameSave - ссылка на объект сохранения настроек игры. CurrentLevel - название текущего уровня. TransferPlayerData - стартовые данные игрока при переходе из главного меню в игру. LoadingScreen - ссылка на виджет экрана загрузки. GameTags - список текущих глобальных игровых тагов игры.
19
BP_PlayerController Описание Наследуется от класса PlayerController. Класс содержит компонент управления BP_PlayerManagerComponent, который включает в себя огромное количество функций для взаимодействия с предметами, ресурсами, крафтом и другими объектами, а также функции по управлению пользовательским интерфейсом. Также содержится компонент для строительства BP_BuildComponent, который содержит функции для управления процессом строительства и компонент для взаимодействия с объектами BP_InteractionComponent. Подробнее об этих компонентах расписано в соответствующих разделах. Класс имплементирует интерфейс B PI_Player и его можно заменить на другой PlayerController, который тоже имплементирует функции этого интерфейса. Функции этого интерфейса могут быть вызваны для класса Controller без приведения к соответствующему типу. Все эти функции находятся в графе E ventGraph.
Также тут находятся функции инициализации игры для игрока и функция инициализации всех компонентов.
20
События нажатия на кнопки управления находятся в графе Inputs. К таким событиям относятся выбор активного хотбар слота, открытие и закрытие инвентаря и другие.
Макросы
IsGameInputs - продолжает последовательность действий, если пользовательский интерфейс закрыт. IsGameOrDialogue - выбирает последовательность действий в зависимости от того открыт диалог или нет.
Переменные
ChangeBuildingHeight - показатель, при котором необходимо изменять высоту строящегося объекта с помощью колесика мыши. 21
BP_HUD_Game Описание Наследуется от класса HUD. Содержит функции создания, обновления и управления пользовательским интерфейсом, который включает игровые виджеты и виджеты меню паузы и меню смерти персонажа.
Класс имплементирует интерфейс B PI_HUD_Game и его можно легко заменить на другой HUD, который тоже имплементирует функции этого интерфейса. Функции этого интерфейса могут быть вызваны для класса HUD, полученного с помощью функции G etHUD.
22
Функции Данный класс имеет огромное количество функций по обновлению и управлению пользовательским интерфейсом. Названия функции передают общую суть и отсортированы на несколько категорий.
Main - функции создания, открытия и закрытия пользовательского интерфейса, а также другие функции - функции создания меню паузы и меню смерти. State - функции, возвращающие состояние пользовательского интерфейса,а именно - открыт или закрыт инвентарь, журнал, карта и тд. Containers - функции обновления слотов инвентаря, экипировки и хотбара, а также заполнение их предметами. Building - функции открытия и закрытия меню строительства и меню киянки. Trading - функции обновления окон при торговли. Maps - функции открытия карты и отключения отрисовки карты и миникарты. Journal - функции обновления журнала и активных заданий. Dialogue - функции обновления и управления диалогами. Settings - функции обновления настроек отображения элементов пользовательского интерфейса. Character - функции обновления информации о персонаже. Chat - функции открытия и закрытия чата и функции обновление сообщений.
23
Other - остальные функции не вошедшие ни в одну категорию. Например, это функции открытия кодового замка, отображения подбираемых предметов, проигрывания анимаций при получении урона или блоке во время боя и другие.
Переменные
HUD - ссылка на основной виджет пользовательского интерфейса. PauseMenu - ссылка на виджет меню паузы. DeathMenu - ссылка на виджет меню смерти.
24
BP_GameSave_Settings Описание Наследуется от класса SaveGame. Это класс, используемый для сохранения и загрузки настроек игры и для сохранения и загрузки слотов сохраненных игр. Загружается при запуске игры из класса B P_GameInstance.
Переменные HardwareBenchmarkUsed - показатель того, что оптимальные настройки графики уже были установлены. AutosaveMode - текущий режим настроек автосохранения игры. ShowFloatingText - индикатор показа всплывающего текста во время игры. ShowCharacterState - отображение состояния игрового персонажа на пользовательском интерфейсе во время игры. ShowEnemyCharacterStates - отображение состояния других персонажей во время игры. ShowMinimap - отображение миникарты на пользовательском интерфейсе во время игры. ShowMarks - отображение метки во время игры. ShowBuildingDurability - отображение состояния построек во время игры. MasterVolume - значение общей громкости звуков. MusicVolume - значение громкости музыки. EffectsVolume - значение громкости эффектов. VoiceVolume - значение громкости речи. SingleplayerGameSaveNames - массив слотов, в которых сохранена игра в однопользовательском режиме.
25
MultiplayerGameSaveNames - массив слотов, в которых сохранена игра в многопользовательском режиме. GameSettingsSlot - слот, в котором сохраняются данные этого класса.
Функции
SaveSettings - сохранение настроек в слот для сохранения настроек игры. AddSingleplayerSave - добавление слота в массив сохраненных игр в однопользовательском режиме. RemoveSingleplayerSave - удаление слота из массива сохраненных игр в однопользовательском режиме. AddMultiplayerSave - добавление слота в массив сохраненных игр в многопользовательском режиме. RemoveMultiplayerSave - удаление слота из массива сохраненных игр в многопользовательском режиме.
26
BP_GameSave_Session Описание Наследуется от класса SaveGame. Класс с сохраненной информацией о игровой сессии. Используется в BP_GameInstance для сохранения текущей игровой сессии, загрузки и сохранения данных об уровне и игроках. Имплементирует интерфейс BPI_GameSave и его функции. Эти функции вызываются всеми акторы и компонентами, которые должны сохраняться и загружаться. Подробнее принцип работы системы сохранения и загрузки объясняется в следующих разделах.
Переменные SlotName - имя слота, в котором хранится сохранение. CurrentLevel - текущий уровень сохранения. IsMultiplayer - показатель многопользовательской сессии. HostPlayerData - сохранённые данные об игроке, который является хостом. ClientPlayersData - сохраненные данные об игроках. LevelsData - сохраненные данные об уровнях. GameTags - сохраненные теги игры. DateTime - время и дата сохранения.
27
BP_PlayerManagerComponent Описание Наследуется от класса ActorComponent. Данный компонент обрабатывает для игрока взаимодействие всех основных систем проекта между собой в одном месте. К таким системам относятся: система инициализация игрового персонажа, система взаимодействия с предметами, система строительства, система взаимодействия с пользовательским интерфейсом, система загрузки и сохранения игры и многие другие. Содержит все сетевые функции, которые должен содержать P layerController для взаимодействия всех систем проекта в многопользовательском режиме. Также содержит информацию о прогрессе игрока, об уровне персонажа, о заработанном опыте, о доступных рецептах для крафта, об активных заданиях и многом другом. Компонент должен реплицироваться.
Компонент должен быть добавлен в класс P layerController и также там инициализирован, вместе с компонентом строительства ( B P_BuildComponent ) и компонентом взаимодействия ( B P_InteractionComponent ).
28
Переменные - Ссылки PlayerController - ссылка на игрока. InteractionComponent - ссылка на компонент взаимодействия с объектами. BuildComponent - ссылка на строительный компонент. HUD - ссылка на пользовательский интерфейс игрока. PlayerCharacter - ссылка на персонажа игрока. PlayerInventory - ссылка на контейнер инвентаря игрового персонажа. LootContainer - ссылка на открытый контейнер. PlayerEquipment - ссылка на контейнер экипировки игрового персонажа. PlayerHotbar - ссылка на контейнер быстрого доступа игрового персонажа. TradeComponent - ссылка на компонент торговца. CharacterCraftingComponent - ссылка на компонент крафтинга игрового персонажа. CurrentCraftingComponent - ссылка на текущий компонент крафтинга. CurrentDialogue - ссылка на актор активного диалога. NpcCharacter - ссылка на персонажа, с которым происходит диалог. PlayerCharacterMark - ссылка на актор метки игрового персонажа. MapRender - ссылка на актор, который рендерит карту. Codelock - ссылка на активный кодовый замок. ActiveQuestActors - массив ссылок на акторов активных заданий.
29
Переменные - Данные игрока СurrentLevel - текущий уровень игрока. CurrentExperience - текущий опыт игрока. AvailableSkillPoints - количество доступных очков умений. PlayerAttributes - массив атрибутов игрока. JournalNotes - массив записей дневника. PlayerTags - активные теги игрока. HairTypeIndex - выбранный тип прически. HairColorIndex - выбранный цвет прически. PantsColorIndex - выбранный цвет штанов. SkinColorIndex - выбранный цвет кожи. AdditionalBlueprints - дополнительные чертежи доступные игроку. ActiveQuests - массив с данными об активных заданиях.
Переменные - Состояние SelectedHotbarSlot - активный слот быстрого доступа. LastBuildingHandle - идентификатор последнего строительного объекта. NextLevelRequiredExperience - опыт необходимый для следующего уровня игрока. PlayerSaveData - сохраненные данные игрока. MapDisable - показатель отключения отображения карты для игрока. ChatMessages - массив сообщений в чате игрока.
Переменные - Настройки PlayerCharacterClass - класс игрового персонажа, который будет создаваться при инициализации игрока. CharacterCraftingList - список изначально доступных для изготовления чертежей.
30
Функции В данном компоненте находится огромное количество функции, которые отсортированы по разным категориям. Также у функций есть постфиксы s erver и client. S erver означает, что функция выполняется на сервере, а client означает, что функция выполняется на клиенте. Описание каждой функции можно узнать при наведении на ее название. Init Component - функция инициализации компонентов. User Interface - функции создания, обновления и управления пользовательским интерфейсом. Items - функции быстрого взаимодействия с предметами, перетаскивания между слотами контейнеров, выбрасывания и тд. Hotbar - функции взаимодействия с предметами в контейнере быстрого доступа. Containers - функции взаимодействия с контейнерами, их отображение контейнеров, обновление слотов и тд. Crafting - функции взаимодействия компонентов при крафтинге, отображение окна и обновление прогресса. Trading - функции взаимодействия компонентов при торговле, отображение окна и обновление предметов. Building - функции взаимодействия компонентов при строительстве. Dialogue - функции для работы с диалогами, отображение окна, выбор реплик и тд. Codelock - функции для работы с кодовым замком, отображение окна и авторизация. Player - функции для инициализации игрока и игрового персонажа, обновления прогресса, заданий, сохранения и загрузки данных игрока, изменения настроек и тд. Chat - функции для отображения и отправки сообщений в чат. Event Binds - функции подписанные на игровые события, например на изменение предметов в инвентаре, рубку деревьев или на убийство других персонажей.
31
Связывающие события OnSelectedItemChanged - происходит, когда предмет в активном слоте быстрого доступа меняется. OnInventoryItemChanged - происходит, когда предмет инвентаря меняется. OnPlayerTagsUpdated - происходит, когда теги игрока были обновлены. OnPlayerItemsChanged - происходит, когда предмет в слоте инвентаря, хотбара или экипировки меняется. OnPlayerDestructTree - происходит, когда игрок срубает дерево. OnPlayerFullDestructTree - происходит, когда игрок уничтожает дерево с корнем. OnPlayerCompleteCrafting - происходит, когда игрок завершает крафт предмета. OnPlayerCompleteBuilding - происходит, когда игрок завершает строительство. OnPlayerDestructMineStage - происходит, когда игрок разрушает часть жилы. OnPlayerDestructMine - происходит, когда игрок полностью разрушает жилу. OnPlayerKillCharacter - происходит, когда игрок убивает персонажа. OnInventoryItemAdded - происходит, когда предмет добавляется в инвентарь игрока. OnPlayerConsumeItem - происходит, когда игрок расходует предмет. OnEquipmentItemChanged - происходит, когда предмет экипировки меняется. OnHotbarItemChanged - происходит, когда предмет в хотбаре меняется.
32
Описание основных систем Система взаимодействия с объектами Описание Игрок может взаимодействовать с объектами в игровом мире, путем нажатия клавиш для взаимодействия. Чтобы с объектом можно было взаимодействовать он должен имплементировать интерфейс BPI_InteractionObject. Поиск объекта, с которым может взаимодействовать игрок осуществляется с помощью компонента BP_InteractionComponent. Попытка взаимодействия с объектом происходит после нажатия игроком определенных клавиш и вызова функции T ryInteract (Client) из компонента.
Проверка на наличие цели производится на машине клиента, и если подходящая цель есть, компонент вызывает функцию взаимодействия для объекта на сервере.
33
BPI_InteractionObject У объектов, с которыми игрок может взаимодействовать, должны быть имплементированы следующие функции.
GetInteractionObjectName_BPI - возвращает название объекта. GetInteractionText_BPI - возвращает описание процесса взаимодействия. TryInteract_BPI - попытка взаимодействовать с объектом. TryTurnOn_BPI - попытка включить объект. TryTurnOff_BPI - попытка выключить объект. IsTurnedOn_BPI - возвращает true, если объект в данный момент включен. CheckCanInteract_BPI - возвращает true, если с объектом можно взаимодействовать в данный момент. Представление функций на примере взаимодействия с костром.
34
При взаимодействии с костром открывается контейнер с очередью производства и переключатель для управления процессом горения.
Процесс горения управляется с помощью компонента BP_FuelGeneratorComponent.
35
BP_InteractionComponent Описание Компонент, который производит поиск целевого актора для игрока и позволяет взаимодействовать с ним, если актор обладает интерфейсом BPI_InteractionObject. Компонент реплицируется.
Компонент должен быть добавлен и инициализирован в P layerController.
36
Переменные PlayerController - ссылка на игрока. TargetActor - целевой актор. IsLocalPlayer - показатель того, что компонент находится у локального игрока. UsableRange - дальность взаимодействия от игрового персонажа. TraceMode - показатель того, что поиск целевого актора производится с помощью трейса. TraceToMouse - показатель того, что трейс будет вызываться в положение курсора мыши игрока. TraceRangeFromCamera - дальность трейса относительно камеры игрока. TraceRangeFromTopDownCamera - дальность трейса относительно камеры игрока в режиме вида сверху.
Функции
Init Component - функция инициализации компонента для игрока. Update Target Actor - функции поиска и обновления целевого актора.
Связывающие события
OnTargetActorChanged - происходит, когда целевой актор изменяется на другой.
37
Система взаимодействия с предметами Описание Система работы с предметами в многопользовательской игре - это очень комплексная и сложная система. Она использует большое число структур, таблиц данных и взаимодействий между несколькими компонентами и акторами. Для хранения информации об уникальных предметах используется структура STR_ItemInstance и сделанная на ее основе таблица данных DT_Items. Для размещения предметов на уровне и при выбрасывании их из инвентаря используется актор B P_Item. Для хранения информации о предметах в контейнерах используются структуры STR_ItemData. Эти структуры хранятся в компоненте B P_ContainerComponent. Экипировка игрока представлена компонентом B P_EquipmentComponent, который наследуется от компонента BP_ContainerComponent. Хотбар контейнер игрока представлен компонентом BP_HotbarComponent, который также наследуется от компонента B P_HotbarComponent. Для хранения информации об уникальных чертежах используется структура STR_Blueprint и сделанная на ее основе таблица данных DT_Blueprints. Для хранения разных списков чертежей создана структура STR_CraftingList и таблица на ее основе DT_CraftingLists. Крафт предметов осуществляется с помощью компонента BP_CraftingComponent. Для хранения списков предметов доступных для продажи используется структура STR_TradeList и созданная на ее основе таблица данных D T_TradeLists. Торговля осуществляется с помощью компонента BP_TradeComponent. Для работы с предметами была создана библиотека функций B P_ItemsLibrary.
38
Структуры Для работы с предметами было сделано несколько структур. Структуры S TR_Item, S TR_ItemData, STR_ItemInstance, STR_ItemTransferData предназначены для хранения и передачи информации о предметах. В структуре S TR_ItemInstance хранит информацию о предмете, идентификатор, название, описание, иконка предмета, статик и скелетал меши и тд. На основе этой структуры была создана таблица данных DT_Items, в которой содержится информация о всех предметах проекта. Структура S TR_Item хранит информацию об идентификаторе предмета из таблицы DT_Items и его количестве. Структура S TR_ItemData хранит полную информацию о предмете, находящемся в мире или в слоте контейнера. Структура S TR_ItemTransferData создана для передачи полной информации о предмете между сервером и клиентом. Структуры S TR_Blueprint, STR_CraftingList, STR_QueueBlueprint, STR_AdditionalBlueprint предназначены для хранении информации о чертежах для системы крафтинга. Структуры S TR_ItemTradeData, STR_CostValue, STR_TradeList предназначены для работы с системой торговли. Структуры S TR_LootItem и S TR_Loot предназначены для составления и настройки списков выпадающих предметов.
39
Полная информация о предмете Полная информация о предмете находящемся в мире или слоте контейнера хранится в структуре S TR_ItemData.
ItemHandle - идентификатор предмета в таблице данных DT_Items. Amount - текущее количество предмета в стаке. Durability - текущее значение прочности предмета. 40
Decay - текущее значение разложения предмета. Name - название предмета. Description - описание предмета. Icon - иконка предмета. ItemClass - класс актора в мире. MaxStack - максимальное количество предметов в стаке. MaxDurability - максимальное значение прочности предмета. StaticMeshes - список статических мешей, используемых предметом. Например индекс “Drop” используется для отображения меша предмета, при его выбрасывании из инвентаря. SkeletalMeshes - список скелетал мешей, используемых предметом. Sounds - список звуков, используемых предметом. Например индекс “Take” используется для воспроизведения звука, при его добавлении в инвентарь. ItemTags - список тегов предмета, для определения типа предмета. CostValue - структура, определяющая стоимость предмета при его продаже продавцу. EquipmentAttributes - атрибуты предмета, добавляемые игровому персонажу, если он экипирует этот предмет. CanDecay - показатель, может ли данный предмет разлагаться со временем. DecayTime - время разложения предмета в секундах. DecayItem - предмет, в который превратится этот предмет после разложения. Weight - вес одного предмета в стаке. UseAbilityClass - класс актора, который будет создан и активирован при использовании предмета.
41
Классификация предметов Классификация предметов реализована с помощью системы игровых тегов. Теги для предметов были прописаны в таблице D T_GameplayTags_Items, а затем добавлены в настройки проекта.
Для каждого предмета могут быть выбраны разные теги и классификации.
Component - обычный предмет, из которого может быть сделано что-то другое. Equipment - предмет является экипировкой.
Equipment.B ody - экипировка на тело. Equipment.F eet - экипировка на стопы. Equipment.F eet.B ootDecal - отрисовывать декаль сапогов, вместо декали ног. Equipment.H ands - экипировка на руки. Equipment.H ead - экипировка на голову. Equipment.P ants - экипировка на ноги.
42
Fuel - предмет является топливом.
Fuel.Coal - предмет является углем. Fuel.Foliage - предмет является травой. Fuel.LiquidFuel - предмет является жидким топливом. Fuel.Wood - предмет является деревом. Quest - квестовый предмет. Resource - предмет является ресурсом. Resource.C oins - предмет является золотыми монетами. Usable - предмет можно использовать.
Usable.Building - предмет является постройкой. Usable.Consumable - предмет расходуется при использовании. Usable.Stance - использует определенные анимации. Usable.Tool - предмет является инструментом. Usable.Weapon - предмет является оружием. Классификации типов предметов прописаны в библиотеке BP_ItemsLibrary, и можно проверять, относится ли предмет к определенному типу предметов.
43
BP_Item Описание Для размещения предметов на уровне используется класс BP_Item. Объект этого же класса создается при выбрасывании предмета из слота контейнера. Класс имплементирует интерфейс B PI_InteractionObject, чтобы игрок мог с ним взаимодействовать с помощью компонента B P_InteractionComponent. Класс реплицируется.
Выброшенный из инвентаря предмет будет уничтожен спустя какое-то время, с помощью таймера. При падении на землю или в воду предмет проигрывает звук, настроенный в таблице для этого предмета. Переменные ItemHandle - идентификатор предмета в таблице DT_Items. ID - идентификатор. Amount - количество предметов в стаке при спавне. Durability - текущая прочность предмета при спавне. Decay - оставшееся время разложения предмета при спавне.
44
SimulatePhysics - показатель того, должна ли быть включена симуляция физики для предмета. DecayTickTime - время таймера для обновления значения разложения предмета. DestroyTime - время, через которое предмет будет уничтожен после выбрасывания. InWater - показатель того, что предмет находится в воде. ItemData - полная информация о предмете, основанная на значениях переменных при спавне. SaveID - идентификатор объекта для системы сохранения.
45
BP_ContainerComponent Описание Компонент хранит текущую информацию о предметах и ресурсах в контейнере. Содержит функции по добавлению и удалению предметов и ресурсов, функции проверки наличия требуемых предметов и ресурсов в контейнере, а также функцию подсчета общего веса предметов. При изменении предмета в слоте контейнера, отправляется запрос на изменение информации в слоте контейнера в пользовательском интерфейсе активных игроков, которые используют этот компонент в данный момент. Компонент реплицируется и его необходимо инициализировать на сервере.
Переменные Slots - количество слотов в контейнере. DecayFactor - коэффициент скорости разложения предметов в контейнере. DecayTickTime - время таймера разложения. Items - предметах в слотах контейнера. Resources - ресурсы в контейнере. ActivePlayers - игроки, которые используют контейнер.
46
DropPrimitiveComponent - ссылка на компонент, положение которого будет использовано для выбрасывания предметов. DropLocation - точка, которая будет использована для создания выбрасываемых предметов. DropLocationOverridden - показатель того, что требуется перегружать локацию в которой будут создаваться выбрасываемые из контейнера предметы. DecaySlots - массив слотов, на которые действует таймер разложения. Weight - общий вес всех предметов в контейнере. SaveID - идентификатор для системы сохранения и загрузки. Связывающие события
OnOpened - происходит, когда открывается хотя бы одним игроком. OnClosed - происходит, когда закрывается всеми игроками. OnSlotItemChanged - происходит, когда предмет в слоте контейнера изменяется. OnWeightChanged - происходит, когда общий вес предметов изменяется. OnItemAdded - происходит, когда предмет добавляется в контейнер.
47
BP_EquipmentComponent Описание Наследуется от компонент BP_ContainerComponent. Хранит информацию об экипированных предметах. Компонент реплицируется и должен быть инициализирован на сервере.
Связывающие события
OnEquipmentChanged - происходит, когда предмет в слоте экипировке изменяется.
48
BP_HotbarComponent Описание Наследуется от компонента BP_ContainerComponent. Хранит информацию о предметах в панели быстрого доступа. Содержит функции и переменные для выбора текущего слота в панели быстрого доступа. Компонент реплицируется и должен быть инициализирован на сервере.
Переменные SelectedItemSlot - индекс текущего выбранного слота. Связывающие события OnSelectedItemChanged - происходит, когда предмет в выбранном слоте быстрого доступа изменяется.
49
BP_CraftingComponent Описание Компонент позволяет создавать предметы по выбранным чертежам и добавлять их в инициализированный контейнер. Чертежи могут быть добавлены в очередь и обрабатываться по порядку. Одновременно могут обрабатываться несколько чертежей, в зависимости от настройки компонента. Процесс производства происходит в автоматическом режиме, но может быть приостановлен. Компонент реплицируется и должен быть инициализирован на сервере.
Переменные Container - ссылка на контейнер, из которого берутся требуемые предметы и куда будут добавляться готовые предметы. CraftingTickTimerHandle - идентификатор таймера производства. ActivePlayers - активные игроки, использующие компонент. BlueprintsQueue - очередь чертежей, находящихся в производстве. SaveID - идентификатор для системы сохранения и загрузки. CraftingListHandle - идентификатор списка производства из таблицы данных DT_CraftingLists.
50
CraftingEnabled - показатель того, что производство включено. Autocrafting - показатель того, что производство будет автоматически начинаться, если есть предметы на производство какого-либо чертежа из списка. CraftingTickTime - интервал таймера производства, для обновления прогресса. MulticraftCount - количество чертежей, одновременно находящихся в производстве. CompleteEventBinds - если включена, будет вызывать событие OnCraftingCompleted. Связывающие события
OnCraftingStarted - происходит, когда производство чертежей начинается. OnCraftingEnded - происходит, когда производство чертежей заканчивается. OnOpened - происходит, когда открывается хотя бы одним игроком. OnClosed - происходит, когда закрывается всеми игроками. OnCraftingCompleted - происходит, когда производство чертежа выполнено.
51
BP_FuelGeneratorComponent Описание Компонент позволяет запускать производство, в зависимости от наличия определенного типа топлива в контейнере. Если топливо в наличии, вызывает событие включения, которое может быть связано с компонентом производства. Каждый тип топлива имеет свое время горения, по истечению которого вызывается событие выключения, при отсутствии дополнительного топлива в контейнере. Имеет таймер для генерации результата горения, который вызывает событие OnGenerationTick. Также имеет дополнительный таймер для генерации отходов горения, который вызывает событие OnWasteGenerationTick. Например в костре это событие используется для генерации угля при горении. Компонент реплицируется и должен быть инициализирован на сервере.
52
Переменные Container - ссылка на контейнер, из которого будет расходоваться топливо. BurnCycleTimerHandle - идентификатор таймера для цикла горения. CurrentFuelType - тип топлива, которое используется для текущего цикла горения. BurnGenerationTimerHandle - идентификатор цикла генерации горения. WasteGenerationTimerHandle - идентификатор цикла генерации отходов. IsTurnedOn - показатель того, работает генератор в данный момент или нет. SaveID - идентификатор для системы сохранения и загрузки. FuelTypes - возможные типы топлива. FoliageCycleTime - время горения травы. WoodCycleTime - время горения дерева. CoalCycleTime - время горения угля. LiquidFuelCycleTime - время горения жидкого топлива. GenerationTime - время генерации события OnGenerationTick в о время процесса горения. WasteGenerationTime - время генерации события OnWasteGenerationTick во время процесса горения. Связывающие события OnTurnedOn - происходит, когда начинается процесс горения. OnTurnedOff - происходит, когда заканчивается процесс горения. OnGenerationTick - происходит по таймеру. OnWasteGenerationTick - происходит по таймеру. 53
BP_TradeComponent Описание Компонент позволяющий производить продажу и покупку предметов с помощью выбранного списка предметов для торговли. Компонент реплицируется и должен быть инициализирован на сервере.
Переменные
TradeListHandle - идентификатор списка предметов для торговли из таблицы данных DT_TradeLists. TradeList - список предметов для торговли. ItemsToSell - предметы на продажу.
54
Взаимодействие игрока с инвентарем и экипировкой Функции для взаимодействия с инвентарем и экипировкой находятся в интерфейсе BPI_Player и имплементированы в классе B P_PlayerController, но сам функционал этих функций находится в классе BP_PlayerManagerComponent. Для открытия инвентаря можно воспользоваться клавишами [ I ] или [ Tab ].
Предметы в инвентаре можно перетаскивать в другие слоты путем зажатия левой кнопки мыши. С помощью клавиши [ Shift ] можно взять половину стака из слота, а с помощью клавиши [ Ctrl ] один предмет из стака. Предметы из инвентаря можно выбрасывать путем перетаскивания иконки предмета из инвентаря на пустое место. Также их можно быстро выбросить нажав по ним правой кнопкой мыши с зажатой клавишей [ Ctrl ]. Если предметы являются экипировкой их можно поместить в слоты экипировки с помощью перетаскивания или при нажатии правой кнопки мыши. Если предметы могут быть использованы их можно поместить в слоты быстрого доступа с помощью перетаскивания или при нажатии правой кнопки мыши. Функционал описанных выше действий можно найти в виджетах UI_ItemSlot и UI_EquipmentSlot.
55
Взаимодействие игрока с другими контейнерами Для открытия контейнера используется функция OpenContainer_BPI и з интерфейса BPI_Player. Ее можно вызывать при взаимодействии с объектами, у которых есть компонент контейнера.
Закрытие контейнера осуществляется нажатием на клавишу [ Tab ].
Нажатие на кнопку [ Take All ], переместит все предметы из контейнера в инвентарь игрока. Функционал контейнера можно найти в виджете U I_LootContainer. Функционал отображения контейнера можно найти в виджете U I_HUD.
56
Взаимодействие игрока с компонентом производства Для открытия компонента производства вместе его контейнером используется функция OpenCraftingPlace_BPI и з интерфейса BPI_Player. Ее можно вызывать при взаимодействии с объектами, у которых есть компонент производства.
Закрыть инвентарь вместе с местом производства можно с помощью кнопки [ Tab ].
Если при вызове функции O penCraftingPlace_BPI включить переменную OnlyCraftingQueue, то будет отображена только очередь производства без списка доступных чертежей и информации о выбранном чертеже. При нажатии на кнопку [ Craft ] и при наличии требуемых ресурсов запустится процесс производства, который будет происходить в компоненте BP_CraftingComponent. Процесс производства можно отменить нажав кнопку с крестиком. Функции управления процессом производства находятся в B PI_Player и имплементированы в классе BP_PlayerController, но сам функционал этих функций находится в классе B P_PlayerManagerComponent.
57
Взаимодействие игрока с компонентом генератора Игрок может взаимодействовать с компонентом генератора с помощью виджета UI_InteractionSwitcher.
Обработка событий нажатия на кнопки включения и выключения находятся внутри блюпринта виджета. Для открытия виджета переключателя используется функция OpenInteractionSwitcher_BPI из интерфейса B PI_Player. Ее можно вызывать при взаимодействии с объектами, у которых есть компонент генератора.
Функции управления переключателем находятся в B PI_Player и имплементированы в классе B P_PlayerController, но сам функционал этих функций находится в классе BP_PlayerManagerComponent. Пример взаимодействия игрока с костром.
58
Взаимодействие игрока с компонентом торговли Для открытия компонента торговли и обновления списка доступных для продажи предметов используется функция T ryStartTrade_BPI из интерфейса BPI_Player. Ее можно вызывать при взаимодействии с объектами, у которых есть компонент торговли или во время диалогов с персонажами с помощью функции TryStartTradeWithPlayer_BPI.
Закрыть инвентарь вместе с местом производства можно с помощью кнопки [ Tab ].
При нажатии на кнопку [ Sell ] будет произведена попытка продажи выбранного предмета по цене продажи. При нажатии на кнопку [ Buy ] будет произведена попытка покупки выбранного предмета по указанной цене. Обработка событий нажатия на эти кнопки находится в UI_SelectedTradingItemInfo. Функции управления процессом торговли находятся в B PI_Player и имплементированы в классе BP_PlayerController, но сам функционал этих функций находится в классе B P_PlayerManagerComponent.
59
Взаимодействие игрока с панелью быстрого доступа Игрок может взаимодействовать с панелью быстрого доступа и её активным слотом. Предметы, которые могут быть использованы, можно поместить в слоты быстрого доступа с помощью перетаскивания или нажав на них правой кнопкой мыши.
Игрок может выбирать активный слот с помощью клавиш [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ]. Функции выбора слота панели быстрого доступа находятся в B P_PlayerController в графе I nputs. Сам функционал переключения находится в компоненте BP_PlayerManagerComponent.
60
В зависимости от выбранного предмета игрок может совершать определенные действия. Большинство используемых предметов можно использовать на левую кнопку мыши, но у некоторых есть дополнительное действие. Например, оружием можно не только атаковать, но и блокировать удары. Функции взаимодействия игроком с предметами в панели быстрого доступа находятся в BP_PlayerController в графе Inputs. Сам функционал взаимодействия находится в компоненте BP_PlayerManagerComponent и классе B P_PlayerCharacter.
61
Система строительства Описание Система строительства позволяет игроку строить различные объекты на ландшафте или на мешах, являющихся ландшафтом, а также позволяет строить объекты друг на друге, если они могут соединяться. Функции управления процессом строительства находятся в интерфейсе BPI_Player и имплементированы в классе BP_PlayerController. Сам функционал управления процессом строительства находится в компоненте B P_BuildComponent. Система строительства связана с системой предметов и ресурсов и процесс проверки наличия требуемых предметов для строительства, ремонта и улучшения происходит в компоненте B P_PlayerManagerComponent. В классе BP_Building_BuildingObject реализованы общие функции и переменные для строительного объекта, а также функции для получения положения и поворота объекта при его присоединении к другому объекту. Эти функции настроены индивидуально для каждого типа объекта. Для хранения информации об уникальных строительных объектах была создана структура S TR_BuildingObject. Все строительные объекты хранятся в таблице данных DT_BuildingObjects. Функционал для отображения строительного меню для пользовательского интерфейса находится в BP_PlayerManagerComponent. А функционал самого строительное меню находится в UI_BuildingMenu. Для приватизации территории используется интерфейс B PI_Ownership. Его должны имплементировать объекты, которые запрещают строительство для других игроков. Строительство запрещено для игроков, которые не авторизованы в этих объектах.
62
STR_BuildingObject
ID - идентификатор строительного объекта из таблицы DT_BuildingObjects. Name - название строительного объекта. Class - класс строительного объекта. Icon - иконка строительного объекта для пользовательского интерфейса. Description - описание строительного объекта для пользовательского интерфейса. StaticMesh - меш строительного объекта. DestructibleMesh - разрушаемый меш строительного объекта. MaxDurability - максимальная прочность строительного объекта. CanBeDamaged - показатель того, может ли объект получать урон. UseMeshSockets - показатель того, что для соединения объектов будут использоваться сокеты из статик меша. CorrectMeshTransform - смещение меша. BuildingBlueprint - идентификатор чертежа для строительства объекта, из которого можно получить список требуемых для строительства ресурсов. UpgradeObject - идентификатор объекта, до которого можно улучшить данный объект. UpgradeBlueprnt - идентификатор чертежа для улучшения объекта, из которого
63
можно получить список требуемых для улучшения ресурсов. RepairBlueprint - идентификатор чертежа для ремонта объекта, из которого можно получить список требуемых для ремонта ресурсов. RepairFactor - коэффициент ремонта, который показывает долю восстанавливаемой прочности объекта за одно ремонтное взаимодействие.
64
BP_Building_BuildingObject Описание Все строительные объекты наследуются от класса BP_Building_BuildingObject. В нем реализованы все функции и переменные для процесса соединения объектов друг с другом. Эти функции настраиваются индивидуально для каждого строительного объекта в соответствующем классе.
65
Класс имплементирует интерфейсы B PI_Floor, BPI_Durability и B PI_SaveData.
BPI_Floor - интерфейс для работы с этажом объекта. BPI_Durability - интерфейс для работы с прочностью объекта. BPI_SaveData - интерфейс для работы с системой сохранения и загрузки. Переменные BuildingObjectHandle - идентификатор строительного объекта из таблицы DT_BuildingObjects. ID - идентификатор строительного объекта. BuildingType - тип строительного объекта. Settings - загруженные настройки для объекта из таблицы DT_BuildingObjects. Built - показатель того, построен объект или находится в режиме строительства. PlacedOnLandscape - показатель того, размещается ли объект на ландшафте или нет. IsFloor - показатель того, является ли объект полом на котором можно размещать объекты. SocketName - название сокета для объекта, при его попытке соединения с другими. CanRotate - показатель того, можно ли объект вращать на месте. RotateAngle - угол, на который объект вращается на месте за раз.
66
Floor - текущий номер этажа объекта. Durability - текущее значение прочности объекта. SaveID - идентификатор объекта в системе сохранения и загрузки. ManualBuildTarget - ссылка на объект, с которым нужно соединить данный объект в режиме ручного строительства. ManualInputRotation - значение вращения объекта в режиме ручного строительства. BuildSound - звук, который проигрывается при завершении строительства объекта. DestructSound - звук, который проигрывается при разрушении объекта. RepairSound - звук, который проигрывается при ремонте объекта. UpgradeSound - звук, который проигрывается при улучшении объекта. RotateSound - звук, который проигрывается при повороте объекта. Функции Default - различные вспомогательные функции для получения уровня пола, проверки опоры объекта, получения положения сокета и тд. Build - функции, которые используются в процессе строительства. Repair - функции, которые используются для ремонта объекта. Upgrade - функции, которые используются для улучшения объекта. Remove - функции, которые используются для удаления объекта. Rotate - функции, которые используются для поворота объекта. Manual Build - функции, которые используются для ручного строительства объекта.
67
BP_BuildComponent Описание Компонент позволяет игроку управлять процессом строительства. Также содержит функции для удаления, разрушения , улучшения, ремонта и вращения выбранных объектов. Компонент реплицируется.
Компонент должен быть добавлен и инициализирован в P layerController.
Переменные PlayerController - ссылка на игрока. InputRotationZ - значение для поворота объекта при строительстве. InputRange - значение дальности строительства объекта. InputOffsetZ - смещение высоты строительства объекта.
68
MaxInputRange - максимальная дальность строительства. MaxInputOffsetZ - максимальное смещение высоты строительства. BuildingObject - ссылка на текущий строящийся объекта. BuildLocation - текущее положение строящегося объекта. BuildRotation - текущий поворот строящегося объекта. TargetObject - ссылка на целевой объект. CanBuild - показатель того, что объект может быть построен в данной точке. DisplayedFloor - отображаемый этаж. NeedUpdateDisplayedFloor - показатель того, что нужно обновить отображаемый этаж. LastBuildingObjectClass - класс последнего построенного объекта. LastBuildingObjectID - идентификатор последнего построенного объекта. BuildMode - текущий режим строительства. IsLocalPlayer - показатель того, что компонент находится у локального игрока. TraceToMouse - показатель того, что поиск целевого объекта или точки строительства происходит при использовании курсора. TopDownView - показатель того, что включен вид сверху. FloorOffset - смещение фундаментов. DestructRemaining - время, через которое исчезнут чанки дестрактибл меша. GridMode - показатель того, что включен режим строительства по сетке. GridModeForProps - показатель того, что включен режим строительства по сетке для размещаемых объектов.
69
GridFoundationZ - смещение по оси Z для фундаментов в режиме строительства по сетке. GridPropsOffset - смещение для размещаемых объектов в режиме строительства по сетке. GridCorrectOffset - корректирующее смещение в режиме строительства по сетке. NearSnappingMode - показатель того, что при соединении объектов будет выбираться ближайший к целевой точке сокет. AutoStartBuild - показатель того, что после постройки объекта, автоматически начнется строительство того же объекта.
Функции Описание и комментарии находятся внутри функций. Init Component - функция инициализации компонента. Inputs - функции изменения входных параметров для управления процессом строительства. Interactions - функции взаимодействия со строительными объектами, такие как постройка, ремонт, улучшение и тд. Update Building Process - функции по обновлению строительного процесса, изменение положения объекта и определение может ли он быть построен в выбранном месте.
Связывающие события
OnBuildCompleted - происходит, когда завершается строительство объекта.
70
Типы строительных объектов Foundation - квадратный фундамент, который можно разместить на ландшафте. Является полом. С ним можно соединять другие фундаменты, рампы и строить стены и напольные объекты. Функционал находится в классе BP_Building_Foundation. Ramp - рампа, которую можно разместить на ландшафте рядом с фундаментом. Функционал находится в классе BP_Building_Ramp. Wall - стена, которую можно разместить на полу. С ней можно соединять другие стены, потолки и настенные объекты. Функционал находится в классе BP_Building_Wall. DoorFrame - дверной проем, который можно разместить на полу. Также является стеной. В нем можно размещать дверь. Функционал находится в классе BP_Building_DoorFrame. WindowFrame - оконный проем, который можно разместить на полу. Также является стеной. В нем можно размещать окно. Функционал находится в классе BP_Building_WindowFrame. Ceiling - квадратный потолок, который можно разместить на стенах. Является полом. С ним можно соединять другие потолки, стены и напольные объекты. Функционал находится в классе BP_Building_Ceiling. Stairs - лестница, которую можно разместить на полу. Функционал находится в классе BP_Building_Stairs. Door - дверь, которую можно разместить в дверном проеме. На дверь можно установить замок. Функционал находится в классе BP_Building_Door.
71
Window - окно, которое можно разместить в оконном проеме. Функционал находится в классе BP_Building_Window. FloorObject - объект размещаемых на полу. Функционал находится в классе BP_Building_FloorObject. DoorLock - замок, который можно разместить на двери. Функционал находится в классе BP_Building_DoorLock. TriangleFoundation - треугольный фундамент, который можно разместить на ландшафте. Является полом. С ним можно соединять другие фундаменты, рампы, и строить стены и напольные объекты. Функционал находится в классе BP_Building_TriangleFoundation. TriangleCeiling - треугольный потолок, который можно разместить на стенах. Является полом. С ним можно соединять другие потолки, стены и напольные объекты. Функционал находится в классе BP_Building_TriangleCeiling. WallObject - объект размещаемый на стене. Функционал находится в классе BP_Building_WallObject. TriangleWall - треугольная стена, которую можно размещать на полу и других стенах. На ней можно размещать крышу. Функционал находится в классе BP_Building_TriangleWallLeft и в классе BP_Building_TriangleWallRight. Roof - крыша, которую можно размещать на треугольных стенах. Функционал находится в классе BP_Building_Roof. Fence - забор, который можно размещать на полу. Функционал находится в классе BP_Building_Fence. TopRoofWall - специальная треугольная стена для верхней части крыши, которую можно размещать на полу и стенах. На ней можно размещать верхнюю часть крыши. Функционал находится в классе BP_Building_TopRoofWall.
72
TopRoof - верхняя часть крыши, которую можно разместить на специальной треугольной стене. Функционал находится в классе BP_Building_TopRoof.
73
Система заменяемых инстансов Описание Для оптимизации огромного количества объектов расположенных в мире с которыми можно взаимодействовать, была создана система инстансов. Деревья, интерактивные папоротники и собираемые ресурсы, размещаются в мире с помощью Foliage Tool, а в игре система автоматически заменяет их на нужные акторы. Общий функционал динамической замены инстанса на актор находится в классе BP_InstancedComponent_Base. Для каждого типа объекта, который будет заменяться в процессе игры, необходимо создать дочерний класс с индивидуальными настройками. Поиск мешей, которые необходимо заменять на акторы производится с помощью класса BP_FoliageCheckerComponent. Этот компонент необходимо добавлять в блюпринт игрового персонажа. Для определения объектов, которые нужно заменять были созданы и настроены дополнительные типы коллизии.
Коллизию типа StaticFoliage необходимо задавать мешам, которые будут динамически заменяться на акторы. Она обязательно должна блокировать FoliageChecker коллизию. Коллизией типа FoliageChecker должен обладать только актор B P_FoliageChecker. Тип коллизии D ynamicFoliage создан для физики интерактивных папоротников.
74
BP_FoliageCheckerComponent Класс B P_FoliageCheckerComponent осуществляет поиск и автоматическую замену инстансов на экторы. Он создает актор с коллизией определенного радиуса и по тику перемещает его в положение игрового персонажа. Сталкиваясь с инстансами, вызывается событие O nHitStaticFoliage, которое вызывает функцию взаимодействия Interact с BP_InstancedComponent_Base и замену инстанса на актор.
Этот компонент должен быть добавлен в класс игрового персонажа. Компонент не реплицируется. Настроить радиус взаимодействия можно в переменной SphereRadius класса BP_FoliageCheckerComponent.
У мешей инстансов обязательно должна быть коллизия, с которой может столкнуться коллизия чекера. Добавить или настроить коллизию можно внутри самого меша.
75
BP_InstancedComponent_Base Класс B P_InstancedComponent_Base предоставляет общий функционал для замены инстансов на акторы. Для каждого типа объекта, который будет заменяться в процессе игры, необходимо создать дочерний класс с индивидуальными настройками. Функция I nteract удаляет инстанс и вызывает функцию Spawn для спавна объекта. Если этот объект реплицируется, переменная OnlyServerSpawn д олжна быть t rue.
Функция S pawn должна быть перегружена индивидуально для каждого типа объекта. Например так она будет выглядеть для интерактивных папоротников.
Класс имплементирует интерфейс B PI_SaveData.
BPI_SaveData - интерфейс для работы с системой сохранения и загрузки.
76
Настройка заменяемых инстансов Для добавления нового типа заменяемого инстанса необходимо: 1. Создать актор, которым будет заменяться инстанс. 2. Создать дочерний класс от B P_InstancedComponent_Base. В этом классе необходимо переопределить функцию S pawn и включить O nlyServerSpawn переменную, если заменяемый актор реплицируется. 3. Создать F oliage Type настроить его используя созданный компонент, выбрать тип коллизии StaticFoliage.
77
Система диалогов Описание Диалоговая система позволяет игроку общаться с персонажами с помощью выбора реплик, получать необходимую информацию, продвигаться по сюжету, торговать и тд. События вызываемые при воспроизведении реплик, а также условия появления этих реплик прописываются в классе, наследуемом от B P_Dialogue_Base индивидуально для каждого персонажа, с которым можно взаимодействовать. Для хранения данных о диалогах и их репликах созданы структуры STR_Dialogue и STR_DialogueReply с оответственно. Для диалогов используется таблица данных DT_Dialogues, а для реплик диалогов используется таблица данных DT_DialogueReplies. Для персонажа, с которым можно вести диалог, необходимо имплементировать интерфейс BPI_InteractionObject и тогда с ним можно будет взаимодействовать, чтобы начать диалог. Также необходимо имплементировать функции начала, завершения и воспроизведения диалоговых реплик персонажем из интерфейса BPI_Character. Для базового персонажа они уже имплементированы.
С персонажем можно начать диалог, если он может взаимодействовать и идентификатор диалога существует в таблице DT_Dialogues.
78
Функции управления диалогом находятся в интерфейсе B PI_Player и имплементированы в классе BP_PlayerController. Сам функционал находится в компоненте BP_PlayerManagerComponent. Визуальный интерфейс диалогов и отдельных реплик находится в UI_Dialogue и UI_DialogueReply.
79
STR_Dialogue Для хранения данных о диалоге с конкретным персонажем используется структура STR_Dialogue. На ее основе создана таблица данных DT_Dialogues, которая хранит данные о диалогах со всеми персонажами.
DialogueClass - класс актора диалога, который будет создан при начале диалога. GameQuery - требование к тегам игры, для начала диалога. PlayerQuery - требование к тегам игрока, для начала диалога. FirstReplies - идентификаторы для выбора первой реплики из таблицы DT_DialogueReplies с которых может начаться диалог.
Если нет определенных требований для начала диалога с персонажем, то GameQuery и PlayerQuery д олжны быть выставлены как на рисунке выше, иначе диалог не будет начинаться.
80
STR_DialogueReply Для хранения данных о репликах персонажей используется структура STR_DialogueReply. На ее основе была создана таблица данных DT_DialogueReplies, которая хранит данные всех реплик персонажей.
ReplyHandle - идентификатор реплики в таблице DT_DialogueReplies. IsPlayer - реплика выбираемая игроком. SpeakerName - перегружает имя персонажа реплики. SpeakerText - текст реплики. SpeakerIcon - перегружает иконку персонажа реплики. ReplyHeader - перегружает текст реплики в режиме выбора. NextReplies - следующие возможные реплики. ConditionsID - идентификатор условий для появления реплики. EventID - идентификатор событий происходящих при воспроизведении реплики. ReplySound - звук воспроизводимый во время реплики. ReplyWave - локализованный звук воспроизводимый во время реплики.
81
BP_Dialogue_Base BP_Dialogue_Base - это базовый класс для диалогов. Он включает функционал управления процессом диалога, а именно выбор реплик и их последовательность. Предоставляет выбор реплик в зависимости от условий, и вызывает события при воспроизведении определенных реплик. Для создания уникальных диалогов со своими условиями и событиями необходимо создать новый класс на основе BP_Dialogue_Base. Этот класс потом можно будет выбрать для структуры в таблице DT_Dialogues. Условия для появления реплик в диалоге проверяются функцией CheckConditions в зависимости от ConditionsID в структуре реплики. Э ту функцию можно переопределить и прописать уникальные условия в новом классе для диалога. Подробнее об этом написано в разделе У словия реплик. События при воспроизведении реплик в диалоге вызываются функцией DoDialogueEvent в зависимости от E ventID в структуре реплики. Эту функцию можно переопределить и прописать уникальные события в новом классе для диалога. Подробнее об этом написано в разделе С обытия реплик.
82
Условия реплик Условия, требуемые для появления определенных реплик, необходимо прописывать индивидуально для диалога с каждым персонажем. Проверка условий реплик осуществляется с использование идентификатора ConditionsID и з структуры STR_DialogueReplies.
Проверка условий должна производиться в перегруженной функции CheckConditions диалогового класса персонажа. Если совпадений не найдено или идентификатор отсутствует функция должна возвращать t rue.
В условиях можно проверять наличие определенных тегов или ресурсов у игрока, проверять уровень игрового персонажа и тд.
83
События реплик События реплик происходят при воспроизведении реплики. Они вызываются с помощью функции D oDialogueEvent п о идентификатору из структуры STR_DialogueReply.
Эти события необходимо прописывать индивидуально в диалоговом классе персонажа.
С помощью этих событий можно добавлять теги или ресурсы игроку, добавлять новые чертежи или записи в дневник и многое другое.
84
Схема диалога Для упрощения разработки диалогов можно использовать блок схемы. На них наглядно показана последовательность реплик в диалогах, условия для появления определенных реплик, а также события которые вызываются при их воспроизведении. Например такого рода блок схема была составлена для ветки диалога с Фредом для квестовой цепочки Rat Race.
85
Система квестов Описание Система квестов позволяет ставить перед игроком определенные задачи и отслеживать прогресс их выполнения. Также есть возможность добавлять разные записи в дневник и выводить активные задания на основной экран. Базовый класс для заданий: B P_Quest_Base. На его основе необходимо создавать все остальные задания. Задания могут включать несколько стадий. Для выполнения каждой стадии, необходимо выполнить одну и более задач. Базовый класс для задач: BP_QuestTaskComponent_Base. На основе этого класса созданы основные задачи, которые могут быть использованы в заданиях. Другие задачи также необходимо создавать на основе этого класса. Функции добавления заданий и записей в дневник находятся в интерфейсе BPI_Player и имплементированы в классе B P_PlayerController. Сам функционал находится в компоненте BP_PlayerManagerComponent. Функционал управления активными заданиями также находится там. Для хранения данных о записях в дневнике создана структура S TR_JournalNote. Все записи дневника хранятся в таблице DT_JournalNotes. Визуальный интерфейс окна активных заданий находится в U I_ActiveQuests. Визуальный интерфейс дневника находится в UI_Journal, а для записи в дневник в UI_JournalNote.
86
BP_Quest_Base BP_Quest_Base - это базовый класс заданий. Он включает функционал управления процессом выполнения задания, а именно его инициализацию, проверку прогресса задач и выполнение стадий задания. Задания могут включать неограниченное число стадий. Для создания нового задания необходимо создать новый класс на основе BP_Quest_Base. Каждая стадия задания может включать несколько активных задач. Для настройки задания необходимо настроить переменные:
QuestID - идентификатор задания. DefaultQuestStage - название начальной стадии задания. StartQuestTags - теги, добавляемые игроку при начале задания. CompleteQuestTags - теги, добавляемые игроку при выполнении задания. FailQuestTags - теги, добавляемые игроку при провале задания. Для настройки задания также необходимо модифицировать три функции: StartQuestStage, InitQuestStage и CompleteQuestStage. Функция S tartQuestStage переводит задание на указанную стадию и вызывает функцию I nitQuestStage, где производится инициализация активных задач для этой стадии. При начале задания автоматически переводит задание на стадию указанную в переменной DefaultQuestStage.
87
Функция C ompleteQuestStage вызывается автоматически, когда все активные задачи выполнены или когда выполнена одна из главных задач. Модифицировав функцию StartQuestStage, можно, например, добавлять заметки в дневник, добавлять игровые теги игроку, выдавать предметы и тд, в момент начала стадии задания. Тоже самое можно делать в момент выполнения стадии в функции CompleteQuestStage.
Инициализация задач происходит в функции I nitQuestStage. Задачи можно добавить и настроить в окне компонентов задания.
88
Чтобы начать задание в игре необходимо вызвать функцию S tartQuest_BPI из интерфейса B PI_Player для целевого игрока.
Задание будет создано в игре и добавлено к активным заданиям.
89
BP_QuestTaskComponent_Base BP_QuestTaskComponent_Base - базовый класс для задачи заданий.
FinishOnce - завершение задачи происходит только один раз. MainTask - задача является главной. Стадия задания сразу завершается при выполнении такой задачи. FailWhenFinished - при завершении задачи, задание будет провалено. На основе BP_QuestTaskComponent_Base с озданы и настроены основные задачи, которые могут быть использованы в заданиях. Основные задачи BP_QuestTaskComponent_PlayerTags - задача, которая завершается, если игрок имеет или получает требуемые игровые теги. BP_QuestTaskComponent_GameTags - задача, которая завершается, если игра имеет или получает требуемые игровые теги. BP_QuestTaskComponent_ItemRequired - задача, которая завершается, если в контейнерах игрока есть или появляется требуемый предмет. BP_QuestTaskComponent_ConsumeItem - задача, которая завершается, если игрок использует требуемый предмет определенное число раз. BP_QuestTaskComponent_CutTree - задача, которая завершается, когда игрок срубает дерево определенное число раз. BP_QuestTaskComponent_DestructMine - задача, которая завершается, когда игрок разрушает рудную жилу определенное число раз. BP_QuestTaskComponent_KillCharacter - задача, которая завершается, когда игрок убивает персонажа определенное число раз. BP_QuestTaskComponent_Building - задача, которая завершается, когда игрок завершает строительство постройки, определенное число раз.
90
BP_QuestTaskComponent_Crafting - задача, которая завершается, когда игрок завершает создание по предметов по чертежу определенное число раз. BP_QuestTaskComponent_TimeRemaining - задача, которая завершается через определенное время. Другие задачи для заданий также должны быть созданы на основе BP_QuestTaskComponent_Base. Задачи можно сразу добавить в окно компонентов блюпринта заданий и инициализировать в функции InitQuestStage. Перед инициализацией задач для стадии задания нужно обязательно вызывать функцию ClearTask, для очищения списка предыдущих активных задач. Задачи также можно создавать и настраивать при их инициализации с помощью нод AddComponent...
91
Записи в дневнике Для хранения данных о записях в дневнике создана структура S TR_JournalNote. Все записи дневника хранятся в таблице DT_JournalNotes. Функции добавления заданий и записей в дневник находятся в интерфейсе BPI_Player и имплементированы в классе B P_PlayerController. Сам функционал находится в компоненте BP_PlayerManagerComponent. Функционал управления активными заданиями также находится там. STR_JournalNote
NoteID - идентификатор записи в дневнике. NoteType - тип записи в дневнике. Name - название записи в дневнике. Текст - текст записи в дневнике. QuestProgressText - текущий прогресс задания для записи в дневнике. QuestIsTracked - показатель того, что запись отслеживается в окне активных заданий. Для добавления записи в дневник необходимо вызвать функцию A ddJournalNote_BPI из интерфейса BPI_Player для игрока. Запись будет добавлена в журнал с идентификатором N oteID. Если в журнале уже имеется запись с таким же идентификатором, текст новой записи добавится к уже существующей.
92
Чтобы добавить текст к существующей записи в дневнике необходимо вызвать функцию A ddJournalNoteText_BPI из интерфейса BPI_Player д ля записи с конкретным идентификатором для целевого игрока.
Для удаления записи с конкретным идентификатором необходимо вызвать функцию RemoveJournalNote_BPI из интерфейса BPI_Player для целевого игрока.
Чтобы связать запись в дневнике с активных заданием значение NoteID и з структуры STR_JournalNote д олжно соответствовать QuestID и з класса нужного задания.
93
Система сохранения и загрузки Описание Система сохранения и загрузки представляет собой очень комплексную систему, функционал которой распространяется на множество классов и компонентов. Для сохранения и загрузки настроек игры и информации об игровых сессиях используется класс BP_GameSave_Settings. Для сохранения и загрузки информации об игровой сессии, используется класс BP_GameSave_Session. Для хранения информации об игроке используется структура S TR_SaveData_Player. Для хранения информации об игровом уровне используется структура STR_SaveData_Level. Чтобы актор или компонент мог сохраняться и загружаться он должен имплементировать интерфейс BPI_SaveData. Для каждого типа объекта требуется своя структура для сохранения. Функционал сохранения и загрузки игры находится в BP_GameInstance в функциях категории S ave and Load.
94
STR_SaveData_Player STR_SaveData_Player - структура, которая хранит информацию об игроке для сохранения и загрузки.
95
PlayerName - имя игрока. HairTypeIndex - индекс типа прически персонажа. HairColorIndex - индекс цвета прически персонажа. PantsColorIndex - индекс цвета штанов персонажа. SkinColorIndex - индекс цвета кожи персонажа. Level - текущий уровень игрока. Experience - текущий опыт игрока. AvailableSkillPoints - доступные очки способностей. Attributes - атрибуты игрока. Health - значение здоровья персонажа. Energy - значение энергии персонажа. Hunger - значение сытости персонажа. Thirst - значение жажды персонажа. InventoryItems - предметы в инвентаре персонажа. EquipmentItems - предметы экипировки персонажа. HotbarItems - предметы в хотбаре персонажа. JournalNotes - записи в дневнике игрока. PlayerTags - теги игрока. AdditionalBlueprints - дополнительные чертежи игрока. IsAlive - показатель того, что персонаж игрока жив. Transform - положение персонажа игрока. Resources - ресурсы игрока. ActiveQuests - активные задания игрока.
96
STR_SaveData_Level STR_SaveData_Level - структура, которая используется для сохранения данных об объектах на уровне.
LevelName - название уровня. Actors - общие данные акторов на уровне. BuildingObjects - данные строительных объектов на уровне. References - данные о взаимосвязях объектов на уровне. Items - данные о предметах на уровне. Locks - данные о запирающихся замках на уровне. Ownerships - данные о собственности на уровне. Collectables - данные о собираемых объектах на уровне. Trees - данные о деревьях на уровне. Mines - данные о рудных жилах на уровне.
97
ContainerComponents - данные компонентов контейнеров на уровне. CraftingComponents - данные компонентов производства на уровне. FuelGeneratorComponents - данные компонентов генератора на уровне. InstancedMeshComponents - данные компонентов инстансов на уровне.
98
BP_GameSave_Settings Описание Наследуется от класса SaveGame. Это класс, используемый для сохранения и загрузки настроек игры и для сохранения и загрузки слотов сохраненных игр. Загружается при запуске игры из класса B P_GameInstance. Переменные HardwareBenchmarkUsed - показатель того, что оптимальные настройки графики уже были установлены. AutosaveMode - текущий режим настроек автосохранения игры. ShowFloatingText - индикатор показа всплывающего текста во время игры. ShowCharacterState - отображение состояния игрового персонажа на пользовательском интерфейсе во время игры. ShowEnemyCharacterStates - отображение состояния других персонажей во время игры. ShowMinimap - отображение миникарты на пользовательском интерфейсе во время игры. ShowMarks - отображение метки во время игры. ShowBuildingDurability - отображение состояния построек во время игры. MasterVolume - значение общей громкости звуков. MusicVolume - значение громкости музыки. EffectsVolume - значение громкости эффектов. VoiceVolume - значение громкости речи. SingleplayerGameSaveNames - массив слотов, в которых сохранена игра в однопользовательском режиме.
99
MultiplayerGameSaveNames - массив слотов, в которых сохранена игра в многопользовательском режиме. GameSettingsSlot - слот, в котором сохраняются данные этого класса. Функции
SaveSettings - сохранение настроек в слот для сохранения настроек игры. AddSingleplayerSave - добавление слота в массив сохраненных игр в однопользовательском режиме. RemoveSingleplayerSave - удаление слота из массива сохраненных игр в однопользовательском режиме. AddMultiplayerSave - добавление слота в массив сохраненных игр в многопользовательском режиме. RemoveMultiplayerSave - удаление слота из массива сохраненных игр в многопользовательском режиме.
100
BP_GameSave_Session Описание Наследуется от класса SaveGame. Класс с сохраненной информацией о игровой сессии. Используется в BP_GameInstance для сохранения текущей игровой сессии, загрузки и сохранения данных об уровне и игроках. Имплементирует интерфейс BPI_GameSave и его функции. Эти функции необходимы для работы со временными данными во время выполнения функций сохранения и загрузки. Они вызываются акторами и компонентами, которые должны сохраняться и загружаться. Переменные SlotName - имя слота, в котором хранится сохранение. CurrentLevel - текущий уровень сохранения. IsMultiplayer - показатель многопользовательской сессии. HostPlayerData - сохранённые данные об игроке, который является хостом. ClientPlayersData - сохраненные данные об игроках. LevelsData - сохраненные данные об уровнях. GameTags - сохраненные теги игры. DateTime - время и дата сохранения. Temporary Level Data - переменные для временных данных для формирования структуры S TR_SaveData_Level. Формируются и используются во время процесса сохранения и загрузки игры.
101
Функции InitGameSave - инициализирует основные параметры сохранения. GetClientPlayerData - получение данных сохранения для конкретного игрока. SaveData - запись в слот сохранения. SaveCurrentLevelData - сохраняет данные о текущем уровне из временных переменных. GetLevelData - получение данных сохранения указанного уровня. ClearTemporaryLevelData - очищает временные переменные с данными об уровне. LoadTemporaryLevelData - загружает данные об уровне во временные переменные. UpdateClientData - обновляет данные сохранения для указанного игрока. UpdateClientsData - обновляет данные сохранения для всех указанных игроков.
102
BPI_SaveData BPI_SaveData - интерфейс, необходимый для сохранения данных актора или компонента на уровне.
Все функции интерфейса должны быть имплементированы в акторе или компоненте, для сохранения его данных с помощью системы сохранения и загрузки. InitSaveID_BPI - инициализирует объект для системы сохранения.
SetSaveID_BPI - задает идентификатор сохранения для объекта.
103
GetSaveID_BPI - получает идентификатор сохранения объекта.
SaveData_BPI - сохранение данных объекта. Для сохранения данных используются различные структуры. Например, функция сохранения предмета на уровне использует структуры STR_SaveData_Actor и S TR_SaveData_Item. Данные из этих структур передаются в экземпляр сохранения сессии с помощью интерфейса BPI_GameSave, и сохраняются во временных данных об уровне. После сохранения всех объектов уровня, временные данные формируют структуру уровня STR_SaveData_Level и сохраняются.
LoadData_BPI - загрузка данных объекта и инициализация загруженных данных.
104
Сохранение и загрузка уровня Функции сохранения и загрузки объектов уровня находятся интерфейсе BPI_GameInstance и имплементированы в B P_GameInstance.
Для сохранения игры в одиночном режиме используется функция SaveSingleplayerGame_BPI, а для сохранения игры в многопользовательском режиме используется функция S aveMultiplayerGame_BPI. Эти функции вызывают функцию SaveLevelData.
Для загрузки игры используются функции C ontinueGame_BPI и L oadGame_BPI.
105
Сохранение данных текущего уровня происходит в функции SaveLevelData в классе BP_GameInstance. Данная функция проходится по всем объектам с интерфейсом BPI_SaveData, данные которых нужно сохранить, затем формирует эти данные в структуре STR_SaveData_Level и сохраняет их в текущем сохранении BP_GameSave_Session. Загрузка данных уровня происходит в функции L oadLevelData в классе BP_GameInstance. Функция удаляет все объекты с интерфейсом BPI_SaveData из игры, а затем загружает и создаёт объекты из структуры STR_SaveData_Level.
106
Персонажи Базовый класс персонажа Описание BP_Character_Base - основной класс персонажа, который наследуется от стандартного класса Character. Является родительским классом всех классов персонажей проекта. Класс содержит базовый функционал персонажа. К нему относятся: ●
функционал для работы со шкалой здоровья
●
функционал для работы со шкалой энергии
●
функционал для работы с атрибутами персонажа
●
функционал для работа с состояниями персонажа
●
функционал динамического изменения скорости перемещения
●
функционал получения урона от падения с высоты
●
функционал падения в воду
●
функционал получения урона и блокирования
●
функционал смерти персонажа
●
функционал взаимодействия для атаки
●
функционал взаимодействия для диалога
●
функционал определения угроз
●
функционал для работы с поведением персонажа
Класс B P_Character_Base имплементирует интерфейсы B PI_Character и BPI_InteractionObject. В интерфейсе BPI_Character п редставлены функции для работы с состоянием персонажа и для вызова различных взаимодействий с ним. BPI_InteractionObject и спользуется для возможности взаимодействовать с персонажем, для начала диалога.
107
Компоненты Кроме основных компонентов из класса Character класс BP_Character_Base и меет компоненты сцены WaterSplashCollision, StateWidget, а также компоненты актора AttributesComponent, AIPerception и N avigationInvoker. Компонент WaterSplashCollision и спользуется для определения момента падения персонажа в воду и воспроизведения соответствующего звука. StateWidget к омпонент используется для отображения имени персонажа, а также его здоровья в игре. AttributesComponent - специальный компонент для работы с атрибутами персонажа, такими как максимальный запас здоровья, дальность атаки, урон в ближнем бою и тд. Компонент AIPerception п озволяет персонажу идентифицировать других персонажей как друзей или врагов. NavigationInvoker обновляет ближайшую местность для навигационной системы искусственного интеллекта.
108
Переменные Settings / Base CharacterName - имя персонажа CharacterIcon - иконка персонажа ShowCharacterState - показывать виджет состояния персонажа. ShowOnlyName - виджет состояния персонажа показывает только имя персонажа. ExperienceForKilling - количество опыта, которое дается за убийство персонажа. WalkSpeed - скорость перемещения персонажа во время ходьбы. RunSpeed - скорость перемещения персонажа во время бега. LootHandle - идентификатор добычи, которая выпадает при смерти персонажа. RagdollBone - название кости скелета для включения физики скелета. Fraction - фракция персонажа. DestroyCharacterTimer - время, через которое персонаж будет удален из игры после смерти.
109
Settings / AI PatrolPoint - текущая точка патрулирования персонажа. IsAggressive - показатель того, что персонаж агрессивен и будет нападать на любую угрозу, которую обнаружит. CanBeScared - показатель того, что персонаж может испугаться и начать убегать от угрозы. AggressionDistance - дистанция, на которой персонаж будет нападать на угрозу. ThreatDistance - дистанция, на которой персонаж может обнаружить угрозу. ChasingDistance - дистанция преследования цели. DialogueHandle - идентификатор диалога для персонажа. DialogueVoice - голос персонажа. RelationshipHandle - идентификатор взаимоотношений персонажа с другими фракциями.
110
State / Health Health - текущее значение здоровья персонажа. MaxHealth - максимальное значение здоровья персонажа. HealthRegeneration - скорость восстановления здоровья. State / Energy Energy - текущее значение энергии персонажа. MaxEnergy - максимальное значение энергии персонажа. EnergyRegeneration - скорость восстановления энергии. State / AI IsEnabledAI - показатель того, что ИИ персонажа включен. GuardLocation - точка, которую охраняет персонаж. IsScared - показатель того, что персонаж напуган. ThreatActor - актор, который представляет угрозу. TargetActor - актор, который является целью преследования персонажа. AggressiveActors - акторы, которые представляют непосредственную угрозу. Relationships - структура взаимоотношений персонажа с другими фракциями.
111
State / Interactions IsAlive - показатель того, что персонаж жив. IsAttacking - показатель того, что персонаж атакует. TryContinueAttack - показатель того, что персонаж должен продолжить атаку. CanAttack - показатель того, что персонаж может атаковать. UpperBody - показатель того, что проигрывается верхняя анимация. IsBlocking - показатель того, что персонаж блокирует. IsUsingItem - показатель того, что персонаж использует предмет. IsTalking - показатель того, что персонаж находится в диалоге. StartFallingLocation - положение при котором персонаж начал свободное падение. StartFallingTime - временная метка при которой персонаж начал свободное падение. ShouldRun - показатель того, что персонаж должен бежать. ShouldOverrideWalkSpeed - показатель того, что необходимо динамически перегрузить скорость движения персонажа. OverridedWalkSpeed - перегруженное значение скорости перемещения персонажа. OverridedWalkInterpSpeed - скорость интерполяции к перегруженному значению скорости перемещения персонажа. TargetSpeed - результирующая скорость перемещения персонажа.
112
Функции State SetHealthValues - задать значения максимального запаса здоровья и скорости его восстановления. SetEnergyValues - задать значения максимального запаса энергии и скорости ее восстановления. ChangeHealth - изменить текущее значение здоровья. Change Energy - изменить текущее значение энергии. UpdateStateSettings - обновить настройки состояний персонажа, например, максимальный запас здоровья и энергии после изменения атрибутов. UpdateStateWidget - обновить виджет состояния персонажа. UpdateStateWidgetRotation - обновить поворот виджета состояния персонажа относительно игрока. UpdateWalkSpeed - обновить скорость перемещения персонажа. OverrideWalkSpeed - перегрузить скорость перемещения персонажа. UpdateTick - вызов всех функций обновления. MovementModeChanged - вызывается, когда режим перемещения персонажа изменяется, например, персонаж начинает падение. InitCharacter - инициализировать все компоненты персонажа. SetCharacterName - задать имя персонажа.
113
AI EnableAI - включить ИИ персонажа. DisableAI - выключить ИИ персонажа. SetGuardLocation - точка, которую охраняет персонаж. TargetIsEnemy - проверяет является ли целевой актор враждебным для персонажа. TargetIsThreat - проверяет является ли целевой актор угрозой для персонажа. CheckThreatInRange - проверяет угрозы для персонажа в определенном радиусе. SetScared - переводит персонажа в напуганное состояние. UpdateThreatActor - обновляет актор угрозы. UpdateTargetActor - обновляет целевой актор. ClearThreatActor - очищает актор угрозы. ClearTargetActor - очищает целевой актор. SetPatrolPoint - задает новую точку патрулирования. UpdateRelationships - обновляет взаимоотношения персонажа с другими фракциями. UpdatePerceptionTarget - обновляет обнаруженный актор и определяет является ли он угрозой или целью.
114
Interactions / Base IsCanInteract - определяет может ли персонаж взаимодействовать в данный момент. EnableRagdoll - включает симуляцию физики для скелетал меша персонажа. SetInteractionState - задает значение для одного из состояний персонажа. TryInteract - попытка игрока взаимодействовать с персонажем. Death - выполняет действия при смерти персонажа. CheckFallingDamage - проверяет урон при падении персонажа. FallIntoWater - вызывает действия при падении персонажа в воду. PlayAnimation - вызывает воспроизведение указанной анимации. StopAnimation - прерывает воспроизведение анимаций. TryTaunt - пытается вызвать анимацию насмешки. TryAFK - пытается вызвать анимацию бездействия. EnableCapsuleCollision - включает или выключает коллизию капсулы персонажа. DestroyCharacterOnDeath - удаляет персонажа из игры после таймера. Interactions / Combat CheckBlocking - проверяет может ли персонаж заблокировать атаку. HitBlocked - выполняет действия при блокировании атаки. DamageTaken - выполняет действия при получении персонажем урона. CalculateTakenDamage - вычисляет урон получаемый персонажем при попадании по нему. TryAttack - попытка атаковать. 115
Interactions / Dialogue StartDialogue - вызывает действия при начале диалога с персонажем. FinishDialogue - вызывает действия при завершении диалога с персонажем. PlayDialogueReply - воспроизведении персонажем диалоговой реплики. UpdateTalkingState - вызывает действия при изменении состояния переменной IsTalking.
116
Компоненты персонажа BP_AttributesComponent Описание Функционал для работы с атрибутами персонажа находится в компоненте BP_AttributesComponent. К таким атрибутам относятся максимальный запас здоровья и энергии, урон, защита, сила, ловкость, выносливость и другие атрибуты. Компонент позволяет получать и подсчитывать значение того или иного атрибута. Система атрибутов основана на тегах, которые хранятся в таблице DT_GameplayTags_Attributes. В неё можно с легкостью добавлять новые атрибуты, характеристики, умения и перки. Для хранения данных атрибута используется структура STR_AttributeValue.
Функции для выполнения вычислений с атрибутами находятся в библиотеке BP_GameLibrary. Компонент содержит список базовых атрибутов, которые можно настраивать по желанию. Также имеются несколько дополнительных списков атрибутов, которые можно обновлять в процессе игры. К таким спискам относятся список атрибутов выбранных игроком, список атрибутов, даваемый предметами экипировки, список атрибутов даваемый временными эффектами и список атрибутов предмета выбранного в хотбаре. При изменении любого из этих списков вызывается функция CalculateAttributes, которая производит вычисление полученных атрибутов и вызывает событие O nAttributesChanged.
117
Также компонент позволяет настраивать зависимости одних атрибутов от других. Для хранения данных зависимости атрибутов используется структура STR_AttributeDependence. Настроить зависимости атрибутов можно в переменной A ttributeDependencies.
Подсчет зависимостей атрибутов осуществляется в функции CalculateAttributeDependencies и вызывается каждый раз при обновлении любого списка атрибутов в функции C alculateAttributes.
Например, на скрине выше показано, как влияет сила персонажа на наносимый им урон и максимальный переносимый персонажем вес.
118
Настройки Для компонента BP_AttributesComponent можно настроить базовые атрибуты, которые будут у персонажа, а также зависимости атрибутов друг от друга. Настроить базовые атрибуты можно выбрав компонент в списке компонентов персонажа, затем изменив поле BaseAttributes в окне D etails. Зависимости атрибутов друг от друга можно изменить в поле A ttributeDependencies.
119
BP_FootstepComponent Описание Компонент BP_FootstepComponent п озволяет воспроизводить звуковые и визуальные эффекты во время движения персонажа в зависимости от поверхности, на которую он наступает. Также система автоматически определяет, движется ли персонаж по воде, и воспроизводит соответствующие звуки. Система использует разные типы физических поверхностей, которые прописываются в разделе E ngine - Physics в настройках проекта.
Для материалов, по которым персонаж сможет передвигаться необходимо создать и настроить соответствующие физические материалы.
120
В настройках материалов или слоев можно установить физический материал, который будет им соответствовать.
Поверхность, по которой передвигается персонаж, можно переопределить с помощью акторов B P_SurfaceOverrider_Base расположив их в нужном месте.
CollisionExtend - размеры области. SurfaceType - определяет тип поверхности. IsPuddle - определяет будет ли воспроизводиться звук воды.
121
Действия проигрывания звука шагов, а также визуальные эффекты происходят в функции TryFootstep. Эта функция вызывается анимационным нотифаем BP_Notify_Footstep и з анимаций. Такие нотифаи необходимо расставить во всех анимациях, где персонаж ходит, бегает, прыгает и приземляется. Каждый нотифай в анимации необходимо настраивать отдельно. FootstepType - тип касания поверхности. В зависимости от типа касания воспроизводится соответствующий звук. PlaySound - показатель того, нужно ли воспроизводить звук касания. IsLeftFoot - определяет какой ногой персонаж касается поверхности, левой или правой. FootIndex - определяет индекс ноги, которой персонаж касается поверхности. Для персонажей с более чем двумя ногами.
122
Настройки Настройки компонента B P_FootstepComponent для разных персонажей могут отличаться. Необходимо убедиться, что в используются правильные кости ног в зависимости от скелета персонажа. Посмотреть названия костей ног можно в используемом персонажем скелете. Настроить используемые компонентом кости ног можно выбрав компонент в окне компонентов персонажа и изменив их в разделе Settings / Sockets.
Звуки шагов воспроизводимые для каждой поверхности настраиваются в D etails компонента BP_FootstepComponent в разделе Settings / Sounds. Отпечаток оставляемый ногой, а также поверхности на которых он оставляется и визуальные эффекты настраиваются в разделе S ettings / Effects.
123
BP_FoliageCheckerComponent Описание Класс B P_FoliageCheckerComponent осуществляет поиск и автоматическую замену инстансов на экторы. Он создает актор с коллизией определенного радиуса и по тику перемещает его в положение игрового персонажа. Является частью системы заменяемых инстансов о которой подробно расписано в соответствующем разделе. С истема заменяемых инстансов Настройки Для компонента B P_FoliageCheckerComponent можно настроить радиус автоматической замены инстансов. Сделать это можно выбрав компонент в списке компонентов, а затем изменив поле SphereRadius в окне D etails.
124
Класс игрового персонажа Описание Функционал игрового персонажа находится в классе BP_Character_Player. Включает весь функционал родительского класса B P_Character_Base. Включает функционал игрового персонажа. К нему относится: ●
функционал управления персонажем
●
функционал плавания персонажа
●
функционал для работы со шкалой голода
●
функционал для работы со шкалой жажды
●
функционал для работы со шкалой кислорода
●
функционал поворота персонажа относительно камеры игрока
●
функционал для работы кастомизации персонажа
●
функционал для работы с предметами экипировки
●
функционал для взаимодействия с оружием ближнего боя
●
функционал для взаимодействия с инструментами
●
функционал для взаимодействия с расходуемыми предметами
Класс B P_Character_Player имплементирует интерфейс BPI_PlayerCharacter. В этом интерфейсе представлены функции для работы с состояниями игрового персонажа, для работы с его кастомизацией и для вызова функций взаимодействия с хотбаром.
125
Компоненты Включает все компоненты из класса BP_Character_Base. Эти компоненты помечены как Inherited. Их описание можно найти в разделе Б азовый класс персонажа. Скелетал меш компоненты HeadMesh, BodyMesh, PantsMesh, HandsMesh и F eetMesh используются для кастомизации персонажа. Эти компоненты также задействованы в системе экипировки. WeaponMesh - статик меш компонент, который используется для отображения выбранного в хотбаре предмета. Компоненты CameraBoom и F ollowCamera используются для системы игровой камеры. FoliageCheckerComponent и спользуется в системе заменяемых инстансов, которая описывается в разделе Система заменяемых инстансов. BreathPoint - компонент сцены, который используется в системе плавания. Он определяет находится персонаж под водой или нет и должен ли он расходовать кислород. InventoryContainer - контейнер инвентаря персонажа. EquipmentContainer - контейнер экипировки персонажа. HotbarContainer - контейнер хотбара персонажа.
126
FootstepComponent п озволяет оставлять следы от ног и воспроизводить звуки касания ног в зависимости от типа касаемой поверхности. CraftingComponent - компонент производства персонажа. Позволяет ему изготавливать различные предметы.
127
Переменные Settings / Customization EquipmentCharacterID - идентификатор персонажа, для получения меша экипировки. DefaultHeadMesh - изначальный скелетал меш головы персонажа для компонента H eadMesh. DefaultBodyMesh - изначальный скелетал меш туловища персонажа для компонента B odyMesh. DefaultPantsMesh - изначальный скелетал меш штанов персонажа для компонента P antsMesh. DefaultHandsMesh - изначальный скелетал меш рук персонажа для компонента HandsMesh. DefaultFeetMesh - изначальный скелетал меш ног персонажа для компонента FeetMesh. DefaultHairColor - изначальный цвет прически персонажа. DefaultPantsColor - изначальный цвет штанов персонажа. DefaultSkinColor - изначальный цвет кожи персонажа. CustomizedHairColors - список возможных цветов прически персонажа. CustomizedPantsColors - список возможных цветов штанов персонажа. CustomizedSkinColors - список возможных цветов кожи персонажа. CustomizedHeadMeshes - список возможных скелетал мешей головы персонажа. CustomizedPantsMeshes - список возможных скелетал мешей штанов персонажа.
128
Settings / Interactions SprintSpeed - скорость персонажа во время спринта. BaseEnergyRestoration - базовая скорость восстановления энергии в секунду. JumpEnergyConsumption - количество энергии, которое расходуется персонажем во время прыжка. AttackEnergyConsumption - количество энергии, которое расходуется персонажем во время атаки. ToolInteractionEnergyConsumption - количество энергии, которое расходуется персонажем на взаимодействие с инструментами. SprintEnergyConsumption - количество энергии, которое расходуется персонажем во время спринта в секунду. DefaultImpactSound - звук, который воспроизводится при попадании по поверхности без настроенного физического материала. Settings / Anims В этой категории находятся настроенные переменные для анимаций, которые воспроизводятся при различных взаимодействиях персонажа.
129
State / Interactions ShouldSprint - определяет, что персонаж должен спринтовать. ShouldPopUp - определяет, что персонаж должен всплывать на поверхность воды. ShouldDive - определяет, что персонаж должен погружаться под воду. Stance - определяет стойку персонажа. EquipmentStance - определяет стойку в зависимости от экипировки персонажа. IsSprinting - показатель того, что персонаж находится в режиме спринта. Weight - определяет общий вес предметов в контейнерах персонажа. MaxWeight - максимально допустимый вес предметов, которые может переносить персонаж в контейнерах. IsOverloaded - показатель того, что персонаж перегружен. UsedItemSlot - слот предмета, который будет использован в функции использования предмета. TargetHotbarSlot - целевой слот хотбара, на который персонаж должен переключиться. DigActor - ссылка на актор, который будет использован функции удачного выкапывания. DigSurface - тип поверхности, который будет использован в функции удачного выкапывания. DigLocation - точка копания, которая будет использована в функции удачного выкапывания. IsTired - показатель того, что персонаж устал. PlayerName - имя игрока персонажа. IsSleep - показатель того, что персонаж спит. SelectedHotbarTimerHandle - идентификатор таймера для выбора хотбар слота.
130
State / Rotation TargetCharacterRotation - определяет требуемый поворот персонажа. CharacterRotation - текущий поворот персонажа. PlayerControlRotation - текущий поворот контроллера игрока. State / Oxygen Oxygen - текущее значение кислорода персонажа. MaxOxygen - максимальное значение кислорода персонажа. OxygenRegeneration - скорость восстановления кислорода в секунду. ConsumeOxygen - показатель того, что персонаж должен расходовать кислород. OxygenConsumption - скорость расходования кислорода под водой в секунду. State / Hunger Hunger - текущее значение шкалы голода персонажа. MaxHunger - максимальное значение шкалы голода персонажа. HungerConsumption - скорость уменьшения шкалы голода в секунду.
131
State / Thirst Thirst - текущее значение шкалы жажды персонажа. MaxThirst - максимальное значение шкалы жажды персонажа. ThirstConsumption - скорость уменьшения шкалы жажды в секунду. State / Customization DynamicHeadMaterial - динамический материал для головы персонажа. DynamicBodyMaterial - динамический материал для туловища персонажа. DynamicPantsMaterial - динамический материал для штанов персонажа. DynamicHandsMaterial - динамический материал для рук персонажа. DynamicFeetMaterial - динамический материал для ног персонажа. SourceMaterial - исходный материал персонажа. EquipedHeadMesh - скелетал меш головы в экипировке. EquipedBodyMesh - скелетал меш туловища в экипировке. EquipedPantsMesh - скелетал меш штанов в экипировке. EquipedHandsMesh - скелетал меш рук в экипировке. EquipedFeetMesh - скелетал меш ног в экипировке. EquipedWeaponMesh - статический меш предмета в выбранном слоте хотбара.
132
Функции State CheckSprint - проверяет находится ли персонаж в режиме спринта и обновляет соответствующие переменные. CheckSwimming - проверяет находится ли персонаж в режиме плавания и обновляет соответствующие переменные. CheckOxygen - проверяет текущее значение шкалы кислорода и обновляет соответствующие переменные. Если это значение на нуле, тратит здоровье персонажа. CheckHunger - проверяет текущее значение шкалы голода персонажа и обновляет соответствующие переменные. Если это значение на нуле, тратит здоровье персонажа. CheckThirst - проверяет текущее значение шкалы жажды персонажа и обновляет соответствующие переменные. Если это значение на нуле, тратит здоровье персонажа. ChangeHunger - изменить текущее значение шкалы голода. ChangeThirst - изменить текущее значение шкалы жажды. ChangeOxygen - изменить текущее значение шкалы кислорода. CheckEnergy - проверяет текущее значение энергии и обновляет соответствующие переменные. LoadCharacterData - загружает данные персонажа и обновляет имя персонажа, кастомизацию, атрибуты и предметы в контейнерах.
133
UpdateCharacterRotation - обновляет поворот персонажа относительно камеры игрока. InitComponents - инициализирует компоненты игрового персонажа. UpdateWeight - обновляет общий вес предметов в контейнерах. UpdateStateSettings - перегрузка - обновить дополнительные настройки состояний игрового персонажа. UpdateWalkSpeed - перегрузка - обновить текущую скорость движения игрового персонажа. UpdateTick - перегрузка - вызов всех функций проверки и обновления. MovementModeChanged - перегрузка - вызывается, когда режим перемещения персонажа изменяется, например, персонаж начинает плавать. InitCharacter - перегрузка - инициализировать все компоненты персонажа.
134
Interactions / Items EquipmentChanged - вызывается, когда изменяется предмет экипировки персонажа. ItemMainInteraction - попытка воспроизвести основное взаимодействие выбранного в хотбаре предмета. SelectedItemChanged - вызывается, когда изменяется предмет в выбранном слоте хотбара. ItemSubInteraction - попытка воспроизвести дополнительное взаимодействие выбранного в хотбаре предмета. MakeDeathLoot - создает контейнер с добычей при смерти персонажа. TryUseItem - попытка воспроизвести использование выбранного в хотбаре предмета. ItemUsed_Server - расходует используемый предмет и вызывает его способность. TryToChangeHotbarSlot - попытка изменить выбранный хотбар слот. TryToSelectHotbarSlot - попытка выбрать хотбар слот. ItemUsed - вызывает функцию I temUsed_Server н а сервере. Вызывается нотифаем BP_Notify_ItemUsed в момент, когда предмет должен быть использован при воспроизведении анимации. BlockUsedSlot - блокирует выбранный хотбар слот во время воспроизведения анимации.
135
Interactions / Combat ContinueAttack - попытка продолжить атаку. TraceDealDamage_Server - находит возможные цели атаки с помощью трейса на сервере и наносит им соответствующий урон. GetBaseDamage - возвращает основной урон, который может наносить персонаж. GetImpactSound - возвращает звук удара в зависимости от поверхности удара. TraceDealDamage - вызывает функцию TraceDealDamage_Server н а сервере. Вызывается нотифаем BP_Notify_TraceDamage в момент нанесения урона при воспроизведении анимации атаки. HitBlocked - перегрузка - воспроизводит анимацию блокирования удара в зависимости от текущей стойки. DamageTaken - перегрузка - воспроизводит анимацию получения урона. TryAttack - перегрузка - попытка начать атаку и воспроизведение соответствующей анимации.
136
Interactions / Tools TryToolInteraction - попытка воспроизвести анимацию взаимодействия с выбранным в хотбар слоте инструментом. StartDigging - проверка поверхности, на которой производится раскопка и воспроизведение соответствующей анимации. CheckToolHitAnimation - воспроизведение анимации попадания инструментом. CompleteDigging_Server - успешно завершает процесс копания на сервере. GetWoodcuttingDamage - возвращает урон, который персонаж может наносить при ударе по дереву. GetMiningDamage - возвращает урон, который персонаж может наносить при ударе по рудной жиле. CompleteDigging - вызывает функцию CompleteDigging_Server н а сервере. Вызывается нотифаем BP_Notify_CompleteDigging в момент завершения раскопки при воспроизведении анимации копания лопатой.
137
Interactions / Player FallAsleep - воспроизводит анимацию, при которой персонаж ложится спать. Также отключает коллизию капсулы персонажа. WakeUp - воспроизводит анимацию, при которой персонаж просыпается. Включает коллизию капсулу персонажа. CraftingCompleted - вызывается, когда персонаж заканчивает изготовление предмета. PlayerUnpossessed - вызывается, когда игрок теряет контроль над персонажем и выходит из игры.
138
Interactions / Base Jump_Server - воспроизведение анимации прыжка в зависимости от стойки и расход энергии на прыжок. TryJump - попытка прыжка для персонажа. PlayItemSound_Server - воспроизведение звука предмета на сервере. Вызывает воспроизведение звука у всех игроков. PlayItemSound - вызывает функцию PlayItemSound_Server н а сервере. Вызывается нотифаем B P_Notify_PlayItemSound из анимации. Death - перегрузка - выполняет действия при смерти игрового персонажа. CheckFallingDamage - перегрузка - проверяет и наносит урон при падении персонажа. Воспроизводит соответствующую анимацию. UpdateStance - проверяет и обновляет стойку. Interactions / Dialogue StartDialogue - перегрузка - переводит игрового персонажа в режим диалога. FinishDialogue - перегрузка - выводит игрового персонажа из режима диалога. UpdateTalkingState - перегрузка - скрывает оружие персонажа. PlayDialogueReply - перегрузка - воспроизводит реплику диалога.
139
Customization CustomizeHead - изменение меша головы на меш из массива в зависимости от индекса. CustomizeSkinColor - изменение цвета кожи на цвет из массива в зависимости от индекса. CustomizeHairColor - изменение цвета прически на цвет из массива в зависимости от индекса. CustomizePantsColor - изменение цвета штанов на цвет из массива в зависимости от индекса.
140
Работа с анимациями Анимационные нотифаи Анимационные нотифаи используются для вызова различных функций во время анимаций. Эти нотифаи могут быть использованы для задания особых состояний для персонажа во время анимаций, для вызова функций нанесения урона, вызов функций касания ногами поверхностей и тд. Существует два стандартных класса нотифаев: ●
AnimNotify - нотифай можно выставить в конкретный момент анимации. Класс имеет функцию для получения имени нотифая, а также функцию для срабатывания нотифая при его вызове. Эти функции можно переопределить.
●
AnimNotifyState - нотифай можно выставить на определенное время анимации. Класс имеет функцию для получения имени нотифая, функции, которые срабатывают в начале и в конце вызова нотифая, а также функцию которая срабатывает по тику на протяжении всего нотифая. Эти функции можно переопределить.
Нотифаи можно расположить в любой момент анимации.
141
Список нотифаев BP_Notify_CompleteDigging Вызывает функцию успешного копания лопатой для игрового персонажа. Для срабатывания персонаж должен имплементировать функцию C ompleteDigging_BPI из интерфейса BPI_PlayerCharacter. BP_Notify_Footstep Вызывает функцию касания ногой поверхности для персонажа. Для срабатывания персонаж должен иметь настроенный компонент BP_FootstepComponent. FootstepType - тип касания поверхности. PlaySound - определяет нужно ли воспроизводить звук касания. IsLeftFoot - определяет какой ногой персонаж коснулся поверхности, левой или правой. FootIndex - определяет индекс ноги с правой или левой стороны персонажа. BP_Notify_ItemUsed Вызывает функцию успешного завершения использования предмета для игрового персонажа. Для срабатывания персонаж должен имплементировать функцию ItemUsed_BPI из интерфейса B PI_PlayerCharacter. BP_Notify_PlayItemSound Вызывает функцию воспроизведения звука по названию для активного предмета персонажа. Для срабатывания персонаж должен имплементировать функцию PlayItemSound_BPI из интерфейса B PI_Character. SoundName - название звука. BP_Notify_TraceDamage Вызывает функции нанесения персонажем урона с помощью трейсов. Для срабатывания персонаж должен имплементировать функцию T raceDealDamage_BPI из интерфейса BPI_Character.
142
BP_NotifyState_BlockUsedSlot Блокирует предмет в активном слоте хотбара на время действия нотифая. Для работы класс персонажа должен имплементировать функцию B lockUsedSlot_BPI из интерфейса BPI_PlayerCharacter. BP_NotifyState_ContinueAttack На время действия нотифая переводит персонажа в состояние, в котором он может продолжить атаку. Для работы класс персонажа должен имплементировать функции GetInteractionState_BPI и C ontinueAttack_BPI из интерфейса B PI_Character. NextAnim - следующая анимация атаки. BP_NotifyState_InteractionState На время действия нотифая задает состояния для персонажа. Для работы класс персонажа должен имплементировать функцию SetInteractionState_BPI из интерфейса B PI_Character. InteractionState - состояние персонажа, которое будет задано. BP_NotifyState_OverrideWalkSpeed На время действия нотифая перегружает скорость передвижения персонажа. Для работы класс персонажа должен имплементировать функцию OverrideWalkSpeed_BPI из интерфейса BPI_Character. OverridedWalkSpeed - перегруженная скорость. OverridedInterpWalkSpeed - скорость изменения скорости.
143
BP_NotifyState_SetWeaponSocket На время действия нотифая меняет сокет крепления активного предмета персонажа. Для работы класс персонажа должен имплементировать функцию SetWeaponSocket_BPI из интерфейса BPI_Character. StartWeaponSocket - сокет, на который крепится активный предмет в начале действия нотифая. EndWeaponSocket - сокет, на который крепится активный предмет в конце действия нотифая.
144
Анимационный блюпринт Для работы с анимационным блюпринтом необходимо постоянно знать состояния персонажа. Для того чтобы получать и обновлять состояния персонажа необходимо перегрузить две функции: BlueprintInitializeAnimation и B lueprintUpdateAnimation вE vent Graph. Функция B lueprintInitializeAnimation вызывается при инициализации анимационного блюпринта. В этой функции необходимо инициализировать ссылку активного персонажа, чтобы получить доступ к переменным его состояния.
Функция B lueprintUpdateAnimation вызывается каждый тик перед началом блендинга анимаций. В этой функции необходимо определить и получить значения всех переменных состояний персонажа, перед тем как будет произведен бленд и выбор соответствующих анимаций.
145
В функции UpdateVariables п роизводится определение всех состояний персонажа и задаются значения соответствующим переменным. К таким переменным могут относиться скорость персонажа, текущий режим перемещения, показатель того, что персонаж жив, мертв и тд.
В функции UpdateVariables д ля игрового персонажа, происходит вызов трех функций для определения всех состояний необходимых для бленда анимаций. UpdateStateVariables - определяет переменные, необходимые для определения состояния персонажа. Здесь определяется жив персонаж или мертв, в какой стойке находится в зависимости от выбранного оружия и др. UpdateMovementVariables - определяет переменные, необходимые для определения текущего режима перемещения, скорости движения персонажа, его направление и тд. UpdateAimOffset - определяет переменные, необходимые для поворота головы персонажа в сторону, куда смотрит игрок.
146
Блендинг анимаций анимаций для главного персонажа зависит от режима перемещения персонажа. Основные переходы между анимациями персонажа находятся в MainStateMachine.
Здесь реализованы переходы между основными режимами перемещения. Персонаж находится в состоянии I dle / Move, если он находится на земле. После прыжка он переходит в состояние Jump_Cycle, до момента пока не приземлится. При приземлении он переходит в состояние Jump_End, а затем возвращается в Idle / Move. Если персонаж заходит в воду он переходит в состояние S wimming, пока не выберется на сушу. При смерти в воде он переходит в состояние I dle_Water_Death. Основная поза персонажа захватывается в MainPose.
147
Если персонаж находится на земле финальная поза персонажа получается из бленда верхней части тела и его основной позы. Если персонаж плавает или находится в воздухе, то используется только основная поза.
Бленд верхней части тела состоит из получения анимации персонажа в зависимости от экипируемого предмета, а также с дополнительным блендом головы персонажа и его рук. Основные переходы для верхней части тела находятся в StanceStateMachine.
148
Без активного предмета в руках персонаж находится в состоянии C ommon. Тип стойки персонажа с тем или иным предметом определяется переменной Stance. Как только эта переменная меняется на отличное от текущего состояние, происходит мгновенный переход в C onduit, который определяет дальнейший переход в зависимости от текущей стойки. Например, если персонаж экипирует оружие в активный слот произойдет переход C ommon > C onduit > Weapon. Из состояния W eapon персонаж может перейти в состояние B locking, если изменится переменная I sBlocking. По завершению блокирования персонаж автоматически вернется в состояние Weapon. Поза стойки персонажа захватывается в StancePose.
Финальный бленд верхней части тела получается после бленда стойки персонажа с аим офсетом и с отдельным блендом для каждой руки.
149
Воспроизведение различных анимаций взаимодействия, например, атака оружием или использование предметов вызываются непосредственно из блюпринтов персонажей. Каждая анимации должна быть настроена для воспроизведения в специальном слоте. Настройки анимаций хранятся в структуре STR_AnimMontagePlayData.
Anim - анимация. SlotName - слот анимационного блюпринта, для которого будет вызвана анимация. BlendInTime - время блендинга при входе в анимацию. BlendOutTime - время блендинга при выходе из анимации. InPlayRate - скорость воспроизведения анимации. LoopCount - количество повторений анимации. BlendOutTriggerTime - время относительно конца анимации, с которого начинается бленд выхода анимации. InTimeToStartMontageAt - время с которого начнется воспроизведение анимации. Каждый анимационный слот блендится по разному. Слот DefaultSlot н е блендится вообще и используется, когда нужно полностью воспроизвести анимацию вне зависимости от состояния персонажа.
150
Слот StateSlot - блендится после получения основной позы персонажа.
Слот UpperBodySlot - блендится для верхней части тела. Используется для анимаций, которые должны воспроизводиться на ходу, например, рубка деревьев или атака.
Слот Blocking - блендится во время состояния блокирования для верхней части тела. Используется для воспроизведения анимаций блокирования удара.
151
Искусственный интеллект Описание Искусственный интеллект основан на дереве поведения. Оно определяет состояние персонажа и задает ему определенные задачи, которые персонаж должен выполнить. Все неигровые персонажи управляются контроллерами класса B P_AIController_Base. В этом классе инициализируются основное дерево поведения B T_Base и блекборд BB_Base, который содержит переменные для работы с искусственным интеллектом персонажа. В базовом классе персонажа B P_Character_Base реализована основная логика для искусственного интеллекта. Персонаж может идентифицировать других персонажей как нейтрального, как угрозу или как врага. Если персонаж агрессивен ( IsAgressive ) и может атаковать ( CanAttack ), он будет автоматически нападать на угрозу как только обнаружит её. Если персонаж не может атаковать и может бояться ( CanBeScared ), он будет убегать от угрозы. Для персонажа может быть задана первая точка патрулирования, в которую он направится в начале игры или в момент спавна.
152
Блекборд BB_Base Блекборд используется для определения переменных для работы с искусственным интеллектом в дереве поведения. IsEnabledAI - показатель того, что дерево поведения активно для персонажа. IsAlive - показатель того, что персонаж жив. GuardLocation - точка, которую охраняет персонаж. TargetLocation - точка, в которую персонаж должен переместиться. TargetActor - ссылка на цель, которую преследует персонаж. ThreatActor - ссылка на основную угрозу для персонажа. PatrolPoint - точка патрулирования персонажа. IsScared - показатель того, что персонаж напуган. SelfActor - ссылка на самого персонажа. TargetIsAttacking - показатель того, что цель атакует. DistanceToTarget - дистанция до цели. DistanceToGuardLocation - дистанция до охраняемой точки.
153
Дерево поведения BT_Base Управление персонажами, которых контролирует искусственный интеллект, осуществляется с помощью дерева поведения. Для всех персонажей проекта используется базовое дерево поведения B T_Base. В зависимости от состояния блекборда B B_Base, определяется поведение персонажа.
Поведение персонажа выбирается в зависимости от того есть ли угроза для персонажа или нет.
154
Если персонаж агрессивен и может атаковать, угроза становится целью и персонаж начинает её преследовать, пока не убьет. Преследование прекращается если цель оторвется от персонажа на определенное расстояние или он уйдет от охраняемой точки на слишком большое расстояние.
Преследуя цель персонаж выбирает одну из 4 задач в зависимости от выполнения условий. 1. Персонаж проигрывает анимацию таунта. 2. Персонаж ставит блок, если цель его атакует в радиусе поражения. 3. Персонаж атакует цель, если она в радиусе поражения. 4. Персонаж перемещается к цели. В зависимости от расстояния до цели выбирается режим перемещения шаг или бег.
155
Если персонаж не может атаковать и может быть испуган, он начинает убегать от угрозы на определенное расстояние.
156
Если угроз для персонажа нет и задана точка патрулирования он направится к ней. Достигнув её он через определенное время направится к следующей точке патрулирования, если она задана, а если точка не задана останется патрулировать в текущей точке. После преследования цели персонаж возвращается в текущую точку патрулирования.
157
Если угроз для персонажа нет и точка патрулирования не задана, персонаж будет блуждать в охраняемой точке. Время от времени персонаж будет проигрывать анимацию бездействия. После преследования цели персонаж вернется в охраняемую точку.
158
Настройки проекта Настройки коллизии Для разных систем проекта было добавлено несколько типов коллизии. Настройки коллизии можно найти в P roject Settings в разделе Collision.
159
Настройки управления Настройки клавиш управления можно найти в P roject Settings в разделе I nput.
160
Настройки навигации ИИ Настройки для динамического обновления навигационного меша можно найти в Project Settings в разделе Navigation Mesh и в разделе Navigation System.
161
Настройки плагинов Для работы проекта обязательно должен быть включен плагин A pex Destruction.
162
Настройки STEAM Для поиска сессий через платформу S TEAM необходимо включить плагин O nline Subsystem Steam.
Также необходимо вставить в файл Config/DefaultEngine.ini следующие строки [/Script/Engine.GameEngine] +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.Stea mNetDriver",D riverClassNameFallback="OnlineSubsystemUtils.IpNetDriver") [OnlineSubsystem] DefaultPlatformService=Steam [OnlineSubsystemSteam] bEnabled=true SteamDevAppId=4 80 [/Script/OnlineSubsystemSteam.S teamNetDriver] NetConnectionClassName=" OnlineSubsystemSteam.SteamNetConnection
163