УрокStefan VaskevichStefan Vaskevich

Локальная LLM + Unreal Engine 5.8 MCP: бесплатный ИИ создает полноценную игру

Без облака, без ключа API, $0.00 за задачу: Qwen3.6-27B, запущенная через llama.cpp и подключенная к нативному MCP в UE 5.8 через Cline, создает играбельную игру за 17 промптов.

Инструменты из этой статьи

В прошлый раз Claude построил мир внутри Unreal Engine 5.8 через новый нативный MCP — и самым популярным комментарием под тем видео с большим отрывом был: «Ладно, но можно ли сделать это с локальным, бесплатным ИИ с открытым исходным кодом?» Справедливый вопрос. Claude великолепен — ровно до тех пор, пока вы не посмотрите на счет.

Так что на этот раз: никакого облака, никакого API-ключа, никакой подписки. Qwen3.6-27B — 27 миллиардов параметров, около семнадцати гигабайт на одном потребительском GPU — подключен напрямую к запущенному Unreal Editor через тот же нативный MCP. Семнадцать промптов, и каждый до единого — новый чат: модель ничего не помнит между шагами. Режим размышлений выключен. И каждая задача в истории Cline заканчивается одним и тем же числом в углу: $0.00.

Стек в одну строку
Qwen3.6-27B (открытые веса, запуск локально через llama.cpp) + Cline в VS Code в качестве агентной обвязки + нативный MCP-сервер Unreal Engine 5.8, управляющий запущенным редактором. Общая стоимость API за всю игру: $0.00. (GPU продается отдельно.)
Геймплей BurgerTower в Unreal Engine 5.8: башня из еды достигает отметки 8,902 метра, серия PERFECT! x26, а наверху панорамы ждёт гигантский рот. Игра целиком создана локальной LLM
Конечный результат: идеальная серия x26 на отметке 8,902 метра; башня поднимается к открытому рту великана наверху задника. Каждый Blueprint, виджет и эффект в этом кадре созданы локальной моделью на 17 GB.

Главный вопрос заключался вовсе не в том, «может ли модель открыть редактор». Вопрос был в том, сможет ли локальная модель выдержать реальный проект: создать Blueprints, собрать HUD из 28 виджетов, подключить систему ввода и отловить собственный баг в недрах движка — или же развалится на первом вызове инструмента. Насколько нам известно, до этого никто не публиковал успешную сборку на локальной LLM через нативный MCP в UE; единственная публичная попытка, которую мы нашли, закончилась провалом в день запуска. Вот точный сетап, что именно получилось собрать и честный вердикт.

1. Модель: Qwen3.6-27B и железо, которое ей реально нужно

Наш выбор — Qwen3.6-27B, плотная модель с открытыми весами. Сейчас она входит в число лидеров среди открытых моделей в бенчмарках агентного кодинга, а в этом поколении улучшили вызов инструментов. Здесь использовалась сборка из репозитория unsloth GGUF с квантом UD-Q4_K_XL (UD = Unsloth Dynamic) — примерно 17 GB весов.

Графики бенчмарков со сравнением Qwen3.6-27B с другими моделями с открытым исходным кодом и Claude в SWE-bench, Terminal-Bench и тестах агентного кодинга
Почему именно эта модель: Qwen3.6-27B лидирует среди плотных моделей с открытым исходным кодом в бенчмарках агентного кодинга — именно этот навык и нужен агенту, управляющему редактором.
Реальные требования к железу
Для кванта на 17 GB и KV-кэша на 40k токенов потребуется GPU на 24 GB — RTX 3090, 4090 или 5090 справятся без проблем — либо Mac на Apple Silicon с 32 GB+ объединенной памяти. Меньше VRAM? Уменьшите размер контекста или выберите меньший квант из того же репозитория; сетап ниже останется точно таким же. Если быть точным в формулировках: счет за API — $0.00: у модели открытые веса, инструменты — с открытым исходным кодом, а Unreal устанавливается бесплатно (для выпущенных игр действуют стандартные условия роялти от Epic).

2. Запустите локально через llama.cpp (вся суть — в флагах)

Установите llama.cpp одной командой — в Windows это winget install llama.cpp — и запустите сервер. Флаг -hf при первом запуске скачивает нужный квант напрямую с Hugging Face, так что отдельного шага со скачиванием нет:

winget install llama.cpp   # macOS/Linux: curl -LsSf https://llama.app/install.sh | sh

llama serve -hf unsloth/Qwen3.6-27B-GGUF:UD-Q4_K_XL -a Qwen3.6-27B \
  --host 127.0.0.1 --port 1235 \
  -ngl 99 -fa on -c 40960 \
  --cache-type-k q8_0 --cache-type-v q8_0 \
  --jinja --reasoning off \
  --temp 0.7 --top-p 0.80 --top-k 20 --min-p 0.0 \
  --presence-penalty 1.5 --repeat-penalty 1.0

Разберём, что делает каждый блок: все они здесь не просто так.

Флаги производительности
-ngl 99 переносит каждый слой на GPU (99 просто означает «все до единого»). -fa on включает flash attention. -c 40960 — нативный максимум контекста Qwen3; уменьшите его, если не хватает VRAM. Флаги K/V-кэша q8_0 сжимают кэш внимания до 8 бит: расход памяти снижается почти вдвое, а качество практически не меняется.
Флаги агента
-a Qwen3.6-27B задает имя модели в API — именно эту строку вы позже введете в Cline. --reasoning off отключает режим размышлений: циклу агента нужен один быстрый вызов инструмента за ход, а не монолог — меньше задержка, никаких потраченных впустую токенов.
Официальный пресет сэмплинга без размышлений для Qwen
Temp 0.7 (в Qwen прямо предостерегают от нуля — жадное декодирование загоняет модель в циклы повторений), top-p 0.80, top-k 20, min-p 0.0 (некоторые фронтенды по умолчанию выставляют его ненулевым и ломают вывод), presence-penalty 1.5 прямо из карточки модели — и --repeat-penalty 1.0, что означает выключено. По умолчанию в llama.cpp стоит 1.1, и этот штраф старого типа откровенно вредит Qwen.
Тот самый флаг, который решает все: --jinja
--jinja заставляет llama.cpp использовать нативный шаблон чата модели. Без него сервер не сможет разобрать теги, которые Qwen использует для форматирования вызовов инструментов, — и Cline не увидит ни единого вызова инструмента. Модель выглядит живой, охотно общается и не делает ровным счетом ничего в вашем редакторе. Если ваш локальный агент «разговаривает, но ничего не делает», этот флаг — первое, что нужно проверить.
В Windows PowerShell запущена команда llama serve с полным набором флагов: Qwen3.6-27B скачивается с Hugging Face и загружается, после чего сервер ожидает подключения по адресу 127.0.0.1:1235
Одна команда в PowerShell: llama.cpp скачивает квант на 17 GB с Hugging Face, загружает его на GPU и начинает ожидать подключения по адресу 127.0.0.1:1235.

3. Подключите Cline к своему серверу

Cline — это агентная обвязка: бесплатное расширение для VS Code с открытым исходным кодом. llama-server предоставляет эндпоинт, совместимый с OpenAI, поэтому Cline обращается к вашему GPU в точности так же, как к облачному API:

1

API Configuration

Provider OpenAI Compatible; Base URL http://127.0.0.1:1235/v1 (путь /v1 обязателен); Model Qwen3.6-27B — имя должно в точности совпадать со значением флага -a; API Key — любая непустая строка (сервер её никогда не проверяет, но Cline требует заполнить это поле). Context Window 40960 — такое же значение, как на сервере. Reasoning Effort None, что соответствует --reasoning off.

2

Функции, которые важны для агента в Unreal

Native Tool Call ON — используйте настоящий формат вызова инструментов модели вместо хаков с промптами. Parallel Tool Calling OFF — вы все равно не сможете работать в Unreal Editor параллельно; здесь все делается строго по одной операции за раз. Auto Compact OFF — здесь один чат равен одной задаче, поэтому длинной истории для сжатия тут никогда не бывает.

3

Yolo Mode ON (необязательно, но в этом вся суть)

Yolo Mode автоматически одобряет каждый вызов инструмента — локальный эквивалент bypass-permissions. С облачным агентом каждый запрос «proceed?» требует вашего внимания и денег; здесь модель ваша, так что дайте ей работать.

Настройки Cline API в VS Code: провайдер OpenAI Compatible, Base URL http://127.0.0.1:1235/v1, Model Qwen3.6-27B, Context Window 40960
Для замены облачного сервиса нужна всего одна страница настроек: провайдер OpenAI Compatible, ваш URL на localhost и имя модели, совпадающее со значением флага -a.

4. Подключаем к Unreal Engine 5.8

Со стороны Unreal — тот же нативный сервер MCP, который мы разбирали в предыдущей главе: включите плагин, активируйте Auto Start Server, и редактор будет слушать запросы по адресу http://127.0.0.1:8000/mcp. (Плагин MCP всё еще помечен как Experimental, и временами это заметно — подробнее об этом ниже.) Единственная новая деталь — сообщить о нем Cline в cline_mcp_settings.json:

{
  "mcpServers": {
    "unreal-mcp": {
      "type": "streamableHttp",
      "url": "http://127.0.0.1:8000/mcp"
    }
  }
}

Первая задача в чистом чате: «проверь подключение MCP к Unreal Engine». Самый первый вызов execute_python_code завершился ошибкой AttributeError — некорректный вызов Python API. И это был первый по-настоящему обнадеживающий момент: модель прочитала traceback, поняла, что подключение в порядке и дело только в ее коде, и повторила попытку с исправленным кодом. Спустя восемь миллисекунд: «MCP connection to Unreal Engine: SUCCESSFUL».

Cline в VS Code рядом с пустым уровнем BurgerStudio в Unreal Engine 5.8, с задачей проверки подключения MCP и отметками стоимости $0.00 на каждой задаче
Цепочка подтверждена: Qwen (localhost:1235) — Cline — MCP (localhost:8000) — запущенный Unreal Editor. Обратите внимание на сквозную шутку в списке задач: стоимость каждой задачи в итоге составляет $0.00.
Скачайте файл правил проекта (он здорово экономит время)

Локальная модель без памяти между задачами полностью зависит от своего файла правил. Этот файл — BurgerTower_SystemPrompt.md — содержит соглашения проекта, заметки по API редактора, правила компиляции и ловушки движка, на каждую из которых иначе ушло бы по отдельному промпту (переменные float нужно объявлять с типом real, иначе они молча превратятся в int; одна система на один вызов инструмента; компилировать дважды, чтобы убрать предупреждение о значениях по умолчанию). Закиньте его в свой проект и адаптируйте.

5. Стресс-тест: полноценная игра за 17 промптов

Наш проект — BurgerTower, аркада про строительство башни с управлением одной кнопкой. Кусок еды раскачивается над растущей башней; нажмите, чтобы его сбросить. Точное приземление дает бонус и брызги мясного сока; накренившаяся башня падает, и попытка заканчивается. С каждым этажом камера поднимается всё выше — город, облака, стратосфера, космос. В проекте есть только арт: восемь мешей еды, текстура панорамы и пустая карта студии. Все Blueprint, графы, виджеты, ассеты ввода, материалы и эффекты модель должна создать сама, прямо в редакторе, через Python.

Ассеты взяты из Tripo (арт — не задача ИИ-агента)
Восемь мешей ингредиентов — булочка с кунжутом, говяжья котлета, помидор, салат, пончик, черничная вафля, стопка панкейков, пицца пепперони — были сгенерированы в Tripo по изображениям, в режиме HD, с заданным полигональным бюджетом на каждый объект. Сейчас Tripo возглавляет таблицу лидеров top3d.ai — и такое разделение труда отлично работает: генеративный инструмент создает арт, а агент строит вокруг него системы.
Менеджер ассетов Tripo со сгенерированными мешами еды: салат, ломтик помидора, пончик, булочки, пицца, стопка панкейков и черничные вафли
Весь арт-бюджет игры: восемь мешей еды из Tripo. Всё остальное в BurgerTower создано локальной моделью в коде.

И ещё одно правило, которое превращает это в настоящий бенчмарк, а не просто в демо: каждый промпт — это абсолютно новая задача в Cline с чистым контекстом. Модель ничего не помнит между шагами — всю необходимую связь обеспечивают сами промпты, как если бы заказы выдавали подрядчику, который каждое утро просыпается с амнезией. Всего семнадцать заказов.

Промпты 1–6: весь скелет без единого нажатия Play

Первые шесть промптов собирают каждую часть отдельно и проверяют её только компиляцией: актор падающего куска с его профилем физики и пулом мешей (меш ОБЯЗАН быть корневым компонентом — физика симулирует корень, и меш, прикреплённый к пустому корню, оторвётся в тот же миг, когда активируется физика); его граф событий, где событие Hit с тройной фильтрацией превращает физическое касание ровно в один сигнал «я приземлился»; эффект всплеска Niagara, продублированный из шаблона движка; pawn камеры с 19 переменными состояния; и HUD.

Первый промпт, вставленный в Cline: создать BP_Ingredient с корнем StaticMeshComponent, профилем PhysicsActor и переменными bLanded и MeshPool — рядом с пустым проектом Unreal
Промпт 1 из 17 в чистом чате: актор падающего куска описан подробно, вплоть до объяснения того, почему меш обязан быть корнем. Автоодобрение: YOLO.

HUD заслуживает отдельного предложения: 28 виджетов — карточка счета, золотая плашка BEST, всплывающие плашки PERFECT!/COMBO, высотомер с отметками CITY/CLOUDS/STRATOSPHERE/SPACE и полноценный экран смерти с кнопкой RETRY — были размещены, привязаны к анкорам, покрашены и стилизованы целиком в коде, за два вызова инструмента, без единого клика в дизайнере UMG. Второй вызов представлял собой один непрерывный блок кода, который локальная модель стримила около двух с половиной минут. И он скомпилировался без единой ошибки.

Промпты 7–13: связываем всё воедино, первый Play, первый game over

Второй эпизод связывает части в порядке зависимостей: сначала обработчик приземления на pawn, затем основной цикл в Tick (синусоида раскачивания, плавный подъём камеры, покадровое обновление HUD, проверка проигрыша на основе физики), ассеты Enhanced Input, инициализацию в BeginPlay и игровой режим — включая коварную ловушку: после назначения default pawn игровой режим необходимо перекомпилировать, иначе Play продолжит спавнить стандартный pawn движка. Модель выполнила перекомпиляцию и повторно считала значение для проверки. Первый Play за всю серию случается только после промпта 11: pawn спавнится, HUD появляется с нулями, над базовой булочкой раскачивается кусок.

Первый смоук-тест в Play-In-Editor: SCORE 0, HEIGHT 0 m, высотомер с отметками SPACE/STRATOSPHERE/CLOUDS и раскачивающаяся булочка над основанием башни
Первое нажатие Play — после 11 промптов чистой сборки. HUD на нуле, высотомер на месте, булочка раскачивается по своей синусоиде.

Промпт 12 — это кнопка сброса: определить в момент нажатия, было ли попадание идеальным, разбудить физику детали, подтянуть камеру, заспавнить следующую деталь — и самый большой блок кода во всей серии: около трёх минут стриминга, затем три с половиной минуты компиляции графа движком. В середине задачи эндпоинт MCP оборвал сессию; Cline сам повторно отправил точно такой же вызов, и сборка продолжилась. Подобные сбои доставки случались за проект трижды, и агент каждый раз сам восстанавливался на камеру. Затем: Play, первый сброс, серия «PERFECT! x4», накренившаяся башня, падение на 5,316 метрах, GAME OVER, RETRY — весь игровой цикл работает. Промпт 13 — классическая настройка ощущений от игры: увеличить амплитуду раскачивания, ускорить его, расширить FOV с 70 до 80.

BP_BurgerPawn, открытый в редакторе Blueprint: EventGraph с событиями BeginPlay, Tick и OnPieceLanded, а также 19 типизированных переменных — всё создано через Python
Что модель написала на самом деле: граф событий BP_BurgerPawn и его блок состояния из 19 переменных, которые я проверил после сборки. Всё собрано через вызовы BlueprintService, а не кликами.

Промпты 14–15: шейдер по формуле и подготовка к выпуску

Промпт 14 — демонстрация силы: собрать материал задника в коде — около 18 нод материала через MaterialEditingLibrary — с маппингом высокой панорамной текстуры в экранном пространстве, где видимое окно смещается вверх синхронно с подъёмом камеры. Чистая шейдерная математика, заданная формулой в промпте и перенесённая моделью в связи между нодами. На этой задаче также возникла единственная настоящая заминка за всю серию: ответ потерялся при передаче, повторная попытка столкнулась с ассетом, который первый вызов уже успел создать, и Unreal выдал диалоговые окна перезаписи. Модель не зациклилась — она сделала вывод, что материал уже существует, и перешла ко второй части. Промпт 15 — подготовка к выпуску: подключить единственный провод exec, намеренно оставленный неподключённым с промпта 7 (вспышка идеального попадания, оставленная за своим гейтом), перекрасить эффект в коричневый цвет мясного сока и проверить все ассеты — их восемь, и все компилируются без ошибок.

Проверочный запуск перед выпуском: башня на высоте 469 метров на фоне панорамы облаков, а в сводке задачи Cline указано, что каждый ассет компилируется без ошибок
Подготовка к выпуску: оставленная за гейтом вспышка подключена, все восемь ассетов выдают BS_UP_TO_DATE, а панорамный задник сдвигается по мере подъёма — материал создан по формуле примерно из 18 нод.

Промпт 16: настоящий баг — и момент, который отвечает на вопрос в заголовке

После подготовки к выпуску всплеск от идеального попадания в игре по-прежнему рендерился белым — хотя отчёты инструментов были зелёными, а значения цвета в ассете удалось проверить. Промпт 16 отдаёт модели эту загадку: выяснить, почему цвет так и не попал на экран. Диагноз, который она поставила, — самый блестящий момент за весь проект: Niagara компилирует системы в фоновом режиме, и игра всё это время воспроизводила старую скомпилированную копию эффекта. Её решение: заново выставить цвет на всех трёх эмиттерах, сохранить и принудительно запустить пересборку, открыв систему в редакторе. Следующий запуск Play: два идеальных попадания, тёмно-коричневые брызги с искрами. Это не повторение действий из урока по шаблону — модель рассуждает о пайплайне ассетов движка.

Промпт 17 — это десерт: импортировать новую панораму — гигантскую чавкающую голову над городом бургеров — и перенаправить на неё семплер материала. Один импорт, одна перепривязка; вся математика сдвига завязана на скалярные параметры, которые не затрагивают текстуру, так что задник сменился в реальном времени прямо во вьюпорте посреди сессии.

Задача по замене арта в Cline: новая текстура панорамы с чавкающей головой применена к материалу задника и видна прямо во вьюпорте Unreal позади основания башни
Промпт 17: один импорт и одна перепривязка семплера, и новое небо уже во вьюпорте — перекомпиляция материалов происходит синхронно. Каждая задача в боковой панели: $0.00.

6. Честный вердикт

Где модель проявила себя, а где возникли трудности
  • Она выдержала реальный проект. Семнадцать промптов с чистым контекстом, все системы скомпилировались без ошибок, один настоящий баг на уровне движка диагностирован и устранён. Каркас игры был собран без единого нажатия Play.
  • Она работает медленнее передовых облачных моделей. Большие блоки кода генерируются от двух до трёх минут на одном потребительском GPU, а самый тяжёлый граф потребовал ещё ~3.4 минуты на компиляцию движком. Закладывайте на это спокойный вечер, а не обеденный перерыв.
  • Обвязка действительно работает. Cline трижды повторно отправлял оборвавшиеся вызовы MCP; модель восстановилась после собственного ошибочного вызова API и справилась с повторной попыткой после конфликта ассетов. Будьте готовы к сбоям экспериментального MCP endpoint: цикл обработки должен с ними справляться.
  • Именно промпты несут тот интеллект, за который вы не платите. Чёткие брифы строго по одной системе за раз плюс файл с правилами — вот что заставляет локальную модель без памяти действовать на уровне сеньора. Размытые промпты проверки практикой не выдержат.
  • Заменит ли она Claude? Для структурированной сборки вроде этой — абсолютно, при $0.00 затрат на API она справилась с задачей. Для хаотичной работы с нечёткими требованиями передовая модель всё ещё даёт запас гибкости, которого у локальной 27B-модели нет. Выбирайте под проект, а не из идеологических соображений.
Финальный геймплей BurgerTower: комбо PERFECT! x22 на высоте 6,910 метров, счёт 133, башня из еды поднимается сквозь мультяшное небо
Финальное демо: серия из 22 «perfect» на высоте ~7 км с продолжением подъёма. Лучший забег остановился на отметке 17,736 метров — выше отметки SPACE в 15,000 м. 17 промптов, ~17 GB модели, 17.7 км бургера.

И да, нумерология сходится: 17 промптов, модель весом ~17 GB и финальная башня высотой 17.7 километра — за границей космоса, прямо в открытом рту гиганта, с полноценным экраном game over. И каждый шаг обошёлся ровно в $0.00.

Что вы получаете на самом деле

Агентный стек с $0.00 за задачу
llama.cpp запускает Qwen3.6-27B на вашем GPU, Cline служит обвязкой, нативный MCP в UE 5.8 — руками; и ни одного API-ключа во всей цепочке.
Набор флагов, который действительно работает
--jinja для вызовов инструментов, --reasoning off для агентного цикла, официальный пресет сэмплинга Qwen и устранённая проблема с repeat-penalty.
Полноценная игра, в которую можно играть
Складывание башни на физике, комбо из идеальных попаданий, HUD из 28 виджетов, процедурный задник, эффекты, ввод и экран game over — всего за 17 промптов с чистым контекстом.
Доказательство, что она умеет отлаживать движок
Диагностика устаревшего результата компиляции Niagara — тот самый момент, когда локальная модель перестала казаться игрушкой: она проанализировала пайплайн ассетов и принудительно запустила пересборку.

Вот и весь пайплайн: одна команда llama.cpp, одна страница настроек Cline, одна запись MCP — и локальная модель управляет тем же редактором, что и облачные агенты. Инструменты генерации для таких проектов постоянно меняются; когда появляются новые, они сразу попадают в Arena, чтобы вы могли сравнить их вслепую, прежде чем сделать выбор. Предыдущие части этой истории смотрите в Unreal Engine 5.8 Native MCP + Claude и Claude Code + Unreal Engine 5.

Посмотрите, как создавалась игра

Вся настройка и все 17 промптов, от начала до конца, на YouTube.

Хотите сравнить эти инструменты сами?

Локальная LLM + Unreal Engine 5.8 MCP: бесплатный ИИ создает полноценную игру | Top 3D AI