<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>𝚈 🎲 (✇/_\✇)</title><author><name>𝚈 🎲 (✇/_\✇)</name></author><id>https://teletype.in/atom/ultramarineart</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ultramarineart?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ultramarineart?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ultramarineart"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ultramarineart?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-30T19:17:15.170Z</updated><entry><id>ultramarineart:UEARCHBUILD</id><link rel="alternate" type="text/html" href="https://teletype.in/@ultramarineart/UEARCHBUILD?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ultramarineart"></link><title>Как я строю UE проект чтобы с ним мог работать и я, и нейронка</title><published>2026-03-25T14:24:39.394Z</published><updated>2026-03-25T14:24:39.394Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4a/94/4a940851-2e18-4322-ab61-d8c6aeff2e9d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/79/2b/792bdae5-986e-4f00-908a-a6eb3bb2b23f.png&quot;&gt;Давайте сразу определимся: мы используем гит для записи изменений в проекте, не ленитесь комментить изменения без нейронки, потому что комменты от нейронки вам потом ничего не дадут для понимания.</summary><content type="html">
  &lt;p id=&quot;I5fP&quot;&gt;Давайте сразу определимся: мы используем гит для записи изменений в проекте, не ленитесь комментить изменения без нейронки, потому что комменты от нейронки вам потом ничего не дадут для понимания.&lt;/p&gt;
  &lt;p id=&quot;dTkl&quot;&gt;Создаём .gitignore, чтобы git игнорировал тяжёлые и ненужные файлы типа кешей, всяких объектов и прочего при коммите, обычно вот таких: Binaries, Build, Intermediate, Saved, DerivedDataCache и т.д. В целом я советую сделать это через ИИ агентов, пусть он посмотрит структуру проекта и сделает gitignore на его основе.&lt;/p&gt;
  &lt;figure id=&quot;tdbo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/79/2b/792bdae5-986e-4f00-908a-a6eb3bb2b23f.png&quot; width=&quot;511&quot; /&gt;
    &lt;figcaption&gt;Сорс контроль &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pUJN&quot;&gt;Наш проект будет модульным и больше напоминать фреймворк. Держим в уме, &amp;quot;а ничё тот факт что&amp;quot;, контекст нейронок не бесконечный и при работе с какими-то классами и объектами, он может сразу переполняться и начинать сессию по новой, где снова будет читать всё заново. Так же если какие-то траблы с классами или системами, он не положит весь наш проект и в случае чего, такую проблемную хрень, можно будет легко изолировать и работать с ним отдельно&lt;/p&gt;
  &lt;blockquote id=&quot;JxoF&quot;&gt;&lt;em&gt;У агентов сейчас есть чекпоинты, и если контекст переполняется, он может продолжить работу с того, на чём остановился, но он уже не будет помнить именование объектов, например, и будет написано всё вразнобой, поэтому стараемся сохранять контекст как можно дольше.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;ZWlE&quot;&gt;Поэтому будем следовать несложным правилам:&lt;/p&gt;
  &lt;ol id=&quot;aFqD&quot;&gt;
    &lt;li id=&quot;0sJk&quot;&gt;&lt;strong&gt;State Machine&lt;/strong&gt; — управление состояниями. &lt;/li&gt;
    &lt;li id=&quot;p6PL&quot;&gt;&lt;strong&gt;Component&lt;/strong&gt; — декомпозиция функциональности в компоненты.&lt;/li&gt;
    &lt;li id=&quot;enTx&quot;&gt;&lt;strong&gt;Observer&lt;/strong&gt; — делегаты для событий&lt;/li&gt;
    &lt;li id=&quot;Fa5Y&quot;&gt;&lt;strong&gt;Interface Segregation — &lt;/strong&gt;разенлннные интерфейсы&lt;/li&gt;
    &lt;li id=&quot;EBsJ&quot;&gt;&lt;strong&gt;Coordinator&lt;/strong&gt; — координируют подсистемы&lt;/li&gt;
    &lt;li id=&quot;lCPg&quot;&gt;&lt;strong&gt;Data-Driven&lt;/strong&gt; — DataAssets для конфигурации оружия, предметов и т.д.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;kkhL&quot;&gt;С документами у нас также довольно важная и сложная работа. Многие агенты имеют набор для работы с UE, который по дефолту что-то подобное включает, но тут я лучше вручную задам всё.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;mcaJ&quot;&gt;Мы создаём мапу проекта — это такой короткий контекст для нейронки или для людей, которым, не дай бог, придётся в этом всём разбираться. Обычно это выглядит вот так:&lt;/p&gt;
    &lt;ol id=&quot;HEya&quot;&gt;
      &lt;li id=&quot;vGwy&quot;&gt;Overview (Обзор)&lt;br /&gt;   - Название проекта, тип, движок&lt;br /&gt;   - Ключевые принципы архитектуры&lt;br /&gt;   - Диаграмма слоёв&lt;/li&gt;
      &lt;li id=&quot;BTOV&quot;&gt;Project Structure (Структура проекта)&lt;br /&gt;   - Дерево директорий&lt;br /&gt;   - Соглашения об именовании (Naming Conventions)&lt;/li&gt;
      &lt;li id=&quot;l5db&quot;&gt;Core Systems (Основные системы)&lt;br /&gt;   - Описание главных систем (Character, Weapon, AI)&lt;br /&gt;   - Композиция компонентов&lt;/li&gt;
      &lt;li id=&quot;Pu5i&quot;&gt;Design Patterns (Паттерны)&lt;br /&gt;   - Какие паттерны используются&lt;br /&gt;   - Примеры кода&lt;/li&gt;
      &lt;li id=&quot;yOFn&quot;&gt;Data Flow (Потоки данных)&lt;br /&gt;   - Как данные проходят через систему&lt;br /&gt;   - Диаграммы&lt;/li&gt;
      &lt;li id=&quot;but3&quot;&gt;Component Architecture&lt;br /&gt;   - Таблица компонентов и их responsibilities&lt;/li&gt;
      &lt;li id=&quot;kqi3&quot;&gt;Coding Standards (Стандарты кодирования)&lt;br /&gt;   - Стиль именования&lt;br /&gt;   - Правила&lt;/li&gt;
      &lt;li id=&quot;uIY4&quot;&gt;Extension Guidelines (Руководство по расширению)&lt;br /&gt;   - Как добавлять новые фичи&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;BCcs&quot;&gt;Контекст AI-агента не бесконечный. Когда ты начинаешь новую сессию и просишь добавить новую механику — агент ничего не знает о твоём проекте. Ты либо каждый раз объясняешь всё с нуля, либо скидываешь карту проекта в начале сессии — и агент сразу понимает структуру, паттерны, соглашения по именованию.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;TMCS&quot;&gt;&lt;strong&gt;State Machine (конечный автомат)&lt;/strong&gt; — это способ организации логики, когда объект может находиться в одном из нескольких &lt;strong&gt;состояний&lt;/strong&gt; и &lt;strong&gt;переключаться&lt;/strong&gt; между ними по определённым правилам.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;mZxS&quot;&gt;Аналогия&lt;/h2&gt;
  &lt;p id=&quot;IVax&quot;&gt;Представь дверь с замком:&lt;/p&gt;
  &lt;ul id=&quot;hyaf&quot;&gt;
    &lt;li id=&quot;sh8U&quot;&gt;Дверь может быть в состояниях: &lt;strong&gt;Закрыта&lt;/strong&gt;, &lt;strong&gt;Открыта&lt;/strong&gt;, &lt;strong&gt;Заперта&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;HJmb&quot;&gt;Из состояния &amp;quot;Закрыта&amp;quot; можно перейти в &amp;quot;Заперта&amp;quot; (повернуть ключ)&lt;/li&gt;
    &lt;li id=&quot;OCjq&quot;&gt;Из &amp;quot;Заперта&amp;quot; можно перейти в &amp;quot;Открыта&amp;quot; (правильный ключ)&lt;/li&gt;
    &lt;li id=&quot;2M53&quot;&gt;Из &amp;quot;Открыта&amp;quot; можно перейти в &amp;quot;Закрыта&amp;quot;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;eYns&quot;&gt;Дверь не может быть одновременно &amp;quot;Открыта&amp;quot; и &amp;quot;Заперта&amp;quot; — только в одном состоянии. Каждое состояние имеет свою логику.&lt;/p&gt;
  &lt;h2 id=&quot;0ZoX&quot;&gt;Зачем нужен?&lt;/h2&gt;
  &lt;ol id=&quot;xt8G&quot;&gt;
    &lt;li id=&quot;9OZ2&quot;&gt;&lt;strong&gt;Чёткая логика&lt;/strong&gt; — нет запутанных if-else.&lt;/li&gt;
    &lt;li id=&quot;X5ss&quot;&gt;&lt;strong&gt;Нельзя сделать невозможное&lt;/strong&gt; — персонаж не может бежать и целиться одновременно например.&lt;/li&gt;
    &lt;li id=&quot;6ugC&quot;&gt;&lt;strong&gt;Легко добавить новое&lt;/strong&gt; — просто создать новый класс состоянияю&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;UafS&quot;&gt;&lt;strong&gt;Component Pattern&lt;/strong&gt; — это главный структурный принцип: вместо того чтобы писать весь код персонажа в одном монолитном классе, функциональность разбивается на небольшие, сфокусированные компоненты, каждый из которых отвечает ровно за одну вещь. Так мы не раздуваем наш компонент, можем переиспользовать &amp;quot;модуль&amp;quot; в любом подходящем месте, а так-же просто отключить его за ненадабностью.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;k3fa&quot;&gt;Так-же это позовляет работать с выделеным компонентом отдельно, т.е. опять-же нейронки не запутаются и не переполнит контекст.&lt;/p&gt;
  &lt;figure id=&quot;4Zda&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5a/80/5a8018db-af9f-4baa-83a4-b5bb4194ddf2.png&quot; width=&quot;418&quot; /&gt;
    &lt;figcaption&gt;Компоненты внутри моего персонажа&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;SZYe&quot;&gt;&lt;strong&gt;Аналогия&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;1Qlw&quot;&gt;Представь смартфон:&lt;/p&gt;
  &lt;ul id=&quot;akIk&quot;&gt;
    &lt;li id=&quot;zutS&quot;&gt;Камера отвечает только за съёмку&lt;/li&gt;
    &lt;li id=&quot;H5Fy&quot;&gt;Батарея отвечает только за питание&lt;/li&gt;
    &lt;li id=&quot;I2nZ&quot;&gt;Динамик отвечает только за звук&lt;/li&gt;
    &lt;li id=&quot;QC22&quot;&gt;Wi-Fi модуль отвечает только за связь&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;iTdr&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;vGqO&quot;&gt;
    &lt;li id=&quot;eHBK&quot;&gt;&lt;strong&gt;Изоляция изменений&lt;/strong&gt; — правишь логику инвентаря, не боясь сломать камеру или здоровье персонажа.&lt;/li&gt;
    &lt;li id=&quot;05Ik&quot;&gt;&lt;strong&gt;Переиспользование&lt;/strong&gt; — &lt;code&gt;UHealthComponent&lt;/code&gt; просто вешается и на игрока, и на врагов. Код написан один раз.&lt;/li&gt;
    &lt;li id=&quot;a9qX&quot;&gt;&lt;strong&gt;Лёгкое расширение&lt;/strong&gt; — новая механика (например, система шума для AI) — это просто новый компонент, который цепляется к актору без изменения существующего кода.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;j7DT&quot;&gt;&lt;strong&gt;Interface Segregation (разделение интерфейсов)&lt;/strong&gt; — это принцип, при котором объект не обязан знать о чужих возможностях. Он описывает только минимальный контракт: &amp;quot;что ты умеешь делать&amp;quot;, без лишних деталей.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;dmAu&quot;&gt;&lt;strong&gt;Аналогия&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;McFG&quot;&gt;Представь пульт от телевизора и пульт от кондиционера:&lt;/p&gt;
  &lt;ul id=&quot;e47h&quot;&gt;
    &lt;li id=&quot;DzXd&quot;&gt;Оба устройства управляются пультом — но у каждого свой, заточенный под него&lt;/li&gt;
    &lt;li id=&quot;x5Ar&quot;&gt;Телевизору не нужна кнопка &amp;quot;температура&amp;quot;, кондиционеру — кнопка &amp;quot;канал&amp;quot;&lt;/li&gt;
    &lt;li id=&quot;NbWx&quot;&gt;Ты не обязан знать, как устроен телевизор внутри — тебе достаточно знать, что у него есть кнопки включить, переключить канал, громкость&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;RP3h&quot;&gt;Интерфейс — это и есть такой пульт. Минимальный набор кнопок, который нужен для взаимодействия. Что происходит внутри — тебя не касается.&lt;/p&gt;
  &lt;h2 id=&quot;Vw1m&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;dUXw&quot;&gt;
    &lt;li id=&quot;Lwn8&quot;&gt;&lt;strong&gt;Слабая связность&lt;/strong&gt; — код взаимодействует не с конкретным классом, а с контрактом. Можно подменить реализацию, не меняя того, кто её использует.&lt;/li&gt;
    &lt;li id=&quot;Xiuh&quot;&gt;&lt;strong&gt;Один интерфейс — много реализаций&lt;/strong&gt; — дверь, ящик, NPC могут быть разными объектами, но все реализуют &lt;code&gt;IInteractable&lt;/code&gt;. Код игрока работает одинаково с любым из них.&lt;/li&gt;
    &lt;li id=&quot;dsHT&quot;&gt;&lt;strong&gt;Минимальная зависимость&lt;/strong&gt; — компоненты знают друг о друге ровно столько, сколько нужно. Не больше.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;dzHn&quot;&gt;&lt;strong&gt;Observer (наблюдатель)&lt;/strong&gt; — объект сообщает другим что что-то произошло, не зная кто именно будет слушать. Подписался — получаешь уведомления, отписался — нет. Источник об этом даже не знает.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;G2gb&quot;&gt;&lt;strong&gt;Аналогия&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;OGdE&quot;&gt;Представь YouTube-канал:&lt;/p&gt;
  &lt;ul id=&quot;GFYp&quot;&gt;
    &lt;li id=&quot;rNxM&quot;&gt;Автор просто выкладывает видео — он не знает кто подписан&lt;/li&gt;
    &lt;li id=&quot;4r6o&quot;&gt;Подписчики сами решают подписываться или нет&lt;/li&gt;
    &lt;li id=&quot;ACly&quot;&gt;Вышло видео — все подписчики получили уведомление автоматически, автор никого не обзванивал&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;wm0X&quot;&gt;Подписалось ещё сто человек — автор ничего не менял, всё работает само.&lt;/p&gt;
  &lt;h2 id=&quot;HzLL&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ul id=&quot;upb3&quot;&gt;
    &lt;li id=&quot;mVvm&quot;&gt;Слабая связность — источник события не знает ничего о тех кто реагирует. Добавляешь новых слушателей не трогая источник.&lt;/li&gt;
    &lt;li id=&quot;xLuD&quot;&gt;Один сигнал — много реакций — враг умер, и на это реагируют сразу UI, счётчик убийств и система лута. Каждый сам подписывается.&lt;/li&gt;
    &lt;li id=&quot;ArYt&quot;&gt;Никакого опроса — не нужно каждый кадр проверять &amp;quot;а не умер ли враг?&amp;quot;. Событие прилетит само когда нужно.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;u7jK&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;4mbI&quot;&gt;
    &lt;li id=&quot;a0kb&quot;&gt;&lt;strong&gt;Слабая связность&lt;/strong&gt; — код взаимодействует не с конкретным классом, а с контрактом. Можно подменить реализацию, не меняя того, кто её использует.&lt;/li&gt;
    &lt;li id=&quot;bZUD&quot;&gt;&lt;strong&gt;Один интерфейс — много реализаций&lt;/strong&gt; — дверь, ящик, NPC могут быть разными объектами, но все реализуют &lt;code&gt;IInteractable&lt;/code&gt;. Код игрока работает одинаково с любым из них.&lt;/li&gt;
    &lt;li id=&quot;jvCN&quot;&gt;&lt;strong&gt;Минимальная зависимость&lt;/strong&gt; — компоненты знают друг о друге ровно столько, сколько нужно. Не больше.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;8BOp&quot;&gt;&lt;strong&gt;Coordinator (координатор)&lt;/strong&gt; — это как понятно из названия, объект, который не делает работу сам, а управляет взаимодействием между несколькими подсистемами. В моем прокте такими объектами выступают, сложные системы по типу дверей или того же персонажа, которые иначе могут превратиться в God Object что плохо и для чтения и для работы и для контекста нейросетей, у меня в целом все объекты и классы строяттся так, что бы избегать хардкода и всего что с ним связанно.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;D1ld&quot;&gt;&lt;strong&gt;Аналогия&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;7JUP&quot;&gt;Представь диспетчера в аэропорту:&lt;/p&gt;
  &lt;ul id=&quot;hGAt&quot;&gt;
    &lt;li id=&quot;DIbt&quot;&gt;Он не пилотирует самолёты&lt;/li&gt;
    &lt;li id=&quot;MZxf&quot;&gt;Он не заправляет их&lt;/li&gt;
    &lt;li id=&quot;Ig8F&quot;&gt;Он не продаёт билеты&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fN0c&quot;&gt;Но без него самолёты не знают, когда взлетать, кто заходит на посадку и кто кому мешает. Диспетчер знает о всех сразу и координирует их действия.&lt;/p&gt;
  &lt;h2 id=&quot;sCyJ&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;rH6z&quot;&gt;
    &lt;li id=&quot;M2iv&quot;&gt;&lt;strong&gt;Разгрузка компонентов&lt;/strong&gt; — каждая система делает своё дело и не лезет в чужое. Координатор берёт на себя логику &amp;quot;кто с кем и когда&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;t9D5&quot;&gt;&lt;strong&gt;Единая точка управления&lt;/strong&gt; — вместо того чтобы системы общались друг с другом напрямую и запутывались, все вопросы идут через координатора.&lt;/li&gt;
    &lt;li id=&quot;Ik1n&quot;&gt;&lt;strong&gt;Легко контролировать сложное поведение&lt;/strong&gt; — например, чтобы враги не атаковали все одновременно.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;iOBF&quot;&gt;&lt;strong&gt;Data-Driven&lt;/strong&gt; — это подход, при котором поведение объектов настраивается не в коде, а в данных. Хочешь поменять урон оружия — не лезешь в C++, просто меняешь значение в файле. Получается что бы ты не лез в код или блюпринт, создаешь Data Asset файл с параметрами которые можно менять без компиляции, а многие из них можно менять даже в рантайме, у меня это довольно важная часть, т.к. тот же геймфил настравиать крайне комфортно&lt;/p&gt;
    &lt;figure id=&quot;Tqfz&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img4.teletype.in/files/b3/3c/b33c7fb3-16c6-43be-9685-57a3e0d51c3c.png&quot; width=&quot;1212&quot; /&gt;
      &lt;figcaption&gt;Список моих Data Driven компонентов &lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure id=&quot;Y8JS&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img3.teletype.in/files/ec/96/ec9626a9-f347-4725-a0cc-3afb2adc7141.png&quot; width=&quot;933&quot; /&gt;
      &lt;figcaption&gt;Содержание Data Asset &lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure id=&quot;GpO2&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img2.teletype.in/files/94/35/943594be-5dcc-4443-9e50-9b3cca01b5db.png&quot; width=&quot;1045&quot; /&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;M7Xw&quot;&gt;&lt;strong&gt;Аналогия&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;IRSy&quot;&gt;Представь рецепт в ресторане:&lt;/p&gt;
  &lt;ul id=&quot;uNCO&quot;&gt;
    &lt;li id=&quot;tWJh&quot;&gt;Повар готовит по рецепту — он не меняется&lt;/li&gt;
    &lt;li id=&quot;fcGP&quot;&gt;Но шеф-повар может поменять рецепт: больше соли, другой соус, новый ингредиент&lt;/li&gt;
    &lt;li id=&quot;N8B4&quot;&gt;Повар об этом даже не знает — он просто читает новый рецепт и готовит&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Sd0d&quot;&gt;Код — это повар. DataAsset — это рецепт. Логика одна, данные меняются.&lt;/p&gt;
  &lt;h2 id=&quot;la5x&quot;&gt;&lt;strong&gt;Зачем нужен?&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;jzUc&quot;&gt;
    &lt;li id=&quot;cr3T&quot;&gt;&lt;strong&gt;Не трогаешь код&lt;/strong&gt; — баланс, звуки, дальность атаки, урон — всё меняется без перекомпиляции.&lt;/li&gt;
    &lt;li id=&quot;HgyR&quot;&gt;&lt;strong&gt;Легко добавлять контент&lt;/strong&gt; — новое оружие это не новый класс, а новый DataAsset с заполненными полями.&lt;/li&gt;
    &lt;li id=&quot;1lxE&quot;&gt;&lt;strong&gt;Дружит с нейронкой&lt;/strong&gt; — агенту не нужно лезть в логику, чтобы добавить новый предмет. Просто создаёт новый файл данных.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;meBo&quot;&gt;Ну я думаю с базой, разобрались, перейдем к ФУНДАМЕНТУ кода, давайте с ходу определим что мы стараемся не говнокодить, определять мы это будем с нейронкой, добавим в рулсы ей такое: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ol id=&quot;VvsH&quot;&gt;
      &lt;li id=&quot;Y0UM&quot;&gt;&lt;strong&gt;NO MAGIC NUMBERS&lt;/strong&gt; — никакого хардкода с установленными значениями прямо в коде. Например вместо того чтобы писать &lt;code&gt;float movementSpeed = 10.f&lt;/code&gt; прямо в методе — выносим это в &lt;code&gt;Constants&lt;/code&gt; файл и обращаемся к нему: &lt;code&gt;movementSpeed = MOVEMENT_SPEED&lt;/code&gt;. Чисто, красиво, не нужно бегать по тысяче строк в поисках одной цифры — и гарантия что нигде в проекте не окажется &lt;code&gt;10.f&lt;/code&gt; в одном месте и &lt;code&gt;10.5f&lt;/code&gt; в другом.&lt;/li&gt;
      &lt;li id=&quot;usdu&quot;&gt;&lt;strong&gt;АНГЛИЙСКИЙ ЯЗЫК КОММЕНТАРИЕВ&lt;/strong&gt; — я вот не озоботился прописать это сразу и теперь где-то английский, а где-то русский, так что сразу обозначьте этот момент. Проект на английском, нейронка лучше понимает английский контекст, и не будет каши когда код читает кто-то другой&lt;/li&gt;
      &lt;li id=&quot;ZSks&quot;&gt;&lt;strong&gt;SOFT POINTERS ДЛЯ АССЕТОВ&lt;/strong&gt; — Data Assets всегда через &lt;code&gt;TSoftObjectPtr&lt;/code&gt;, никаких &lt;code&gt;TObjectPtr&lt;/code&gt;. Hard pointer держит ассет в памяти всегда, даже когда он не нужен. Soft pointer загружает только тогда, когда реально используется — это важно когда ассетов много.&lt;/li&gt;
      &lt;li id=&quot;ybrg&quot;&gt;&lt;strong&gt;UPROPERTY/UFUNCTION МАКРОСЫ&lt;/strong&gt; — нейронка часто забывает их или ставит неправильные спецификаторы. Без &lt;code&gt;UPROPERTY&lt;/code&gt; переменная невидима для Blueprint и не защищена от сборщика мусора. Без &lt;code&gt;UFUNCTION&lt;/code&gt; метод недоступен из Blueprint вообще.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;ol id=&quot;BMnw&quot;&gt;
      &lt;li id=&quot;HbuS&quot;&gt;&lt;strong&gt;Debug Code&lt;/strong&gt;  — всё в &lt;code&gt;#if WITH_EDITOR&lt;/code&gt;что бы при сборке билда, все это игнорировалось компилятором&lt;/li&gt;
      &lt;li id=&quot;SMAX&quot;&gt;&lt;strong&gt;ПОРЯДОК ИНКЛЮДОВ&lt;/strong&gt; — &lt;code&gt;*.generated.h&lt;/code&gt; всегда последний. IntelliSense и нейронки тащат инклюды наверх автоматически — проверяй, иначе проект не скомпилируется.&lt;/li&gt;
      &lt;li id=&quot;7NE9&quot;&gt;&lt;strong&gt;SUPER:: ВЫЗОВЫ&lt;/strong&gt; — всегда вызывай &lt;code&gt;Super::&lt;/code&gt; в переопределённых методах жизненного цикла. Нейронка легко забывает, логика родительского класса тихо ломается и найти это потом хер найдешь.&lt;/li&gt;
      &lt;li id=&quot;Eq1M&quot;&gt;&lt;strong&gt;ДОКУМЕНТАЦИЯ&lt;/strong&gt; — после любых изменений в архитектуре или системах обновляй &lt;code&gt;ARCHITECTURE.md&lt;/code&gt; и соответствующие гайды. Нейронка работает с тем что написано, а не с тем что у тебя в голове.&lt;/li&gt;
      &lt;li id=&quot;NC0P&quot;&gt;&lt;strong&gt;NO TICK БЕЗ ПРИЧИНЫ&lt;/strong&gt; — по дефолту &lt;code&gt;bCanEverTick = false&lt;/code&gt; на всех компонентах и акторах. Tick вызывается каждый кадр — это дорого, и в большинстве случаев просто не нужен. Вместо него три альтернативы:&lt;/li&gt;
    &lt;/ol&gt;
    &lt;ul id=&quot;Albc&quot;&gt;
      &lt;li id=&quot;XjGt&quot;&gt;&lt;strong&gt;Делегаты&lt;/strong&gt; — если нужно среагировать на событие&lt;/li&gt;
      &lt;li id=&quot;OS8m&quot;&gt;&lt;strong&gt;Таймеры&lt;/strong&gt; — если нужно что-то сделать через время или с интервалом&lt;/li&gt;
      &lt;li id=&quot;xXwW&quot;&gt;&lt;strong&gt;Кеш&lt;/strong&gt; — если нужна ссылка на компонент, кешируем в &lt;code&gt;BeginPlay&lt;/code&gt; а не ищем каждый кадр&lt;/li&gt;
    &lt;/ul&gt;
    &lt;blockquote id=&quot;vcoD&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;Все рулсы должны быть на английском*&lt;/em&gt;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;eyBx&quot;&gt;&lt;em&gt;Есть еще такой момент с документами, сам &lt;code&gt;ARCHITECTURE.md&lt;/code&gt; со временем раздувается шо ппц, поэтому можно создать компактный контекст для агента вместо того чтобы скармливать весь &lt;code&gt;ARCHITECTURE.md&lt;/code&gt;можно для определенной задачи дать:&lt;br /&gt;&lt;code&gt;ARCH_AI_Map.md&lt;/code&gt; — быстрый обзор, зависимости, ссылки на файлы &lt;code&gt;ARCH_AI_CPP.md&lt;/code&gt; — для работы с C++ &lt;br /&gt;&lt;code&gt;ARCH_AI_Content.md&lt;/code&gt; — для работы с контентом&lt;br /&gt;Агент берёт только нужный файл под задачу — контекст не раздувается&lt;/em&gt;&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;p id=&quot;QOxE&quot;&gt;Я думаю что этого достаточно для грамотной архитектуры и стабильной работы с минимальным рефакторингом в будущем, и работой с отдельно взятой системой не перегружая контекст — большинство наших систем довольно изолированные. Так что пожалуй для старта этого более чем достаточно, в тг прикреплю файл с своей архитектурой для примера и файлы со скиллами для написания кода для UE, чтобы вы не искали отдельно или чтобы нейронка не грузила контекст с постоянной прогонкой текущих скиллов.&lt;/p&gt;

</content></entry><entry><id>ultramarineart:MCPSETUP</id><link rel="alternate" type="text/html" href="https://teletype.in/@ultramarineart/MCPSETUP?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ultramarineart"></link><title>MCP (Model Context Protocol)</title><published>2026-03-14T20:19:57.750Z</published><updated>2026-03-15T10:30:21.179Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a3/b3/a3b3128d-936c-486d-9401-8bc0bb755656.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/04/f1/04f12992-6066-4137-8ffc-8586aa375896.png&quot;&gt;Это такой локальный сервер, через который агент управляет вашим софтом по API. Обычно его настройка максимально простая, и разберем мы её на примере MCP для UE5.7.</summary><content type="html">
  &lt;p id=&quot;mAcS&quot;&gt;Это такой локальный сервер, через который агент управляет вашим софтом по API. Обычно его настройка максимально простая, и разберем мы её на примере MCP для UE5.7.&lt;/p&gt;
  &lt;p id=&quot;Nmkh&quot;&gt;Давай сначала установим плагин внутрь UE5. Это будет мой личный «монстр Франкенштейна», собранный из двух MCP: [&lt;a href=&quot;https://github.com/flopperam/unreal-engine-mcp&quot; target=&quot;_blank&quot;&gt;Первый&lt;/a&gt;] и [&lt;a href=&quot;https://github.com/Natfii/UnrealClaude&quot; target=&quot;_blank&quot;&gt;Второй&lt;/a&gt;].&lt;/p&gt;
  &lt;p id=&quot;3oKN&quot;&gt;Этот модифицированный MCP может читать и изменять Animation Graph в том числе. Добавляем папку с плагином в проект, конечный путь должен быть приблизительно таким: &lt;code&gt;X:\Unreal_Engine_Projects\[projectName]\Plugins&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;ulmw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/1b/101b6acb-af8e-4f5e-964f-0887feb69d58.png&quot; width=&quot;1125&quot; /&gt;
    &lt;figcaption&gt;Путь в моем случае выглядит так&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pQzq&quot;&gt;Включаем сам плагин.&lt;/p&gt;
  &lt;figure id=&quot;Mk24&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/04/f1/04f12992-6066-4137-8ffc-8586aa375896.png&quot; width=&quot;916&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;6DWp&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/8a/868a8893-8691-4b74-8e40-58b3e06f70ef.png&quot; width=&quot;1911&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;kZpU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7e/0d/7e0d3dc2-73cb-4941-922e-e89cd3baad6f.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;pre id=&quot;tWSt&quot;&gt;{
  &amp;quot;mcpServers&amp;quot;: {
    &amp;quot;unrealMCP&amp;quot;: {
      &amp;quot;command&amp;quot;: &amp;quot;uv&amp;quot;,
      &amp;quot;args&amp;quot;: [
        &amp;quot;--directory&amp;quot;,
        &amp;quot;Ваш путь к MCP&amp;quot;,
        &amp;quot;run&amp;quot;,
        &amp;quot;unreal_mcp_server_advanced.py&amp;quot;
      ]
    }
  }
}
&lt;/pre&gt;
  &lt;/section&gt;
  &lt;p id=&quot;CoKe&quot;&gt;Также можно попросить саму нейронку внутри Antigravity или вашего аналога настроить всё за вас.&lt;/p&gt;
  &lt;p id=&quot;h9vh&quot;&gt;После этого пингуем сервер — попроси агента получить список объектов в сцене.&lt;/p&gt;
  &lt;figure id=&quot;kgVA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c6/7f/c67f5d9a-5365-469c-94e1-8aa9c0cd45fc.png&quot; width=&quot;505&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;auEI&quot;&gt;По сути, это вся настройка.&lt;/p&gt;
  &lt;blockquote id=&quot;Fqt4&quot;&gt;&lt;em&gt;*Текст редактирован с помощью нейронки&lt;/em&gt;&lt;/blockquote&gt;

</content></entry><entry><id>ultramarineart:antigravitysetup</id><link rel="alternate" type="text/html" href="https://teletype.in/@ultramarineart/antigravitysetup?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ultramarineart"></link><title>Устанавливаем и настраиваем Google Antigravity IDE и Antigravity Tools</title><published>2026-03-11T12:11:30.102Z</published><updated>2026-03-11T12:11:30.102Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/3a/e5/3ae5b9a0-ae7e-4323-97db-80827650fb59.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/df/b3/dfb3e11c-52ec-478b-b021-e2444eb8bf17.png&quot;&gt;Мой основной IDE — Google Antigravity. Это форк VS Code, из-за чего на нем заводятся практически все плагины от оригинала. К тому же он изначально отлично заточен под работу с ИИ-агентами.</summary><content type="html">
  &lt;h3 id=&quot;fqda&quot;&gt;Настройка Google Antigravity и установка ИИ-агентов&lt;/h3&gt;
  &lt;p id=&quot;SUmk&quot;&gt;Мой основной IDE — &lt;strong&gt;Google Antigravity&lt;/strong&gt;. Это форк VS Code, из-за чего на нем заводятся практически все плагины от оригинала. К тому же он изначально отлично заточен под работу с ИИ-агентами.&lt;/p&gt;
  &lt;p id=&quot;IaHV&quot;&gt;Для начала &lt;a href=&quot;https://antigravity.google/&quot; target=&quot;_blank&quot;&gt;скачиваем его с официального сайта&lt;/a&gt; и устанавливаем.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;blockquote id=&quot;DEcG&quot;&gt;&lt;em&gt;Большим плюсом для нас является возможность даже на бесплатном аккаунте использовать Claude Opus и Sonnet 4.6 с жесткими лимитами. Но даже так — это отличное предложение. Для подписок PRO и ULTRA доступны расширенные лимиты и почти неограниченная возможность использовать Gemini. Ну и никто не запрещает (пока) абузить кучу акков&lt;/em&gt;.&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;tUVA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/df/b3/dfb3e11c-52ec-478b-b021-e2444eb8bf17.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Окно Antigravity &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AxpL&quot;&gt;Теперь нам нужно просто открыть проект. Жмем &lt;code&gt;File&lt;/code&gt; -&amp;gt; &lt;code&gt;Open Folder...&lt;/code&gt;, находим нужную директорию и выбираем корневую папку проекта (в моем случае — файлы моего сурвайвл-хоррора).&lt;/p&gt;
  &lt;figure id=&quot;Tmwv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ef/9a/ef9a467d-acf6-4301-9e3c-c4c7d2f9bc46.png&quot; width=&quot;404&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;S8yd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4a/c9/4ac9ab7c-ba6b-4ede-994a-5d4f59f3d87c.png&quot; width=&quot;946&quot; /&gt;
    &lt;figcaption&gt;Так выглядит корневая папка моего проекта&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;eNif&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/45/fd/45fd4f80-799f-4d00-8097-cc545782113d.png&quot; width=&quot;984&quot; /&gt;
    &lt;figcaption&gt;В эксплорере вы увидитн ваш проект &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;w0RP&quot;&gt;По сути, мы уже можем работать непосредственно с агентами внутри Antigravity. Но дальше, как говорится, начинаются нюансы!&lt;/p&gt;
  &lt;h4 id=&quot;2P5N&quot;&gt;Установка сторонних агентов&lt;/h4&gt;
  &lt;p id=&quot;HBJl&quot;&gt;Давайте добавим еще агентов в нашу IDE. Отлично подойдет &lt;strong&gt;Qwen&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;Feiv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/48/7a488768-df0f-46aa-935a-56ee7bbdba2f.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Окно расширений&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cEBr&quot;&gt;Теперь на любой вкладке доступен вызов нашего агента. Достаточно выбрать его один раз, и дальше он работает по всему проекту.&lt;/p&gt;
  &lt;figure id=&quot;P4EJ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cf/9c/cf9ce851-935b-4109-bb0c-52d037e1be80.png&quot; width=&quot;542&quot; /&gt;
    &lt;figcaption&gt;Окно агента и иконка вызова &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;OmGa&quot;&gt;Таким же образом ставим расширение &lt;strong&gt;Kilo Code&lt;/strong&gt;. Там частенько дают промки: например, на момент написания статьи уже месяц бесплатно дают юзать MiniMax M2.5.&lt;/p&gt;
  &lt;figure id=&quot;gMy0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/3b/653b3b6b-7d20-49c0-b409-91c9b570776a.png&quot; width=&quot;514&quot; /&gt;
    &lt;figcaption&gt;Окно Kilo Code&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Az4W&quot;&gt;Логинимся в каждом расширении и пользуемся. В каждом агенте можно (и нужно) настраивать &lt;em&gt;workflows&lt;/em&gt;, &lt;em&gt;skills&lt;/em&gt; и &lt;em&gt;rules&lt;/em&gt; под свои задачи.&lt;/p&gt;
  &lt;p id=&quot;Qiev&quot;&gt;Дополнительно я скачал плагин &lt;strong&gt;markdownlint&lt;/strong&gt; для чтения и подсветки &lt;code&gt;.md&lt;/code&gt; файлов. В работе с логами и документацией от агентов — вещь очень полезная. Всякие зависимости, связанные с Python, редактор должен предложить скачать сам — просто соглашайтесь.&lt;/p&gt;
  &lt;figure id=&quot;LjdL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2f/0e/2f0eae9d-1f87-42e3-ada1-9e267a91f1ae.png&quot; width=&quot;670&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;G54l&quot;&gt;Antigravity Tools: Ультимативный менеджер аккаунтов&lt;/h2&gt;
  &lt;p id=&quot;bxJc&quot;&gt;Разберем инструмент, который станет вашим основным помощником в работе. Это стороннее решение, но оно отрабатывает на все 100%, к тому же проект полностью &lt;a href=&quot;https://github.com/lbjlaq/Antigravity-Manager&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;open-source&lt;/strong&gt; — &lt;strong&gt;Antigravity Tools&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;UQYG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/76/86/7686ef34-6917-4dcb-b155-a90657d54570.png&quot; width=&quot;1328&quot; /&gt;
    &lt;figcaption&gt;Окно Antigravity Tools&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;0g6j&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5b/32/5b323ded-1e05-4697-8b79-d56939e1b116.png&quot; width=&quot;1328&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;KvKp&quot;&gt;Установка&lt;/h3&gt;
  &lt;p id=&quot;FfZf&quot;&gt;Для установки выполните следующую команду в терминале:&lt;/p&gt;
  &lt;p id=&quot;vO7k&quot;&gt;Bash&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;pre id=&quot;DJ2m&quot;&gt;irm https://raw.githubusercontent.com/lbjlaq/Antigravity-Manager/main/install.ps1 | iex&lt;/pre&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;hV54&quot;&gt;Почему это маст-хэв?&lt;/h3&gt;
  &lt;p id=&quot;pRIJ&quot;&gt;Основная проблема Google в том, что он часто ограничивает возможности «агентской» (командной) работы для определенных типов подписок.&lt;/p&gt;
  &lt;p id=&quot;gGgn&quot;&gt;Если вы приобрели &lt;strong&gt;студенческую&lt;/strong&gt; или &lt;strong&gt;семейную подписку&lt;/strong&gt; (например, на маркетплейсах вроде &lt;em&gt;Plati&lt;/em&gt;), Google может не дать вам использовать все «плюшки» напрямую. &lt;strong&gt;Antigravity&lt;/strong&gt; обходит это ограничение: он позволяет войти в аккаунт внутри менеджера и использовать функционал подписки на полную мощность без лишних костылей.&lt;/p&gt;
  &lt;h3 id=&quot;MY1U&quot;&gt;Ключевые возможности:&lt;/h3&gt;
  &lt;ul id=&quot;xbOE&quot;&gt;
    &lt;li id=&quot;yIL7&quot;&gt;&lt;strong&gt;Мониторинг ресурсов:&lt;/strong&gt; удобный просмотр доступных лимитов и точного времени обновления квот.&lt;/li&gt;
    &lt;li id=&quot;q2c1&quot;&gt;&lt;strong&gt;Smart Switching:&lt;/strong&gt; автоматическое переключение на следующий аккаунт, если на текущем закончились лимиты.&lt;/li&gt;
    &lt;li id=&quot;ycDw&quot;&gt;&lt;strong&gt;Мгновенная навигация:&lt;/strong&gt; очень быстрое переключение между десятками профилей в один клик.&lt;/li&gt;
    &lt;li id=&quot;PWvu&quot;&gt;&lt;strong&gt;Изоляция:&lt;/strong&gt; возможность настройки индивидуальных прокси для каждого отдельного аккаунта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;SHsD&quot;&gt;&lt;em&gt;Так вот в общих чертах мы подготовили все для агентной работы, тут может быть в целом любой стэк который вам комфортно, например: cursor + claude code и т.п. принципы везде одни.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;blockquote id=&quot;3uq3&quot;&gt;&lt;em&gt;Текст редактировал и форматировал нейронкой для комфортного чтения &lt;/em&gt;&lt;/blockquote&gt;

</content></entry><entry><id>ultramarineart:vsuesetup</id><link rel="alternate" type="text/html" href="https://teletype.in/@ultramarineart/vsuesetup?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ultramarineart"></link><title>Установка и настройка Visual Studio 2022 для Unreal Engine 5</title><published>2026-03-09T16:14:11.130Z</published><updated>2026-03-11T12:11:50.666Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/90/37/903723c4-46dc-4028-97f4-f793bc6943c9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ac/5d/ac5dc531-6ba9-482d-bb26-ed6f86c0f0e7.png&quot;&gt;Для чего это нужно? Мы будем использовать ИИ-агентов для написания C++ кода. Любой написанный код необходимо компилировать. Visual Studio (VS) — идеальный инструмент для нашей задачи: у нее есть бесплатная версия, она относительно легко настраивается и содержит всё необходимое для связи между Unreal Build Tool (UBT) и редактором UE.</summary><content type="html">
  &lt;blockquote id=&quot;2Kvu&quot;&gt;Для чего это нужно? Мы будем использовать ИИ-агентов для написания C++ кода. Любой написанный код необходимо компилировать. Visual Studio (VS) — идеальный инструмент для нашей задачи: у нее есть бесплатная версия, она относительно легко настраивается и содержит всё необходимое для связи между Unreal Build Tool (UBT) и редактором UE.&lt;/blockquote&gt;
  &lt;h4 id=&quot;CFB9&quot;&gt;Шаг 1: Установка Visual Studio&lt;/h4&gt;
  &lt;p id=&quot;dXaI&quot;&gt;Для Unreal Engine 5 (включая версии 5.2 и, как в нашем случае, 5.7) стандартом является Visual Studio 2022.&lt;/p&gt;
  &lt;ol id=&quot;J0i1&quot;&gt;
    &lt;li id=&quot;MTnz&quot;&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/ru/vs/community/&quot; target=&quot;_blank&quot;&gt;Скачай установщик Visual Studio 2022 &lt;/a&gt;(версия Community бесплатна) с официального сайта Microsoft.&lt;/li&gt;
    &lt;li id=&quot;Fmqc&quot;&gt;Запусти Visual Studio Installer.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;SM2c&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/5d/ac5dc531-6ba9-482d-bb26-ed6f86c0f0e7.png&quot; width=&quot;1274&quot; /&gt;
    &lt;figcaption&gt;окно Visual Studio Installer&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;PKGc&quot;&gt;Шаг 2: Выбор рабочих нагрузок (Workloads)&lt;/h4&gt;
  &lt;p id=&quot;GXnY&quot;&gt;Это самый важный этап установки. В установщике на вкладке «Рабочие нагрузки» отметь следующие пункты:&lt;/p&gt;
  &lt;ul id=&quot;IyjY&quot;&gt;
    &lt;li id=&quot;nxYK&quot;&gt;&lt;strong&gt;Разработка игр на C++&lt;/strong&gt; (Game development with C++)&lt;/li&gt;
    &lt;li id=&quot;L262&quot;&gt;&lt;strong&gt;Разработка классических приложений на C++&lt;/strong&gt; (Desktop development with C++) — &lt;em&gt;опционально, но помогает избежать проблем с отсутствующими базовыми библиотеками в дальнейшем.&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;blockquote id=&quot;NXO2&quot;&gt;&lt;strong&gt;Нюанс, на который стоит обратить внимание:&lt;/strong&gt; Выбрав «Разработку игр на C++», обязательно разверни список дополнительных компонентов в панели деталей справа. Проверь наличие галочек на следующих пунктах (если их нет — добавь вручную):&lt;/blockquote&gt;
  &lt;blockquote id=&quot;djIk&quot;&gt;C++ profiling tools&lt;/blockquote&gt;
  &lt;blockquote id=&quot;XpYn&quot;&gt;C++ AddressSanitizer&lt;/blockquote&gt;
  &lt;blockquote id=&quot;sYxr&quot;&gt;Windows 10 SDK или Windows 11 SDK (выбирай самую последнюю версию из списка)&lt;/blockquote&gt;
  &lt;blockquote id=&quot;Ulz9&quot;&gt;Unreal Engine installer&lt;/blockquote&gt;
  &lt;blockquote id=&quot;AECK&quot;&gt;MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)&lt;/blockquote&gt;
  &lt;figure id=&quot;Z6rI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/08/61/08614d9a-1c26-4de5-8380-cfce8232516f.png&quot; width=&quot;1227&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;6cOY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5d/42/5d429662-6b88-4399-bf4b-fb2ccb74513b.png&quot; width=&quot;335&quot; /&gt;
    &lt;figcaption&gt;Элементы которые необходимо установить &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;FLoc&quot;&gt;Шаг 3: Интеграция в Unreal Engine 5&lt;/h4&gt;
  &lt;p id=&quot;jmIO&quot;&gt;После установки VS 2022 нужно явно указать движку использовать именно её.&lt;/p&gt;
  &lt;ol id=&quot;ISwl&quot;&gt;
    &lt;li id=&quot;jnIl&quot;&gt;Открой свой проект в Unreal Engine.&lt;/li&gt;
    &lt;li id=&quot;S7Ky&quot;&gt;Перейди в &lt;code&gt;Edit&lt;/code&gt; -&amp;gt; &lt;code&gt;Editor Preferences&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;vUr0&quot;&gt;В поиске слева введи &lt;code&gt;Source Code&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;FLU2&quot;&gt;В поле &lt;code&gt;Source Code Editor&lt;/code&gt; выбери &lt;code&gt;Visual Studio 2022&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;Lpba&quot;&gt;Перезапусти редактор UE.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;TVq8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/51/88/51884da6-4ec7-4ffe-9cdb-44fb508847a4.png&quot; width=&quot;572&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;k3Of&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/2c/022cf44d-084f-4d63-a77a-e9526ec005a3.png&quot; width=&quot;924&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;yAHQ&quot;&gt;Шаг 4: Подготовка проекта и первая сборка&lt;/h4&gt;
  &lt;ol id=&quot;8sir&quot;&gt;
    &lt;li id=&quot;wtgc&quot;&gt;Создай новый проект. Можно использовать готовые пресеты, главное условие — &lt;strong&gt;проект должен быть на C++&lt;/strong&gt; (а не просто Blueprint).&lt;/li&gt;
    &lt;li id=&quot;QWlO&quot;&gt;В редакторе UE нажми &lt;code&gt;Tools&lt;/code&gt; -&amp;gt; &lt;code&gt;Refresh Visual Studio Project&lt;/code&gt;. Это обновит файлы решения и подтянет зависимости.&lt;/li&gt;
    &lt;li id=&quot;X7J0&quot;&gt;Затем нажми &lt;code&gt;Tools&lt;/code&gt; -&amp;gt; &lt;code&gt;Open Visual Studio&lt;/code&gt;. Проект откроется внутри IDE. &lt;/li&gt;
    &lt;li id=&quot;2nNx&quot;&gt;В самой Visual Studio в верхнем меню нажми &lt;code&gt;Build&lt;/code&gt; -&amp;gt; &lt;code&gt;Build Solution&lt;/code&gt; (или &lt;code&gt;Rebuild Solution&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;A6Mp&quot;&gt;Дождись окончания процесса. Внизу должно появиться сообщение об удачной сборке.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;Dujo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/13/101347c2-da51-4cd1-b202-4e11961f6eab.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Пункт 3. Окно редактора после его вызова из UE&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;L5Ta&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b2/f5/b2f55a31-0196-49d7-afa7-f5a05857cfa5.png&quot; width=&quot;909&quot; /&gt;
    &lt;figcaption&gt;Пункт 4. &lt;strong&gt;Build Solution &lt;/strong&gt;или&lt;strong&gt; Rebuild Solution&lt;/strong&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;z4m7&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/95/ea950552-7686-4b2e-8fa5-c71de3596345.png&quot; width=&quot;771&quot; /&gt;
    &lt;figcaption&gt;Пункт 5. Сообщение о сборке&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;ieOS&quot;&gt;Ограничения и варианты решения проблем при компиляции&lt;/h3&gt;
    &lt;p id=&quot;dESh&quot;&gt;При работе с кодом (особенно сгенерированным ИИ) или при переносе старых проектов вы почти наверняка столкнетесь с ошибками компиляции. Как действовать:&lt;/p&gt;
    &lt;p id=&quot;miJs&quot;&gt;&lt;strong&gt;Проблема: Ошибки при переводе старого Blueprint-проекта на C++&lt;/strong&gt; Можно попытаться сгенерировать C++ классы прямо в старом проекте, но часто это приводит к конфликтам модулей и крашам при сборке.&lt;/p&gt;
    &lt;ul id=&quot;kirg&quot;&gt;
      &lt;li id=&quot;8Z2Q&quot;&gt;&lt;strong&gt;Самый надежное:&lt;/strong&gt; Создать чистый новый C++ проект (как описано в Шаге 4) и сделать Migrate (миграцию) всех нужных ассетов из старого проекта в новый. Продолжать работу там.&lt;/li&gt;
      &lt;li id=&quot;ND5O&quot;&gt;&lt;strong&gt;Рискнуть и чинить на месте:&lt;/strong&gt; Если нужно оставить старый проект, и сборка сломалась — закрой UE и VS. Зайди в папку проекта, удали папки &lt;code&gt;Binaries&lt;/code&gt;, &lt;code&gt;Intermediate&lt;/code&gt; и файл &lt;code&gt;.sln&lt;/code&gt;. Кликни правой кнопкой мыши по файлу &lt;code&gt;.uproject&lt;/code&gt;, выбери &lt;code&gt;Generate Visual Studio project files&lt;/code&gt;. Открой появившийся &lt;code&gt;.sln&lt;/code&gt; файл и снова запусти &lt;code&gt;Rebuild Solution&lt;/code&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;Ktit&quot;&gt;Важное ограничение: Конфликт сборки и Live Coding&lt;/h3&gt;
    &lt;p id=&quot;m7TU&quot;&gt;При попытке собрать проект (&lt;code&gt;Build Solution&lt;/code&gt;) в Visual Studio, когда у вас параллельно открыт редактор Unreal Engine, вы почти гарантированно получите ошибку компиляции (ошибку прав доступа).&lt;/p&gt;
    &lt;p id=&quot;o17G&quot;&gt;Это происходит из-за включенной по умолчанию функции &lt;strong&gt;Live Coding&lt;/strong&gt; в UE5, которая блокирует файлы кода во время работы движка. Поскольку при работе с ИИ-агентами мы часто будем генерировать новые классы и менять заголовочные файлы, Live Coding будет только мешать. Эту функцию лучше сразу отключить, чтобы избежать постоянных конфликтов при сборке.&lt;/p&gt;
    &lt;p id=&quot;Peln&quot;&gt;&lt;strong&gt;Как отключить Live Coding:&lt;/strong&gt;&lt;/p&gt;
    &lt;ol id=&quot;wPW2&quot;&gt;
      &lt;li id=&quot;6246&quot;&gt;В Unreal Engine перейди в &lt;code&gt;Edit&lt;/code&gt; -&amp;gt; &lt;code&gt;Editor Preferences&lt;/code&gt;.&lt;/li&gt;
      &lt;li id=&quot;dVnK&quot;&gt;В строке поиска введи &lt;code&gt;Live Coding&lt;/code&gt;.&lt;/li&gt;
      &lt;li id=&quot;mWti&quot;&gt;Сними галочку с пункта &lt;code&gt;Enable Live Coding&lt;/code&gt;.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;p id=&quot;caWt&quot;&gt;&lt;em&gt;[Место под скриншот: Окно поиска Live Coding со снятой галочкой]&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;l8mA&quot;&gt;&lt;strong&gt;Короткий комментарий по нюансу работы:&lt;/strong&gt; После отключения Live Coding правило сборки становится максимально строгим. Если ИИ-агент написал код, который меняет архитектуру или заголовочный файл (добавил новые переменные &lt;code&gt;UPROPERTY&lt;/code&gt;, новые компоненты или функции &lt;code&gt;UFUNCTION&lt;/code&gt;), вам &lt;strong&gt;обязательно&lt;/strong&gt; нужно закрыть редактор Unreal Engine, нажать &lt;code&gt;Build Solution&lt;/code&gt; в Visual Studio, дождаться завершения и запустить движок заново.&lt;/p&gt;
    &lt;p id=&quot;BlrL&quot;&gt;Если же вы (или агент) просто поменяли логику внутри уже существующей функции (например, изменили цифру урона или скорости), закрывать движок не нужно — можно просто нажать кнопку &lt;code&gt;Compile&lt;/code&gt; (иконка кубиков) в самом редакторе UE в правом нижнем углу.&lt;/p&gt;
    &lt;figure id=&quot;Z8yn&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img1.teletype.in/files/88/82/888220f4-54be-4a7d-b20d-07932bb29aa1.png&quot; width=&quot;1919&quot; /&gt;
      &lt;figcaption&gt;Live Coding&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;qFEb&quot;&gt;В целом мы подготовили наш проект для работы с кодом и агентами, вы по прежнему можете создавать блюпринты, если кто-то почему-то в этом сомневался.&lt;/p&gt;
  &lt;blockquote id=&quot;Lw03&quot;&gt;&lt;em&gt;Текст редактировал и форматировал с помощью нейросети, что бы он был читабельный.&lt;/em&gt;&lt;/blockquote&gt;

</content></entry></feed>