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

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

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

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

]]></content:encoded></item></channel></rss>