Требования
Теперь, когда вы создали первую персону и доработали её личность, взаимодействуя с ней в редакторе промптов, можно добавить NPC в диалог. Чтобы поговорить с NPC в игре, необходимо:
Определить в Verse новое
npc_behavior.Добавить
npc_behaviorв определение персонажа NPC.Добавить определение персонажа NPC в генератор NPC.
Убедиться, что голосовой чат включён, поскольку он необходим для диалога с NPC, обладающими персоной.
Создание пустого поведения NPC
Чтобы настроить пользовательское поведение NPC в Verse, выполните следующие действия:
В строке меню выберите Verse > Проводник Verse.
В проводнике Verse нажмите правой кнопкой мыши по названию вашего проекта и выберите Добавить новый файл Verse в проект, чтобы открыть окно Создание скрипта Verse.
В окне Создание скрипта Verse выберите шаблон Базовое поведение NPC.
В разделе Настройка назовите поведение NPC persona_npc_behavior.
Нажмите Создать, чтобы создать файл Verse.
Если вместо Базового поведения NPC выбрать Поведение NPC, а затем нажать Создать для persona_npc_behavior, созданный файл Verse будет содержать предопределённое npc_behavior с готовыми функциями, которые потребуется заменить описанными здесь вариантами поведения. В этом руководстве приведён полный скрипт npc_behavior на Verse, поэтому можно выбрать Базовое поведение NPC и нажать Создать или Создать пустой файл: в скрипте уже есть всё необходимое.
В persona_npc_behavior можно с помощью Verse определить и добавить persona_component для NPC. Все NPC, создаваемые генераторами NPC, являются агентами и имеют связанную с ними сущность. Через связанную с NPC сущность к его агенту можно добавлять компоненты графа сцены, например persona_component.
Компонент persona_component добавляется автоматически при добавлении модификатора персоны к NPC.
Поведение NPC определяется в Verse посредством наследования от базового класса npc_behavior. Подробнее о поведении NPC см. на странице Общие сведения о поведении NPC.
Изменение поведения NPC с персоной
Чтобы сделать персону NPC доступной игроку для диалога, необходимо использовать Verse. Если NPC не назначен игроку в качестве собеседника, игрок не сможет разговаривать с его персоной.
В следующих разделах скрипт Verse определяет persona_npc_behavior. Чтобы добавить этот код Verse в пустой файл persona_npc_behavior, выполните следующие действия:
В строке меню выберите Verse > Открыть проект в VS Code…
Когда откроется VS Code, найдите файл
persona_npc_behavior.verseв Проводнике VS Code.Скопируйте приведённое ниже содержимое файла
persona_npc_behavior.verseи вставьте его в файл Verse своего проекта.Скомпилируйте код Verse на панели инструментов UEFN или в VS Code.
С помощью Verse также можно создавать проекты, в которых команда игроков взаимодействует с агентами БЯМ. Verse обрабатывает взаимодействие нескольких игроков с агентами БЯМ с помощью функций CreateAudioTeamAndAddPlayers(), AddMember() и AddChatChannel().
Пошаговый разбор скрипта Verse приведён в разделе Объяснение скрипта.
persona_npc_behavior.verse
using { /Fortnite.com/AI }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Conversations }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Chat }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
Объяснение скрипта
TeamName— это название создаваемого голосового канала. ПеременнаяOptionAgentGroupсодержит группу агентов, добавляемых в голосовой канал (TeamName). ПеременнаяOptionVoiceChannelсодержит сам голосовой канал, к которому подключены игроки и NPC.Verse#Team name for the Team Voice Channel we are creating. TeamName<localizes>:message = "Persona Chat" #Variable that stores the agent group we are using to create the voice channel. We can use this group to create new channels or get current players in a conversation. var OptionAgentGroup:?agent_group(team_member_info) = false #Variable that stores the Voice Channel that our players and NPC will be inside of. This is what actually holds the conversation. var OptionVoiceChannel:?voice_channel(team_member_info) = falseAddPlayersAsConversationTargetсоздаёт голосовой диалог в реальном времени между NPC и всеми игроками в его игровом пространстве. Сначала функция собирает все необходимые данные. Только если это удаётся, она создаёт группу агентов и голосовой канал, подключает к ним игроков и NPC, а затем регистрирует игроков в качестве целей диалога.Сначала создаётся новая
agent_groupс типомteam_member_info, которая содержит всех участников диалога. Затем создаётся voice_channel, также с типомteam_member_info. Ему присваивается имяTeamName, а его параметру Group — только что созданная группа агентов. По этому каналу передаётся звук диалога.Затем функция заполняет группу: перебирает всех игроков в игровом пространстве, добавляя каждого из них, а после добавляет агента NPC, чтобы все участники оказались в одной группе.
После этого вызывается
SimEntity.AddChatChannel(TeamVoiceChannel), чтобы зарегистрировать голосовой канал в системе звукового чата и перевести его в активное состояние. Наконец, функция снова перебирает игроков и для каждого вызываетSetConversationTarget, чтобы через этот канал назначитьpersona_componentNPC целью диалога.На последнем этапе группа и канал сохраняются в переменных
OptionAgentGroupиOptionVoiceChannel, обёрнутых вoption{}, чтобы вспомогательные функции могли в дальнейшем обращаться к диалогу или изменять его без повторного создания.Verse# Add the Player as a conversation target for this NPC AddPlayersAsConversationTarget():void= if: NPCEntity := GetEntity[] Playspace := NPCEntity.GetPlayspaceForEntity[] NPCAgent := GetAgent[] Players := NPCEntity.GetPlayspaceForEntity[].GetPlayers() SimEntity := Players[0].GetSimulationEntity[] PersonaComponent := NPCEntity.GetComponent[persona_component]RemovePlayerAsConversationTargetудаляет одного игрока из диалога с NPC. Функция принимает один аргумент типа player и вызываетClearConversationTarget(), отсоединяя игрока от назначенной ему цели диалога. Это действие, обратное вызовуSetConversationTargetв функцииAddPlayersAsConversationTarget.Verse# Remove Player as a conversation target RemovePlayerAsConversationTarget(Player:player):void= Player.ClearConversationTarget() Logger.Print("Removed from NPC conversation", ?Level := log_level.Debug)OnBeginдобавляет структурированный вывод в сеанс и назначает игроку цель диалога. Если игроки могут присоединяться к игре после её начала, добавляйте их при возникновенииPlayerAddedEventили когда игрок подходит к NPC и активирует триггер.VerseOnBegin<override>()<suspends>:void= AddPlayersAsConversationTarget()В
OnEndConversationочищается и удаляется у всех игроков. Это рекомендуемый подход.VerseOnEnd<override>():void= for (Player : GetEntity[].GetPlayspaceForEntity[].GetPlayers()): RemovePlayerAsConversationTarget(Player)
Добавление поведения NPC в определение неигрового персонажа
Чтобы добавить persona_npc_behavior в определение неигрового персонажа, выполните следующие действия:
Перейдите к PersonaNPCDefinition на панели ресурсов.
Выберите PersonaNPCDefinition, чтобы открыть его для редактирования.
В разделе Поведение неигрового персонажа выберите Поведение Verse > persona_npc_behavior.
Перед закрытием вкладки обязательно сохраните изменения в определении неигрового персонажа.
Когда определение неигрового персонажа будет добавлено в генератор неигровых персонажей, персона этого NPC автоматически станет доступна игроку для диалога.
Добавление генератора неигровых персонажей с определением персонажа NPC
Чтобы создать NPC с настроенной персоной, добавьте на уровень генератор неигровых персонажей и PersonaNPCDefinition. Чтобы добавить устройство «Генератор неигровых персонажей», перетащите PersonaNPCDefinition из Панели ресурсов в окно просмотра.
Диалог с NPC
Чтобы поговорить с NPC, запустите сеанс и начните игру. Нажмите указанную на экране клавишу или кнопку устройства ввода и поговорите с NPC!