Самое сложное в наделении ИИ-персонажа физической агентностью — это не научить его добиваться успеха. Это научить его открыто сообщать о своих неудачах.
Персонаж, который поднимает ящик и несет его через движущуюся платформу, выглядит впечатляюще в демо-ролике. Персонаж, который идет к ящику, обнаруживает, что путь заблокирован, и говорит об этом простым языком — это тот, кого можно выпускать в релиз, потому что игрок понимает, что пошло не так, не открывая журнал вывода (Output Log).
Это вторая часть серии материалов о напарнике с ИИ Convai в Unreal Engine, созданной на основе примера Stack O Bot от Epic Games для Unreal Engine. В первой части персонаж получил осведомленность об окружении, данные о состоянии игры в реальном времени и встроенные действия для перемещения, которые позволяют ему подходить к объектам и вставать на нажимные плиты. Здесь он получает два собственных пользовательских действия: «поднять» (pickup) и «положить в» (drop-at), интегрированные в игровую логику, которая уже существовала в проекте.
В итоге ИИ-игрок принимает голосовую инструкцию, подходит к ящику, поднимает его, несет к нажимной плите, размещает его, ждет платформу и помогает завершить головоломку для двух игроков только с помощью общения.
Посмотрите полное руководство, которому пошагово следует эта статья:
Что было создано в первой части и что добавляет вторая?
В первой части уровень был зарегистрирован в системе метаданных сцены Convai, чтобы персонаж знал, какие объекты существуют, были добавлены отслеживаемые свойства, чтобы он знал, какие нажимные плиты активны, и использовались четыре встроенных обработчика действий, поставляемых с плагином.
Эти встроенные функции, описанные в центре действий персонажа, очень полезны. Однако они не охватывают поднятие предметов, потому что ни один плагин не может знать, что означает «поднять что-то» внутри вашего проекта. У Stack O Bot есть собственная система взаимодействия, написанная до появления Convai, и вторая часть посвящена тому, как подключиться к этой системе, а не заменять ее.
Таков общий принцип пользовательских действий в любом проекте. Convai обрабатывает намерения, определение целей и отчетность. Ваш код отвечает за часть, специфичную для вашей игры.
Если вы начинаете с нуля, руководство по настройке Stack O Bot поможет вам создать проект в Unreal Engine 5.8 и скопировать в него дельта-файлы руководства. Вам также понадобится плагин Convai для Unreal Engine из Fab и установленный редактор с выполненным входом в систему.
Смотрите полную первую часть этого руководства здесь:
Два исправления настройки, которые стоит сделать перед написанием пользовательского действия
В первой части остались два недочета. Оба они незначительны, но оба влияют на то, насколько надежными кажутся пользовательские действия.
Добавьте точку перемещения на нажимную плиту
Когда персонаж двигался к нажимной плите, он иногда останавливался у края, вместо того чтобы встать на плиту. Плита регистрируется как объект, поэтому механизм поиска пути останавливался на границах ее коллизии, что является правильным поведением по умолчанию для широких объектов, но неверным в данном случае.
Решение — точка перемещения (movement point). Откройте Blueprint нажимной плиты, перейдите в окно просмотра (viewport), выберите компонент Convai Object Component и добавьте точку перемещения в разделе объекта. Сдвиньте ее вверх, чтобы она находилась над плитой. Зеленая стрелка в окне просмотра показывает, где будет стоять персонаж, а отладчик Convai Debug Overlay подтвердит это позже во время выполнения.
Точки перемещения — это пункты назначения, заданные дизайнером, и механизм Convai выбирает достижимую точку с кратчайшим путем, а не просто координаты объекта. Каждая точка отображается как маркер с кольцом радиуса принятия, которое становится ярко-зеленым при включении и серым при отключении. Поскольку все нажимные плиты используют один общий Blueprint, точка дублируется для каждого экземпляра.
Стоит знать две детали из документации, когда вы начнете создавать свои собственные точки. Режим привязки по умолчанию — «Относительно объекта» (Relative To Object), что подходит для плиты или двери, в то время как «Сохранить мировое положение» (Keep World Position) подходит для чего-то вроде площадки лифта, которая должна оставаться на месте, пока платформа проезжает мимо. А активация опции «Создать отдельный пункт назначения» (Create Separate Destination) превращает точку в отдельную адресуемую цель, поэтому точка с именем «Другая сторона» на объекте с именем «Дверь» становится пунктом назначения, куда персонажа можно отправить по имени.
Выставьте состояние движущейся платформы как отслеживаемое свойство
В первой части была добавлена переменная активности для нажимных плит, чтобы Convai мог считывать, нажата ли каждая из них. У движущейся платформы не было эквивалента.
У платформы есть событие Toggle Platform, которое вызывает функцию Unreal Set Tick Enabled для актора. Это состояние тика и есть состояние платформы, поэтому его можно вывести через Convai Object Component в разделе отслеживаемых свойств (Tracked Properties). Добавьте свойство, выполните поиск по слову «tick» и выберите «Is Actor Tick Enabled».
Важная часть — это псевдоним (alias). Отправка имени свойства движка в языковую модель — это лишний шум. Переименуйте его в «active» и дайте простое описание, например: «движется вверх и вниз по повторяющемуся циклу, когда истинно». Теперь персонаж считывает факт о платформе, а не факт о системе тиков Unreal, что соответствует логике правильного именования и описания объектов в метаданных сцены.
Каждое отслеживаемое свойство содержит путь к свойству, описание, дополнительные аннотации для каждого значения в разделе «Дополнительно» и настройку «Should Respond», которая определяет, что происходит при изменении значения во время выполнения. «Should Respond» может принимать значения «Авто», «Всегда» или «Никогда», причем значение, отправляемое при запуске сессии, всегда «Никогда», чтобы персонаж узнал начальное значение, не озвучивая его. Система динамического контекста обрабатывает остальное, а страница поведения синхронизации объясняет правила пакетной обработки, если вам нужно, чтобы обновления применялись в определенный момент, а краткое руководство — это более быстрый путь к началу работы.
Что такое пользовательское действие Convai в Unreal Engine?
Пользовательское действие Convai — это именованная, описанная возможность, которую вы объявляете в компоненте Convai Chatbot в паре с событием или функцией Blueprint с тем же именем, которые запускаются, когда Convai выбирает это действие. Объявление отправляется в Convai как конфигурация действия при запуске сессии. Диспетчеризация происходит по имени во время выполнения.
Действие работает благодаря трем элементам. Шаблон, который находится в массиве действий (Actions) и сообщает Convai о существовании действия. Обработчик, который представляет собой событие Blueprint с соответствующим именем. И вызов завершения, который сообщает о результате и позволяет очереди действий продвигаться дальше.
Пропустите любой из этих трех элементов, и ИИ-NPC каждый раз будет выглядеть сломанным по-разному, поэтому страница устранения неполадок начинается с совета следить за журналом вывода (Output Log).
Как определить действия «поднять» и «положить в» с параметрами ссылки на актор?
Выберите персонажа, откройте его Blueprint, найдите компонент Convai Chatbot и откройте раздел «Действия» (Actions) в разделе «Окружение» (Environment).
Добавьте действие с именем «Pick Up». Ему нужно знать, что поднять, поэтому добавьте параметр с именем «target». Целью будет объект на сцене, поэтому установите его тип на «Actor Reference» — тот же тип, который используют встроенные обработчики для своих пунктов назначения.
Добавьте второе действие с именем «Drop At». Оно берет то, что персонаж уже держит, и кладет это куда-то, поэтому добавьте параметр с именем «destination», также типа «Actor Reference».
Затем напишите описания. Не длинные. Руководство по параметризованным действиям прямо говорит об этом: длинные описания увеличивают контекст, отправляемый в Convai, не улучшая при этом поведение, а пустое описание вполне уместно, если названия достаточно.
У действия Drop At (Положить) описание должно быть в любом случае, так как оно содержит предварительное условие. Фраза вроде «положить объект, который персонаж уже поднял, в указанное место» сообщает модели, что удержание предмета является обязательным условием, что определяет, когда она вообще обращается к этому действию. Подсказки о предварительных условиях в описаниях — это самый дешевый способ повысить надежность всей системы, и на странице с примерами работы показано несколько таких вариантов.
Компилируйте Blueprint персонажа после редактирования любого шаблона действия. Новое действие, которое никогда не появляется в режиме игры, почти всегда является нескомпилированным шаблоном, что на странице устранения неполадок указано как отдельный симптом.
Почему Actor Reference (ссылка на актора), а не обычная строка?
Convai поддерживает шесть типов параметров: String (строка), Actor Reference (ссылка на актора), Number (число), Bool (логическое значение), String с фиксированным списком выбора и Enum, привязанный к UENUM проекта. Полная таблица поведения типов находится в справочнике по Blueprint.
Actor Reference разрешается относительно ваших зарегистрированных массивов объектов и персонажей по точному имени. В этом разрешении и заключается ценность. Параметр типа String просто передал бы вам слово «ящик», и вам пришлось бы искать его самостоятельно — именно это метаданные сцены уже сделали за вас. Параметр типа Reference передает вам запись, что означает наличие активного указателя на актора, радиус принятия, любые созданные точки перемещения и описание, которое вы написали для модели.
В руководстве действие drop-at упрощено за счет того, что место назначения также является Actor Reference. Более общая реализация могла бы позволить персонажу рассуждать о местоположении, а не о зарегистрированном объекте, что является реальным выбором архитектуры, а не просто упрощением. Зарегистрированные объекты точны и ограничены. Свободные локации гибкие, но их гораздо сложнее проверить, поэтому пространственное восприятие вычисляет расстояние и достижимость в одном центральном месте.
Одно последствие, которое стоит учитывать: разрешение ссылок ищет только в зарегистрированном окружении и больше нигде. Если Convai возвращает имя, которое не совпадает с зарегистрированной записью, Get Param As Ref возвращает пустую запись. Короткие, уникальные зарегистрированные имена исправляют больше подобных проблем, чем любые изменения личности или промпта, а разделы о внимании и привязке ссылок описывают, что делать, если для модели два объекта выглядят одинаково.
Как создать каркас обработчика действий в Blueprint?
Нажмите правой кнопкой мыши на пустую область Event Graph (графа событий) Blueprint персонажа и найдите Create Convai Action Handler. Выберите Pick Up (Поднять) и подтвердите. Повторите то же самое для Drop At (Положить).
Редакторская утилита создает обработчик, названный в соответствии с действием, дает ему один вход Convai Result Action и в конце соединяет вызов Handle Action Completion. Вы можете выбрать событие на графе событий или функцию в ее собственном графе.
Вы также можете создавать обработчики вручную с помощью Custom Event (пользовательского события) с точным именем действия и одним параметром Convai Result Action, так как диспетчеризация происходит по имени. Все равно используйте утилиту. Несоответствие имен обработчиков и неверные сигнатуры параметров — две самые частые причины, по которым действие никогда не срабатывает, и обе исчезают, когда редактор сам пишет узел за вас. Unreal разрешает имена обработчиков без учета регистра, но Stop Moving и StopMoving остаются двумя разными именами.
Внутри Pick Up структура Convai Result Action содержит параметры. Получите цель с помощью Get Param As Ref, введя target, чтобы соответствовать объявленному имени. Это вернет структуру с нужной вам ссылкой и несколькими полями, которые вам не нужны, поэтому сверните те, которые не используете, чтобы сохранить читаемость графа.
Библиотека доступа предлагает Get Param As String, As Number, As Bool, As Ref, As Byte для перечислений, а также Has Param в качестве проверки и Get First Param для действий с одним параметром, с дополнительными слоями для выбора и обработки перечислений.
Что контролирует Handle Action Completion?
Каждый обработчик должен вызывать его на каждом пути выхода. Без этого вызова очередь действий останавливается, и последующие действия никогда не выполняются.
Он принимает пять входных данных. Is Successful (успешно ли), который по умолчанию равен true и управляет тем, продвигается ли очередь или очищается. Auto Report (автоотчет), который отправляет стандартное сообщение о результате обратно в Convai. Should Respond (должен ли отвечать), который решает, будет ли персонаж говорить о результате, и принимает значения Auto, Always или Never. Additional Note (дополнительное примечание) — продвинутый контакт для текста, добавляемого к сгенерированному сообщению. И Delay (задержка) — количество секунд ожидания перед началом следующего действия.
Большинство обработчиков меняют один из этих параметров. Остальные остаются по умолчанию, пока вам не понадобится голосовая обратная связь.
Есть еще один важный узел, о котором стоит знать. Abort Action Sequence очищает очередь и принимает Event Text плюс опцию Should Respond. Рекомендуется использовать его, когда обработчик вообще не может восстановиться, например, при уничтожении целевого актора или невыполнимом предварительном условии, а Handle Action Completion с Is Successful, установленным в false, использовать для результатов, которые персонаж может попытаться повторить или обыграть словами. В руководстве используется второй вариант для ошибки перемещения, что логично: заблокированный путь — это ситуация, которую персонаж может описать и попробовать снова.
Должны ли пользовательские действия быть атомарными?
Это вопрос проектирования, на котором останавливается руководство, и это самая полезная идея во всем видео.
В принципе, каждое действие должно выполнять одну задачу. Move To отвечает за движение. Pick Up отвечает за подъем. Convai выстраивает их в последовательность, потому что планировщик именно для этого и нужен. Это atomicity применяется к агенту affordances, и у этого есть явная выгода: если Pick Up не удается из-за того, что персонаж слишком далеко, ошибка понятна. Сообщите об этом с примечанием, что персонаж не рядом с целью, и модель может решить подойти ближе и попробовать снова.
В руководстве намеренно сделано иначе. Pick Up сначала перемещается к цели, а затем поднимает ее. Меньше узлов, меньше запросов, меньше шансов, что последовательность прервется в середине задачи.
Оба выбора обоснованы, и стоит назвать этот компромисс. Атомарные действия дают модели пространство для восстановления и позволяют ей создавать поведение, которое вы не прописывали. Составные действия дают вам детерминизм и меньше движущихся частей. Атомарные обычно выигрывают в открытых сценариях, где нельзя предугадать порядок операций, таких как тренировочные симуляции, многопользовательские миры или поведение NPC в открытом мире. Составные обычно выигрывают в жестко заданных последовательностях, где вы знаете структуру задачи.
Чего стоит избегать, так это выбора без осознания. Составное действие, которое скрывает три режима отказа за одним логическим значением — это та версия, которую придется отлаживать в 2 часа ночи.
Как подключить Convai Move To к пользовательскому действию?
Convai Move To — это латентный узел Blueprint в категории Convai Movement. Он принимает Moving Actor (движущегося актора) и запись места назначения, и он разрешает целых акторов, конкретные components, сокеты и созданные точки перемещения без ручного подключения Resolve Goal Location.
Для Pick Up установите Moving Actor на self и передайте ссылку из параметра target в качестве места назначения.
У узла есть два выхода выполнения. Succeeded срабатывает при Reached (достигнуто) или Already At Destination (уже на месте). Failed срабатывает во всех остальных случаях. Он также возвращает код результата (Result Code) и дополнительное примечание (Additional Note), которые, согласно документации, можно безопасно передать в Handle Action Completion или озвучить игроку.
Этот перечислимый тип (enum) Result Code более информативен, чем многие ожидают. Он различает состояния: Reached, Already At Destination, Unknown Destination, Unreachable, Invalid Character, Missing AI Controller, Missing Movement Component, Missing Path Following Component, Missing Navigation Data и Move Failed. Четыре из этих десяти указывают на проблемы с настройкой, а не на состояние мира, что делает этот enum инструментом отладки в той же мере, что и сигналом во время выполнения.
В ветке Failed продублируйте Handle Action Completion, установите Is Successful в значение false, сообщите о результате, запросите ответ и передайте Additional Note. Запрос ответа здесь важен. Персонаж, который не может добраться до ящика, не имеет ничего полезного для выполнения, поэтому он должен сказать об этом, а не просто стоять, пока игрок гадает, не завис ли игровой движок.
Если перемещение завершается неудачей по причине, которую enum относит к настройкам, обычными подозреваемыми являются навигационная сетка, которая не покрывает обе конечные точки, отсутствие класса AI Controller или не настроенное перемещение пешки (pawn). Плагин предоставляет утилиту Setup Convai Pawn Movement в контекстном меню Blueprint персонажа для последнего случая, а Build Paths плюс клавиша P для визуализации во вьюпорте решают первую проблему.
Как подключить действие Convai к существующей игровой системе?
Именно здесь пользовательское действие перестает быть общим и начинает становиться частью вашего проекта.
Система взаимодействия Stack O Bot, написанная задолго до того, как к ней прикоснулся какой-либо ИИ, использует переменную под названием Potential Interact. Чтобы что-то подобрать, персонаж устанавливает свой Potential Interact, а затем вызывает собственную функцию Interact проекта.
Есть один нюанс, и это тот самый случай, на который можно потратить целый день. Potential Interact ожидает компонент изнутри ящика, а не Actor ящика. Откройте Blueprint ящика, и нужный вам компонент — это его статическая сетка. Поэтому, используя ссылку на цель, примените Get Component By Class, чтобы получить компонент статической сетки, установите его как Potential Interact и вызовите Interact, убедившись, что версия относится к Blueprint ИИ-бота, а не к его аналогу.
Этот урок применим не только к данному проекту. Прежде чем писать пользовательское действие, изучите систему, к которой вы подключаетесь, и узнайте, в каком виде она ожидает входные данные. Работа на стороне Convai занимает минуты. Интеграция занимает столько времени, сколько в существующем коде есть особенностей, а каждая кодовая база игрового процесса в чем-то уникальна. Помощник с тегированием сцены и доступом к проекту ускоряет этот этап.
Здесь также проявляет себя рабочий процесс Convai MCP для Unreal, поскольку помощник, способный читать структуру вашего проекта, сокращает этап исследования.
Смотрите также: Convai MCP для Unreal Engine, рабочий процесс, использованный для настройки сцены в этой серии.
Как реализовать действие drop-at?
Drop At начинается так же. Считайте пункт назначения с помощью Get Param As Ref, передайте его в Convai Move To и обработайте ветку Failed с помощью Handle Action Completion, установив Is Successful в false и передав Additional Note узла.
Самому сбросу сначала нужна проверка (guard).
Stack O Bot хранит ссылку на то, что держит персонаж. Прежде чем что-то бросать, проверьте, является ли эта ссылка валидной. Нажмите правой кнопкой мыши и выберите Convert To Validated Get, что разделит граф на валидную и невалидную ветки.
В невалидной ветке персонаж ничего не держит, поэтому Drop At завершается неудачей. Вызовите Handle Action Completion с сообщением вроде «у вас нет ничего, что можно было бы бросить», и запросите ответ, чтобы персонаж мог это произнести. Эта фраза — вся ценность проверки. Без нее действие возвращает молчаливое false, и игрок не получает объяснений.
В валидной ветке разместите объект. Получите ссылку на пункт назначения, получите его местоположение и создайте новую позицию над ним, так как сбрасывать ящик прямо на нажимную плиту — не то, чего кто-либо хочет. Смещение применяется по оси Z. В руководстве добавляется 100 единиц по Z.
Затем получите сам ящик. Граф содержит компонент статической сетки, поэтому Get Owner возвращает Actor, которому он принадлежит. Передайте это в Set Actor Location с позицией смещения, снова вызовите функцию Interact в Stack O Bot, чтобы отпустить предмет, и завершите работу с помощью Handle Action Completion, отмеченного как успешное.
Это вся реализация. Два действия, два параметра, по одной проверке на перемещение, одна проверка на состояние удержания.
Почему состояния неудачи важнее состояний успеха
Посмотрите, на что два обработчика тратят свои узлы. Примерно половина графа в каждом из них — это обработка ошибок, и это соотношение не случайно.
Путь успеха создает персонажа, который работает, когда мир идет навстречу. Пути неудачи создают персонажа, который остается в диалоге, когда это не так, что является обработкой исключений с голосом. Очередь действий (action queue) принудительно реализует часть этого по дизайну, потому что установленное в false значение Is Successful очищает оставшуюся очередь, а не продолжает выполнение плана, первый шаг которого не удался.
В руководстве по устранению неполадок перечислены пути выхода, о которых забывают команды: выходы по условиям проверки, которые возвращаются до начала работы; асинхронные обратные вызовы, где вызов завершения находится в недостижимой ветке; и анимационные монтажи, где On Interrupted не был подключен вместе с On Completed. Последнее — классика, из-за которой очередь зависает, пока плагин ждет танца, который был отменен.
Размещение узла Print String прямо перед каждым вызовом завершения, а затем подтверждение того, что каждый путь достигает одного из них, стоит пять минут и экономит гораздо больше. Convai Debug Overlay выполняет ту же работу для точек перемещения, рисуя маркер над каждой именованной, включенной точкой в мировом пространстве.
Как выглядит завершенное прохождение головоломки?
Тестовый прогон — это головоломка Stack O Bot для двух игроков, которую ни один из них не может решить в одиночку.
Игрок просит ИИ-напарника подержать нажимную плиту, чтобы он мог забраться наверх и сбросить ящик. Персонаж соглашается, называет плиту, к которой направляется, и идет. Когда ящик приземляется рядом с ним, персонаж замечает это и спрашивает, следует ли ему подобрать ящик или у игрока другие планы. Получив указание использовать ящик для удержания плиты, он отвечает, что план освобождает его для перемещения, размещает ящик и сообщает о состоянии платформы, когда она стабилизируется.
Ни один из этих диалогов не был написан заранее. Была создана среда, которую персонаж может считывать, и два действия, которые он может выполнять. Разговор — это то, что происходит, когда эти две половины определены вместе, то же самое сочетание, которое лежит в основе нелинейного сценарного дизайна.
Момент, который стоит пересмотреть — это когда персонаж спрашивает, нужно ли поднять ящик. У него были возможности, была цель, но он все равно спросил, потому что ящик, приземлившийся рядом, был изменением в окружающем мире, а не инструкцией. Такое поведение проистекает из отслеживаемых свойств и метаданных сцены, настроенных в первой части, а не из обработчиков действий во второй. Восприятие и агентность — это отдельные системы, и персонаж ощущается как товарищ по команде только тогда, когда присутствуют обе, что и доказывает работа с объектами во внимании со стороны восприятия.
Также посмотрите: Часть 1, «Состояние игры в реальном времени и настройка сцены», которая создает слой осведомленности, расширяемый в этом руководстве.
Распространенные проблемы и способы их решения
Персонаж говорит, но обработчик не запускается. Убедитесь, что в свойстве Environment чат-бота установлена галочка Enable Actions, затем проверьте, что имя шаблона действия совпадает с именем события в Blueprint, включая пробелы. В журнале вывода (Output Log) появится предупреждение об отсутствии функции, если диспетчер не сможет найти обработчик.
Обработчик существует, но пропускается. Функция должна принимать либо ноль параметров, либо один параметр Convai Result Action и ничего больше. Неверная сигнатура записывает предупреждение в журнал и оставляет очередь в ожидании.
Одно действие выполняется, и последовательность останавливается. Какой-то путь не вызвал Handle Action Completion или вызвал его со значением Is Successful, равным false.
Новое действие не появляется в режиме игры (Play mode). Blueprint персонажа не был скомпилирован после редактирования шаблона.
Get Param As Ref возвращает пустую запись. Объекта нет в массиве Objects или Characters, или имя, возвращенное Convai, не совпадает с зарегистрированной записью. Вы можете добавлять записи во время выполнения с помощью Add Object и Add Character, наряду с установщиками взгляда и внимания, описанными в разделе «Управление окружением во время выполнения».
Персонаж подходит близко к объекту, но не к самому объекту. Либо создайте точку перемещения, либо установите для параметра Object Is значение Specific Component для небольших целей, таких как кнопки и рычаги. Радиус принятия (Acceptance Radius) по умолчанию составляет 150 сантиметров, что вполне достаточно для рычага.
Blueprint перестал компилироваться после обновления плагина. В руководстве по миграции для 4.0.0-beta.27 перечислены все удаленные пины и переименованные поля с указанием правок, которые необходимо внести.
Для всего, что здесь не указано, существует форум разработчиков Convai, где можно задать вопросы по настройке и сообщить об ошибках. В теме для этого руководства собираются вопросы от людей, проходящих те же этапы, как и в более широкой категории руководств и учебных пособий, а также в теме первой части.
Где этот шаблон применяется за пределами игры-головоломки?
«Поднять» и «положить» — это решение головоломки. Лежащий в их основе шаблон универсален: объявите возможность, определите цель в сцене, вызовите систему, которая уже отвечает за это поведение, и сообщите о результате на языке, на котором может говорить персонаж.
Замените ящик на инструмент, и вы получите симулятор обучения, где персонаж-инструктор демонстрирует процедуру. Замените его на товар, и вы получите виртуальный ИИ-аватар, перемещающий запасы в торговом зале, используя загруженные руководства через In-Context Knowledge Bank. Замените всю среду на программное обеспечение, и тот же цикл «объявить-определить-выполнить-отчитаться» будет управлять действиями ИИ в отношении внешних инструментов и систем через MCP.
Движок меняется, цель меняется, контракт отчетности — нет. Convai поставляет ту же систему действий в Unity с другим набором исполнителей, а многопользовательская и повествовательная стороны платформы используют одни и те же результаты.
Начало работы
Если сторона Unreal Engine для вас нова, руководство по настройке плагина охватывает установку и вход в систему, прежде чем приступать к чему-либо из этого.





