<?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>Hardway</title><generator>teletype.in</generator><description><![CDATA[Hardway]]></description><image><url>https://img2.teletype.in/files/97/c2/97c22e99-9dbc-4049-a9cf-7e3abb5bdd83.png</url><title>Hardway</title><link>https://teletype.in/@hardway</link></image><link>https://teletype.in/@hardway?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/hardway?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/hardway?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 06 Apr 2026 15:38:25 GMT</pubDate><lastBuildDate>Mon, 06 Apr 2026 15:38:25 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@hardway/MotionMatchingUE</guid><link>https://teletype.in/@hardway/MotionMatchingUE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/MotionMatchingUE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Unreal Engine 5 Motion Matching</title><pubDate>Wed, 07 Aug 2024 15:56:19 GMT</pubDate><category>Анимация</category><description><![CDATA[<img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/102cfffc-c8f2-450b-8a33-6bc53c68ca47/image_000.gif"></img>Используйте Motion Matching для создания отзывчивых систем анимации, которые выбирают позы анимации из базы данных, чтобы соответствовать динамическим запросам системы во время выполнения.]]></description><content:encoded><![CDATA[
  <p id="rLcE">Оглавление</p>
  <nav>
    <ul>
      <li class="m_level_1"><a href="#onjR">Motion Matching</a></li>
      <li class="m_level_1"><a href="#prerequisites">Предварительная подготовка</a></li>
      <li class="m_level_1"><a href="#motionmatchingsetup">Настройка Motion Matching</a></li>
      <li class="m_level_2"><a href="#ijNa">Создание ассета  Pose Search Schema </a></li>
      <li class="m_level_1"><a href="#qxrg">Руководство по ассету Pose Search Schema</a></li>
      <li class="m_level_2"><a href="#channels">Каналы</a></li>
      <li class="m_level_2"><a href="#experimentalchannels">Экспериментальные каналы</a></li>
      <li class="m_level_2"><a href="#createaposesearchdatabaseasset">Создание ассета Pose Search Database</a></li>
      <li class="m_level_1"><a href="#createthesimplestsetup:motionmatchingnodeandposehistorynode">Создание простейшей установки: Узел Motion Matching и узел Pose History</a></li>
      <li class="m_level_1"><a href="#motionmatchingnode">Узел Motion Matching</a></li>
      <li class="m_level_1"><a href="#animnotifyfiltering">Anim Notify Filtering</a></li>
      <li class="m_level_1"><a href="#posesearchschemachannelweights">Pose Search Schema Channel Weights</a></li>
      <li class="m_level_1"><a href="#posesearchnormalizationsets">Pose Search Normalization Sets</a></li>
      <li class="m_level_1"><a href="#0uTb">Motion Matching Notifies</a></li>
      <li class="m_level_1"><a href="#animationwarping">Animation Warping</a></li>
      <li class="m_level_1"><a href="#motionmatchingdebugging">Отладка системы Motion Matching</a></li>
      <li class="m_level_1"><a href="#moreinformation">Дополнительная информация</a></li>
    </ul>
  </nav>
  <h2 id="onjR">Motion Matching</h2>
  <p id="NuX3">Используйте Motion Matching для создания отзывчивых систем анимации, которые выбирают позы анимации из базы данных, чтобы соответствовать динамическим запросам системы во время выполнения. </p>
  <p id="rfSK"><strong>Motion Matching</strong> в Unreal Engine - это система выбора позы анимации, основанная на запросах. Находясь в плагине Pose Search, вы можете использовать узел Motion Matching <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/animation-blueprints-in-unreal-engine" target="_blank">Animation Blueprint</a> в качестве динамической альтернативы <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/state-machines-in-unreal-engine" target="_blank">машинам состояний</a> или Blendspaces. В отличие от традиционных систем анимации, Motion Matching может делать обоснованный выбор позы анимации из набора данных анимации, чтобы создать отзывчивую и реактивную систему анимации, без необходимости настраивать логику перехода или смешивания между анимациями.</p>
  <figure id="qw3w" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/102cfffc-c8f2-450b-8a33-6bc53c68ca47/image_000.gif" width="768" />
  </figure>
  <p id="hVlE">Узел Motion Matching запрашивает каналы персонажа через схему (например, положение и скорость кости) и делает выбор позы анимации из набора данных анимации, хранящихся в ассете базы данных, чтобы соответствовать запросу. Результаты анимации персонажей с помощью Motion Matching более реактивны и отвечают требованиям игровых систем, чем традиционные машины состояний или логика смешивания. </p>
  <p id="09yf">С помощью Motion Matching вы можете повысить точность анимации персонажа, просто добавив больше данных об анимации в базу данных. При увеличении количества данных анимации узел Motion Matching получает доступ к большему количеству данных для выбора, без необходимости изменять или реализовывать дополнительную логику переходов. </p>
  <p id="b3Kc">Система Motion Matching в Unreal Engine также содержит набор настроек и инструментов отладки, которые можно использовать для настройки системы анимации в соответствии с целями вашего проекта. С помощью этих инструментов вы можете наблюдать за выбором, редактировать процесс запроса и устанавливать веса критериев выбора. </p>
  <p id="u1In">В этом документе представлен обзор Motion Matching в Unreal Engine, а также пример рабочего процесса по настройке системы анимации передвижения персонажа с помощью Motion Matching.</p>
  <h2 id="prerequisites">Предварительная подготовка</h2>
  <ul id="AGtZ">
    <li id="RBvC">Включите плагин <strong>Pose Search</strong>. Перейдите в строке меню <strong>Edit &gt; Plugins</strong> и найдите его в разделе Animation или воспользуйтесь строкой поиска. Включите плагин и перезапустите редактор.</li>
  </ul>
  <figure id="gLsT" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/43c1becc-898f-4451-99d0-48066b52503c/image_100.png" width="464" />
  </figure>
  <ul id="8NG7">
    <li id="EsCA">Ваш проект содержит персонажа с набором анимаций движения (ходьба, бег и повороты). Если у вас их нет, вы можете загрузить образец проекта Game Animation Sample Project с Unreal Engine Marketplace. Дополнительную информацию об этом проекте-образце можно найти в документации <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/game-animation-sample-project-in-unreal-engine" target="_blank">Game Animation Sample Project</a>.</li>
  </ul>
  <h2 id="motionmatchingsetup">Настройка Motion Matching</h2>
  <p id="tdWb">Здесь вы можете проследить за тем, как настроить простую систему Motion Matching, основанную на передвижении, в вашем проекте. Более подробную и сложную настройку можно найти в документации по проекту Game Animation Sample.</p>
  <h3 id="ijNa">Создание ассета  Pose Search Schema </h3>
  <p id="oS1y">Ассет Pose Search Schema хранит конфигурацию согласования движений и настройки запросов. Этот ассет используется для связи баз данных анимации и системы запросов с узлом Motion Matching и определяет данные, которые будут использоваться для запроса, чтобы сделать выбор анимации.</p>
  <figure id="EK3W" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/41d4b2e3-9e0a-4946-ba77-a181bc16c3f2/image_200.png" width="128" />
  </figure>
  <p id="FDxI">Чтобы создать ассет Pose Search Schema, щелкните правой кнопкой мыши в браузере контента (+) Add и выберите <strong>Animation</strong> &gt; <strong>Motion Matching</strong> &gt; <strong>Pose Search Schema</strong>.</p>
  <figure id="JQLw" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/17bead72-b74e-4b32-a40a-95b3ba75995e/image_300.png" width="766" />
  </figure>
  <p id="K1bL">После создания нового ассета Pose Search Schema вам будет предложено выбрать скелет персонажа, для которого вы создаете систему согласования движений.</p>
  <figure id="BwfN" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/102ce4c6-a1ae-4a37-9053-bf676c11e5d9/image_400.png" width="504" />
  </figure>
  <p id="Khzw">Новые ассеты Pose Search Schema поставляются с двумя каналами - <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine#trajectorychannel" target="_blank">каналом траектории</a> и <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine#posesearchchannel" target="_blank">каналом поиска позы</a> - для настройки передвижения. С помощью канала Траектории вы можете задать точки для <strong>Motion Trajectory Component</strong> для выборки, чтобы сделать выборку позы. Настройки по умолчанию подойдут для этого примера, однако вы можете добавить дополнительные семлы с помощью (+) Add в свойстве Samples, чтобы обеспечить больше полезных данных для системы согласования движений при выборе позы.</p>
  <blockquote id="D9LK">Рекомендуется использовать как можно меньше семплов. Хотя большее количество семплов может обеспечить узлу Motion Matching более точные данные, это может исказить результаты работы системы.</blockquote>
  <figure id="GeNs" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/494cb058-2ef7-433f-9864-cdbf296340a9/image_500.png" width="479" />
  </figure>
  <p id="trajectorychannel"><strong>Канал Траектории (Trajectory Channel)</strong></p>
  <p id="u4KG">Каждому индексу в канале траектории можно присвоить флаги, чтобы определить, какой тип данных будет искать точка выборки при запросе канала траектории движения. Для данного примера рабочего процесса подойдут значения по умолчанию. Дополнительные сведения о настройках и флагах канала траектории см. в разделе <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine#trajectorychannel" target="_blank">Справочник канала траектории</a>.</p>
  <figure id="PnSi" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/f6b0385a-b0b6-44c7-8c78-29c902da72c4/image_600.png" width="474" />
  </figure>
  <p id="posechannelchannel"><strong>Канал Pose Channel</strong></p>
  <p id="Xzx8">С помощью канала Pose Channel можно задать определения костей для системы Motion Matching, чтобы сопоставить позы с помощью системы запросов. В ассете по умолчанию предварительно настроены определения костей для костей ног скелета манекена <strong>foot_l</strong> и <strong>foot_r</strong>. Если вы используете другой скелет, замените эти определения костей костями левой и правой ступни вашего ассета скелета.</p>
  <figure id="HG0k" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/ff56145e-5250-4b23-a9b2-42ae918a2bf5/image_700.png" width="475" />
  </figure>
  <p id="wcr2">Вы также можете установить флаги для каждой сэмплированной кости, чтобы определить, какой тип данных из сэмплированной кости будет рассматривать система согласования движений, чтобы сделать выборку. Дополнительные сведения о настройках канала Pose Channel и флагах различий см. в разделе Канал <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine#posechannel" target="_blank">Pose Channel</a>.</p>
  <blockquote id="RZWT">Канал Pose Channel может использовать любую кость в качестве опорной точки. Для системы анимации, соответствующей движению, вы захотите выбрать пару костей, которые будут полезны для отслеживания данных, связанных с движением, например ноги персонажей. В альтернативной системе, например в системе скалолазания, вы захотите выбрать кости, которые будут содержать больше ценных данных, например кости рук персонажей.</blockquote>
  <p id="q9BX">В ассет Motion Database Config можно добавить больше каналов, но чем больше каналов и сэмплов внутри каналов, тем больше производительности потребуется для работы.</p>
  <p id="VUsj">Для данного примера рабочего процесса значения по умолчанию обеспечат хорошие результаты движения.</p>
  <hr />
  <h2 id="qxrg">Руководство по ассету Pose Search Schema</h2>
  <p id="EeL8">Здесь вы можете просмотреть список свойств и настроек ассета Pose Search Schema.</p>
  <p id="TWKg"><strong>Skeleton<br /></strong>Здесь вы можете определить ассет Skeleton для вашего персонажа, который будет использовать узел Motion Matching.</p>
  <p id="mI8l"><strong>Mirror Data Table<br /></strong>Здесь вы можете установить ассет Mirror Data Table, чтобы обеспечить зеркальное отображение анимаций для узла Motion Matching, который будет использовать их при выборе анимации.</p>
  <p id="UzoF"><strong>Data Preprocessor<br /></strong>Установите тип операции, выполняемой с полным набором данных по позиционированию. Можно выбрать один из следующих вариантов:</p>
  <ul id="9F8y">
    <li id="DSR9"><strong>None</strong>: Эта опция не применяет никакой предварительной обработки данных.</li>
    <li id="2zsw"><strong>Normalize</strong>: Эта опция нормализует все данные относительно их отклонения. Кроме того, все веса будут приведены к единичному векторному значению.</li>
    <li id="KvGI"><strong>Normalize Only by Deviation</strong>: Эта опция нормализует все данные только по их отклонению, не нормализуя значения веса.</li>
  </ul>
  <p id="Pqv5"><strong>Sample Rate<br /></strong>Установите частоту обновления данных анимации в базе данных. Чем выше частота выборки, тем более точным будет поиск поз анимации, но это приведет к увеличению затрат памяти системы.</p>
  <p id="8rg6"><strong>Channels<br /></strong>Здесь вы можете добавить и настроить каналы для системы согласования движений, которые будут использоваться при запросе, поиске и согласовании поз анимации во время выполнения. Каналы разбивают стоимость ассета Pose Search Schema на более простые части, такие как положение или скорость костей семпла или фазы конечностей. Общая стоимость запроса к индексированной базе данных поз будет равна сумме затрат по каналам. Вы можете добавить канал с помощью кнопки (+) Add и выбрать канал из выпадающего меню. Добавление дополнительных каналов детализирует поиск в системе согласования движений, но требует больше памяти и затрат на производительность.</p>
  <p id="E7Yr">Рекомендуется использовать столько каналов, сколько необходимо для достижения целей вашей анимационной системы.</p>
  <p id="2DeI">Более подробную информацию об отдельных каналах и их свойствах см. в разделе &quot;<a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine#channels" target="_blank">Каналы</a>&quot;.</p>
  <p id="QP9h"><strong>Number of Permutations<br /></strong>Установите количество раз, которое будут индексироваться анимационные ассеты из связанной базы данных при выборе.</p>
  <p id="Bvxv"><strong>Permutations Time Offset<br /></strong>Установите значение, которое будет представлять собой начальное смещение PermutationTime от Sampling Time первой перестановки. Последующие перестановки будут использовать формулу перетекания для определения смещения времени перестановки:  PermutationTime = SamplingTime + PermutationTimeOffset + PermutationIndex / PermutationSampleRate .</p>
  <p id="1udm"><strong>Add Data Padding<br /></strong>Если эта функция включена, в ассет Motion Database Config будет добавлен канал смещения, чтобы убедиться, что данные выровнены по 16 байтам и вмещены для повышения производительности за счет возможной дополнительной памяти.</p>
  <p id="IcxC"><strong>Inject Additional Debug Channels<br /></strong>Когда эта функция включена, каналам будет предложено ввести дополнительные каналы в эту схему. Изначально предполагалось добавить UPoseSearchFeatureChannel_postions(s), чтобы помочь справиться со сложностью отладочного рисования (в базе данных будут все необходимые позиции для рисования линий в нужном месте и в нужное время).</p>
  <h3 id="channels">Каналы</h3>
  <p id="XW5n">Здесь вы можете получить список доступных каналов для ассета Motion Database Schema.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="group"><strong>Group</strong></p>
  </section>
  <p id="SwXu">Вы можете использовать Group Channel для объединения других ассетов Pose Search Schema в группы, чтобы выполнять операции вместе. После создания группового канала вы можете создать дополнительные каналы в его свойстве Sub-Channel, используя (+) <strong>Add</strong>.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="heading"><strong>Heading</strong></p>
  </section>
  <p id="rFfK">Вы можете использовать канал Heading Channel для запроса направления движения системы. Это может быть полезно, когда вы хотите сопоставить компоненты ориентации конкретной кости, выраженные в виде оси направления, например, только горизонтальное или вертикальное движение кости. </p>
  <p id="1r0H">Здесь вы можете ознакомиться со списком свойств канала Heading Channel и описанием их функций:</p>
  <p id="EYpL"><strong>Debug Color<br /></strong>Здесь вы можете задать цвет отладочного рисунка, который будет отображаться во вьюпорте, чтобы помочь в отладке системы согласования движений.</p>
  <p id="EYLM"><strong>Bone<br /></strong>Здесь вы можете назначить кость из скелета персонажа, которая будет использоваться в запросе для выбора позы. Вы можете выбрать кость из иерархии скелета с помощью выпадающего меню.</p>
  <p id="JUb1"><strong>Origin Bone<br /></strong>Задайте кость скелета, которая будет служить исходной костью для определения направления движения. Вы можете выбрать кость из скелета персонажа с помощью выпадающего иерархического меню.</p>
  <p id="6k4b"><strong>Weight<br /></strong>Установите значение веса, которое будет использоваться для взвешивания влияния этого канала на выходную позу по сравнению с другими каналами в ассете Motion Database Config.</p>
  <p id="YhCd"><strong>Sample Attribute ID<br /></strong>Задайте значение, которое будет использоваться в качестве идентификатора атрибута семпла. Если это значение больше 0,0, ожидается, что все анимации, содержащиеся в Pose Search Database, связанной с этим ассетом Pose Search Schema, содержащимся в этом канале, будут иметь Pose Search: Sampling Attribute ID Notify State, и свойство Sampling Attribute определено. Значение, установленное в этом свойстве, будет использоваться в качестве источника данных вместо канала Bone. Значения свойства Sampling Attribute будут преобразованы в пространство Origin Bone.</p>
  <p id="sglW"><strong>Sample Time Offset<br /></strong>Здесь можно задать значение, которое будет использоваться в качестве смещения для времени выборки.</p>
  <p id="tu5D"><strong>Origin Time Offset<br /></strong>Здесь вы можете задать значение, которое будет использоваться для смещения времени начала отчета. Данные относительно Sampling Time, связанного с Origin Bone этого канала (Root или Trajectory Bone), будут смещены на значение этого свойства в секундах. Например, если Origin Bone установлена на головную кость персонажа, Sample Time Offset установлено на 0,5, а Origin Time Offset установлено на 0,5, этот канал будет пытаться сопоставить будущее направление головной кости персонажа на 0,5 секунды вперед относительно будущей корневой кости в то же самое время.</p>
  <p id="FRJz"><strong>Heading Axis<br /></strong>Установите ось (X, Y или Z), которая будет использоваться для опроса движения выбранного свойства Bone.</p>
  <p id="2t8j"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="rbx7">
    <li id="XzBx"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="5ZWy"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="oLri"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную смешивание для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <p id="rMzL"><strong>Component Stripping<br /></strong>Здесь можно выбрать конкретную ось движения для выделения из запрашиваемых данных. Выбор None не приводит к отсечению компонентов, при выборе Strip XY будет наблюдаться движение только по осям X и Y, совпадающее с горизонтальной плоскостью, а при выборе Strip Z будет наблюдаться движение только по оси Z, совпадающее с движением по высоте запроса.</p>
  <p id="D39m"><strong>Permutation Time Type<br /></strong>Здесь вы можете выбрать тип времени перестановки, который будет использоваться при выборке анимации. Вы можете выбрать один из следующих вариантов:</p>
  <ul id="lEIg">
    <li id="bbNR"><strong>Use Sample Time</strong>: Этот тип сэмплирует Bone и Origin Bone в одно и то же время сэмплирования, в дополнение к возможному смещению времени сэмплирования Bone. Оно определяется как текущее время оценки анимации.</li>
    <li id="dTLR"><strong>Use Permutation Time</strong>: Этот тип сэмплирует кость и исходную кость в одно и то же время перестановки, в дополнение к возможному смещению времени сэмплирования кости. Он определяется как SampleTime (как UseSampleTime) + Schema -&gt; PermutationTimeOffset + PermutationIndex / Schema -&gt; PermutationSampleRate, где PurmutationIndex находится в диапазоне [0, Schema -&gt; Number of Permutations].</li>
    <li id="UUKh"><strong>Use Sample to Permutation Time</strong>: Этот тип оценивает кость во время выборки, в дополнение к возможному смещению времени выборки для кости, а исходная кость оценивается во время перестановки.</li>
  </ul>
  <p id="GZox"><strong>Normalization Group<br /></strong>Здесь можно задать группу нормализации, чтобы нормализовать запрос канала по отношению к другим Heading Channels. Если этот параметр установлен, все каналы одного класса с одинаковой кардинальностью и одинаковой группой нормализации будут нормализованы вместе. Например, в базе данных перемещения персонажа, держащего оружие, содержащей анимации, не поддающиеся изменению, вы все равно можете захотеть нормализовать положение и скорость левой и правой ног.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="padding"><strong>Padding</strong></p>
  </section>
  <p id="US7L">Канал подгонки используется для добавления дополнительных данных подгонки в базу данных Motion Matching, чтобы повысить производительность за счет дополнительной памяти. Канал автоматически вводится в схему поиска позы, если свойство Add Data Padding включено и установлено на 16 байт. Вы можете задать количество перестановок, при которых канал будет добавлять данные, используя свойство Padding Size.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="phase"><strong>Phase</strong></p>
  </section>
  <p id="cH00">Здесь вы можете обратиться к свойствам канала Phase и описанию их функциональности:</p>
  <p id="xjLt"><strong>Debug Color<br /></strong>Здесь вы можете задать цвет отладочного рисунка, который будет отображаться во вьюпорте, чтобы упростить отладку системы согласования движений.</p>
  <p id="WdW7"><strong>Bone<br /></strong>Здесь вы можете назначить кость из скелета персонажа, которая будет использоваться в запросе для выбора позы. Вы можете выбрать кость из иерархии скелета с помощью выпадающего меню.</p>
  <p id="H94J"><strong>Weight<br /></strong>Установите значение веса, которое будет использоваться для расчета влияния этого канала на выходную позу по сравнению с другими каналами в ассете Motion Database Config.</p>
  <p id="BJn5"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="9nX3">
    <li id="M8Cs"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="xoSK"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="bSjN"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную комбинацию для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="pose"><strong>Pose</strong></p>
  </section>
  <p id="YvAa">Вы можете использовать канал Pose для вычисления положения персонажа в пространстве персонажа, а не в глобальном пространстве. Этот канал полезен, когда движение, которое вы хотите запросить, является локальным для позиции персонажа, а не глобальным.</p>
  <p id="Bxok">Здесь вы можете ознакомиться со свойствами канала Pose и описанием их функциональности:</p>
  <p id="gDLK"><strong>Weight<br /></strong>Установите значение веса, которое будет использоваться для взвешивания влияния этого канала на выходную позу по сравнению с другими каналами в ассете Motion Database Config.</p>
  <p id="z9j6"><strong>Sampled Bones<br /></strong>Здесь вы можете определить список костей, которые канал Pose Channel будет сэмплировать на основе соответствующих флагов, чтобы сопоставить позы с системой запросов. Вы можете добавить определения костей для выборки, используя (+) Add. После добавления индекса вы можете задать следующие свойства:</p>
  <ul id="xUYg">
    <li id="Etlo"><strong>Debug Color</strong>: Установите цвет, который будет использоваться для отрисовки отладочного рисунка кости с эталонной выборкой во время выполнения в окне просмотра.</li>
    <li id="QxiI"><strong>Reference</strong>: Выберите кость из иерархии скелетов персонажа с помощью выпадающего меню.</li>
    <li id="krIZ"><strong>Flags</strong>: Здесь вы можете переключить флаги, которые определят, к какому типу данных будут относиться отобранные кости. Вы можете установить столько флагов, сколько необходимо для достижения целей вашего проекта. Вы можете выбирать флаги из следующего списка:</li>
    <ul id="xeCS">
      <li id="kcFS"><strong>Velocity</strong></li>
      <li id="xIi0"><strong>Position</strong></li>
      <li id="3MYd"><strong>Rotation</strong></li>
      <li id="Qr0p"><strong>Phase</strong></li>
    </ul>
    <li id="SEQe"><strong>Weight</strong>: Установите значение веса, которое будет использоваться для взвешивания влияния этого индекса Sampled Bones на канал.</li>
  </ul>
  <p id="JbHi"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="ACYo">
    <li id="zOsQ"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="h42D"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="Q6qW"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную смесь для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <p id="sU7n"><strong>Use Character Space Velocities<br /></strong>Если эта опция включена, скорости будут рассчитываться на основе позиций в пространстве персонажа, в противном случае они будут рассчитываться на основе позиций в глобальном пространстве.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="position"><strong>Position</strong></p>
  </section>
  <p id="GZim">Вы можете использовать канал &quot; Position&quot;, чтобы узнать положение кости относительно другой в скелете персонажа. Это может быть полезно при попытке выбора позы на основе смещения кости или ее положения относительно другой.</p>
  <p id="vsD9">Здесь вы можете ознакомиться со списком свойств канала Position Channel и описанием их функциональности:</p>
  <p id="Eltt"><strong>Debug Color<br /></strong>Здесь вы можете задать цвет отладочного рисования, который будет отображаться во вьюпорте, чтобы помочь в отладке системы согласования движений.</p>
  <p id="hDnp"><strong>Bone<br /></strong>Здесь вы можете назначить кость из скелета персонажа, которая будет использоваться в запросе для выбора позы. Вы можете выбрать кость из иерархии скелета с помощью выпадающего меню.</p>
  <p id="6m91"><strong>Origin Bone<br /></strong>Здесь вы можете назначить кость из скелета персонажа, которая будет использоваться в качестве опорной точки для расчета изменения положения кости. Вы можете выбрать кость из иерархии скелета с помощью выпадающего меню.</p>
  <p id="4y2l"><strong>Weight<br /></strong>Установите значение веса, которое будет использоваться для взвешивания влияния этого канала на выходную позу по сравнению с другими каналами в ассете Motion Database Config.</p>
  <p id="vqeu"><strong>Sample Time Offset<br /></strong>Здесь вы можете задать значение, которое будет использоваться в качестве смещения для времени выборки.</p>
  <p id="VNKR"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="VQ3C">
    <li id="6GWQ"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="3Ofy"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="agst"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную смесь для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <p id="NQmL"><strong>Component Stripping<br /></strong>Здесь можно выбрать конкретную ось движения для выделения из запрашиваемых данных. Выбор None не приводит к отсечению компонентов, при выборе Strip XY будет наблюдаться движение только по осям X и Y, совпадающее с горизонтальной плоскостью, а при выборе Strip Z будет наблюдаться движение только по оси Z, совпадающее с движением по высоте запроса.</p>
  <p id="Skju"><strong>Permutation Time Offset<br /></strong>Установите значение, которое будет представлять собой начальное смещение PermutationTime от Sampling Time первой перестановки. Последующие перестановки будут использовать формулу перетекания для определения смещения времени перестановки: PermutationTime = SamplingTime + PermutationTimeOffset + PermutationIndex / PermutationSampleRate.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="samplingtime"><strong>Sampling Time</strong></p>
  </section>
  <p id="Iesk">Канал Sampling Time используется для отладочных целей, чтобы дополнить данные о характеристиках временем выборки. По умолчанию вес этого канала установлен на 0,0, поэтому он не будет учитываться при поиске.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="trajectory"><strong>Trajectory</strong></p>
  </section>
  <p id="0i9w">Канал траектории используется для выборки траектории движения персонажа и предназначен для совместного использования с компонентом чертежа Character Trajectory. С помощью свойства Weight вы можете установить степень влияния канала траектории на конечную выходную позу. С помощью свойства Samples вы можете добавить сэмплы из временных точек компонента Character Trajectory, в которых будет сэмплироваться модель движения персонажа.</p>
  <p id="W0VJ">Здесь вы можете ознакомиться со списком свойств сэмплов и описанием их функциональности:</p>
  <p id="OXzZ"><strong>Debug Color<br /></strong>Здесь вы можете задать цвет отладочного рисунка, который будет отображаться во вьюпорте, чтобы помочь в отладке системы согласования движений.</p>
  <p id="d8fd"><strong>Offset<br /></strong>Здесь вы можете установить, когда выборка движения персонажа должна быть взята из компонента &quot;Character Trajectory&quot;. Положительные значения смотрят вперед по времени, а отрицательные - назад по времени.</p>
  <p id="bhih"><strong>Flags<br /></strong>Здесь вы можете переключить, какие значения из движения персонажа должны быть взяты в месте вдоль компонента Character Trajectory, указанном свойством Offset. Вы можете выбрать любое количество значений из выпадающего списка.</p>
  <p id="UfgA"><strong>Weight<br /></strong>Установите значение, которое будет использоваться для взвешивания влияния сэмплов на выбор конечной выходной позы. Это значение используется только для взвешивания относительно других образцов в индексе, но не относительно других каналов.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Qi4G"><strong>Velocity</strong></p>
  </section>
  <p id="GRon">Вы можете использовать канал Velocity Channel для запроса поз, основанных на скорости персонажа в пространстве персонажа или в глобальном пространстве.</p>
  <p id="XSFB">Здесь вы можете ознакомиться со списком свойств канала Velocity Channel и описанием их функциональности:</p>
  <p id="6sxD"><strong>Debug Color<br /></strong>Здесь вы можете задать цвет отладочного рисунка, который будет отображаться во вьюпорте, чтобы помочь в отладке системы согласования движений.</p>
  <p id="V4U2"><strong>Bone<br /></strong>Здесь вы можете назначить кость из скелета персонажа, которая будет использоваться в запросе для выбора позы. Вы можете выбрать кость из иерархии скелета с помощью выпадающего меню.</p>
  <p id="Ju1Q"><strong>Weight<br /></strong>Установите значение веса, которое будет использоваться для взвешивания влияния этого канала на выходную позу по сравнению с другими каналами в ассете Motion Database Config.</p>
  <p id="bPMy"><strong>Sample Time Offset<br /></strong>Здесь вы можете задать значение, которое будет использоваться в качестве смещения для времени выборки.</p>
  <p id="K5pp"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="VQ3C">
    <li id="JK0e"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="FoRa"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="8YnE"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную смесь для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <p id="U8lw"><strong>Use Character Space Velocities<br /></strong>При включении этого параметра скорость указанного кости будет рассчитываться в пространстве персонажа, а не глобально. Это полезно, когда вы запрашиваете локальное движение, а не движение персонажа в мировом пространстве.</p>
  <p id="aTKT"><strong>Normalize<br /></strong>При включении этого параметра значения скорости будут нормализованы до максимального значения 1. Это свойство может быть полезно при попытке запросить, когда кость находится в движении, а не интенсивность движения.</p>
  <p id="9jcF"><strong>Component Stripping<br /></strong>Здесь можно выбрать конкретную ось движения для выделения из запрашиваемых данных. Выбор None не приводит к отсечению компонентов, при выборе Strip XY будет наблюдаться движение только по осям X и Y, совпадающее с горизонтальной плоскостью, а при выборе Strip Z будет наблюдаться движение только по оси Z, совпадающее с движением по высоте запроса.</p>
  <hr />
  <h3 id="experimentalchannels">Экспериментальные каналы</h3>
  <p id="GSQe">Здесь вы можете ознакомиться со списком экспериментальных каналов схемы поиска поз и описанием их функциональности:</p>
  <p id="q506">Следующие каналы являются экспериментальными, и на их функциональность не следует полагаться в производстве.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="crashinglegs(experimental)"><strong>Crashing Legs</strong></p>
  </section>
  <p id="Ursb">Канал Crashing Legs используется для предотвращения перекрытия ног персонажа во время движения путем выбора позы, при которой конечности находятся на заданном расстоянии друг от друга. Это рассчитывается с помощью угла между направлением от позиции левого бедра к позиции правого бедра и направлением от позиции левой ноги к позиции правой ноги, который затем делится на PI, чтобы получить значения в заданном диапазоне от -1,0 до 1,0. Этот канал автоматически включается в схему поиска позы, если свойство Number of Permutations (Количество вариантов) больше 1.0. Этот канал предназначен для использования в сочетании с экспериментальной функцией Motion Matched Stitching.</p>
  <p id="guIV">Здесь вы можете ознакомиться со списком настроек канала Crashing Legs Channel и описанием их функциональности:</p>
  <p id="goAW"><strong>LeftThigh<br /></strong>Установите кость, представляющую левое бедро персонажа.</p>
  <p id="IgsP"><strong>Right Thigh<br /></strong>Установите кость, представляющую правое бедро персонажа.</p>
  <p id="Loud"><strong>Left Foot<br /></strong>Установите кость, представляющую левую ногу персонажа.</p>
  <p id="h8xi"><strong>Right Foot<br /></strong>Установите кость, представляющую правую ногу персонажа.</p>
  <p id="WTvG"><strong>Weight<br /></strong>Установите значение веса, чтобы соотнести результаты этого канала с другими активными каналами в ассете Motion Database Config.</p>
  <p id="JcRX"><strong>Input Query Pose<br /></strong>Здесь вы можете задать метод, используемый для ввода запрашиваемой позы. Вы можете выбрать один из следующих методов:</p>
  <ul id="VQ3C">
    <li id="ndM2"><strong>Use Character Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="su6c"><strong>Use Continuing Pose</strong>: Использует текущую позу персонажа для ввода запрашиваемой позы.</li>
    <li id="UwcG"><strong>Use Interpolated Continuing Pose</strong>: Использует интерполяционную смесь для ввода запрашиваемой позы и продолжающейся позы.</li>
  </ul>
  <p id="8t2V"><strong>Allowed Tolerance<br /></strong>Установите допустимое отклонение при выборе с помощью этого канала.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="permutationtime(experimental)"><strong>Permutation Time</strong></p>
  </section>
  <p id="TpiZ">С помощью канала Permutation Time вы можете взвесить дополнительные каналы, чтобы установить степень влияния каждого канала на конечную выходную позу.</p>
  <p id="9uvU">Вы можете установить вес влияния этого канала по сравнению с другими каналами с помощью свойства Weight.</p>
  <hr />
  <h3 id="createaposesearchdatabaseasset">Создание ассета Pose Search Database</h3>
  <p id="nXRX">Чтобы сохранить данные анимации персонажа в формате, из которого узел Motion Matching может делать выборки, необходимо создать ассеты базы данных Pose Search Database. Чтобы создать ассет базы данных движений, перейдите в обозревателе содержимого к (+) Add и выберите Animation &gt; Motion Matching &gt; Pose Search Database.</p>
  <figure id="7yKZ" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/41b61f37-4261-40f8-a556-0e3a0cdf92db/image_800.png" width="766" />
  </figure>
  <p id="qhJe">После создания ассета Pose Search Database необходимо определить ассет Pose Search Schema, выбрав ассет Pose Search Schema в палитре ассетов. Вы можете открыть редактор ассетов, дважды щелкнув его в обозревателе содержимого.</p>
  <figure id="Xzdb" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/afcca713-3ea1-4f7c-b66b-9b7b3cc761f8/image_900.png" width="267" />
  </figure>
  <p id="6Z7m">Базы данных поиска поз - это место, где вы можете добавлять и редактировать список ассетов анимации, доступных для Motion Matching, чтобы делать из них выборки. После создания ассетов вы можете открыть редактор ассетов базы данных Pose Search Database, дважды щелкнув по ассету в браузере контента.</p>
  <figure id="M5qB" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/7515ac32-f19a-4ffd-a5c1-7cec80989a48/image_1000.png" width="2048" />
  </figure>
  <p id="aAhg">Теперь вы можете добавить свои анимационные ассеты в ассет Motion Database. В этом примере рабочего процесса используется набор ассетов движения, таких как циклы, повороты и остановки.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="c3Ji">Анимации, используемые в настройках Motion Matching для движения, должны содержать root-движение, а в анимациях должно быть включено свойство Root Motion.</p>
  </section>
  <p id="OsGa">Вы можете использовать любое количество ассетов анимации, необходимое для достижения желаемой точности, но чем больше ассетов анимации вы предоставите, тем больше данных будет у узла Motion Matching для выбора.</p>
  <p id="QR1w">Чтобы добавить анимационный ассет, можно воспользоваться кнопкой (+) Add на панели Asset List или перетащить ассет с помощью панелей Content Browser или Asset Browser.</p>
  <figure id="QN2V" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/4f1715ac-f380-4b40-b638-8c9776dc8412/image_1100.gif" width="914" />
  </figure>
  <p id="0732">Ассеты базы данных Pose Search Database поддерживают различные типы анимационных ассетов, в то время как ассеты <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/animation-sequences-in-unreal-engine" target="_blank">Animation Sequence</a> используются по умолчанию, при желании вы можете использовать <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/animation-composites-in-unreal-engine" target="_blank">Animation Composite</a>, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/blend-spaces-in-unreal-engine" target="_blank">Blendspace</a>.</p>
  <figure id="Dzmz" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/4f760b15-d4d4-4297-a661-cde87c07b7ce/image_1200.png" width="550" />
  </figure>
  <p id="WBZ6">Хотя ассеты Animation Montage не поддерживаются в Animation Blueprints и поэтому не могут использоваться с узлом Motion Matching, их можно использовать и воспроизводить в установках Motion Matching, используя экспериментальную функцию Motion Matching в Character Blueprint.</p>
  <figure id="oNHj" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/245e9fb5-2ed8-457f-a40f-da9e8fbde8a3/image_1300.gif" width="1021" />
  </figure>
  <p id="S0bd">После добавления анимации в Pose Search Database вы можете выбрать один или несколько ассетов анимаций на панели <strong>Asset List</strong>, чтобы просмотреть их воспроизведение в окне просмотра или изменить их свойства на панели <strong>Selection Details</strong>.</p>
  <figure id="Z97C" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/d117b306-0217-4eb2-bf15-1a209d2fb54e/image_1400.png" width="668" />
  </figure>
  <figure id="NJEA" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/da4fefa2-e5b1-4fbf-b1c2-250c63a78359/image_1500.png" width="843" />
  </figure>
  <p id="3xHG"><strong>Schema<br /></strong>Здесь вы можете установить или сослаться на ассет Pose Search Schema, который задает каналы, по которым будет сопоставляться данный ассет базы данных Pose Search. Это свойство автоматически заполняется схемой, которую вы выбрали при создании ассета базы данных. Вы можете изменить связанную схему с помощью выпадающего меню выбора ассета свойства.</p>
  <p id="8UYd"><strong>Continuing Pose Cost Bias<br /></strong>Здесь вы можете задать значение, которое добавит смещение к текущей выбранной позе. Это позволяет применить к позе положительное или отрицательное смещение стоимости, чтобы повлиять на то, как она будет оцениваться при выборе следующей позы. Это полезно для того, чтобы помочь системе задержаться на одном сегменте анимации дольше или короче, в зависимости от установленного значения. Отрицательные значения повышают вероятность того, что анимация будет постоянно выбираться или воспроизводиться дольше, а положительные значения снижают вероятность того, что она будет выбрана снова, в результате чего анимация будет воспроизводиться дольше.</p>
  <p id="4eDB"><strong>Looping Cost Bias<br /></strong>Здесь вы можете задать значение, которое будет добавлено ко всем ассетам с зацикленной анимацией в базе данных. Это позволяет контролировать вероятность того, что система выберет зацикленную анимацию. Отрицательные значения повышают вероятность того, что система выберет зацикленные анимации и останется в них, а положительные значения снижают вероятность того, что зацикленные анимации будут выбраны или воспроизведены подряд.</p>
  <p id="0UTQ"><strong>Exclude from Database Parameters<br /></strong>Здесь вы можете задать, как далеко за пределами первого и последнего кадра анимации должны быть оценены. Это свойство можно использовать для обрезки начальных и конечных кадров анимации в базе данных, чтобы сохранить позы перехода при смешивании между текущей и следующей выбранной анимацией, например, предотвратить самые последние кадры анимации при смешивании. При значении 0.0 обрезка не производится, в то время как отрицательные кадры обрезают анимацию с любой стороны в зависимости от используемого свойства.</p>
  <p id="v9Hp"><strong>Additional Extrapolation Time<br /></strong>Здесь вы можете задать значения, определяющие дополнительное время экстраполяции, которое будет использоваться при наложении анимации. Вы можете задать минимальное или максимальное значение, которое будет использоваться в следующих формулах, применяемых для зажатия времени экстраполяции каждой анимации:</p>
  <p id="LHn3"><code>MinimumExtrapolationTime = AnimationAssetTimeStart + AdditionalExtrapolationTime.Min</code> <code>MaximumExtrapolationTime = AnimationAssetTimeEnd + AdditionalExtrapolationTime.Max</code></p>
  <p id="ekdU"><strong>Tags<br /></strong>Здесь вы можете задать массив тегов, которые могут быть использованы в качестве метаданных для ассета базы данных поиска поз. Вы можете добавить новый элемент в массив с помощью кнопки (+) Add. После добавления элемента массива вы сможете добавить текстовое значение к элементу индекса.</p>
  <p id="RPLx"><strong>Normalization Set<br /></strong>Здесь вы можете задать ассет Pose Search Normalization Set, который определит список ассетов Pose Search Database, с которыми вы хотите нормализовать выборку. Хотя установка набора нормализации не является обязательной для функциональной настройки Motion Matching, разделение наборов анимации по типам и использование набора нормализации для сравнения наборов друг с другом может дать более точные и эффективные результаты. Дополнительные сведения об использовании наборов нормализации см. в разделе &quot;(Pose Search Normalization Sets)&quot; данного документа.</p>
  <p id="F3As"><strong>Preview Mesh<br /></strong>Здесь вы можете задать ассет скелетной сетки, который будет использоваться во вьюпорте при воспроизведении анимации. Если оставить это свойство неопределенным, редактор будет использовать скелетную сетку, связанную с добавленными вами анимационными ассетами. Вы можете выбрать новую скелетную сетку для предварительного просмотра, используя выпадающее меню выбора ассета свойства и выбрав любой скелет, совместимый с анимационными ассетами базы данных.</p>
  <p id="WEdp"><strong>Pose Search Mode<br /></strong>Установите режим, в котором база данных будет выполнять поиск данных анимации. С помощью выпадающего меню вы можете выбрать один из следующих вариантов:</p>
  <ul id="eYaj">
    <li id="46KC"><strong>Brute Force</strong>: Поиск по базам данных будет тщательно проанализирован. Система будет оценивать все проиндексированные позы, чтобы найти лучшую.</li>
    <li id="ht3q"><strong>PCAKDTree</strong>: Это оптимизированный режим поиска. База данных проецирует свои позы в пространство PCA (Principal Component Analysis), используя только наиболее значимое измерение, полученное из свойства **Number Of Principal Components, и строит KDTree ** (структуру данных с пространственным разделением) для облегчения поиска.</li>
    <li id="UT3M"><strong>VPTree</strong>: Это оптимизированный режим поиска, который использует дерево точек обзора.</li>
  </ul>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Gyq1">Этот режим является экспериментальным, поэтому не следует полагаться на его функциональность в условиях производства.</p>
  </section>
  <p id="wOG9"><strong>Pose Pruning Similarity Threshold<br /></strong>Здесь можно задать значение, определяющее порог сохранения похожих поз под одним и тем же индексом. Например, если две позы имеют одинаковые значения отбора, например, когда многомерная точка с кардинальностью схемы похожи, и эти значения ближе, чем значение, установленное для свойства Pose Pruning Similarity Threshold, только одна будет сохранена в базе данных и доступна по двум различным индексам поз. Это свойство полезно для установки пороговых значений, когда для заданного значения можно выбрать несколько поз, чтобы сэкономить память.</p>
  <p id="ueGC">Это свойство доступно только в том случае, если для свойства Pose Search Mode установлено значение PCAKDTree.</p>
  <p id="c7S3"><strong>Number Of Principal Components<br /></strong>Устанавливает количество измерений, используемых для создания KDTree, когда для свойства Pose Search Mode установлено значение PCAKDTree. Более высокие значения приводят к увеличению числа измерений, что позволяет лучше понять разброс набора данных. Большее количество измерений обычно приводит к лучшим результатам поиска, но также приводит к увеличению объема памяти и снижению производительности проекта.</p>
  <p id="mmYn">Это свойство доступно только в том случае, если для свойства Pose Search Mode установлено значение PCAKDTree.</p>
  <p id="x7ef"><strong>KDTree Max Leaf Size<br /></strong>Устанавливает максимальное количество листьев у каждой ветви KDTree.</p>
  <p id="wibJ">Это свойство доступно только в том случае, если для свойства Pose Search Mode установлено значение PCAKDTree.</p>
  <p id="qK91"><strong>KNNQuerryNumNeighbors<br /></strong>При использовании поиска по KDTree результаты будут иметь только приблизительную стоимость, поэтому при поиске по базе данных будет выбрано несколько поз, чтобы выполнить полный анализ стоимости и выбрать лучшую позу. Задайте значение в этом свойстве, чтобы установить количество поз, которые будут выбраны для полного анализа стоимости в результате поиска по KDTree. Это свойство также можно использовать для задания количества поз из поиска в VPTree для выполнения полного анализа стоимости при использовании режима поиска поз в VPTree.</p>
  <hr />
  <h2 id="createthesimplestsetup:motionmatchingnodeandposehistorynode">Создание простейшей установки: Узел Motion Matching и узел Pose History</h2>
  <p id="9juh">В анимационном блюпринте персонажа создайте узел Motion Matching, щелкнув правой кнопкой мыши на графике и выбрав Motion Matching в категории Pose Search.</p>
  <figure id="Fc2s" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/ba1f97e8-7037-44ae-b349-482e07922b39/image_1600.png" width="734" />
  </figure>
  <p id="wiU9">Выберите ассет базы данных с помощью раскрывающегося меню Select Asset на графе узла Motion Matching.</p>
  <figure id="i4RW" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/4abdd285-9b70-45d5-8aa2-176b370848e6/image_1700.png" width="632" />
  </figure>
  <p id="IYLh">Затем добавьте узел Pose History, перетащив выходной контакт узла Motion Matching и выбрав узел Pose History в разделе Pose Search или с помощью панели поиска. Затем подключите выходной контакт узла Pose History к узлу Output Pose.</p>
  <figure id="Yees" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/43cf8c84-9bf5-464f-9eb9-11cf2859fcc4/image_1800.png" width="2048" />
  </figure>
  <p id="z0vL">Выберите узел Pose History в AnimGraph, чтобы раскрыть его свойства на панели Details. Включите свойство &quot;Generate Trajectory&quot;.</p>
  <figure id="UwPw" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/b377817e-9ac7-40da-9e05-06c12602fc27/image_1900.png" width="1212" />
  </figure>
  <p id="25FM">Затем разверните свойство Collected Bones и добавьте элемент массива с помощью (+) Add для каждой кости в скелете персонажа, которую вы хотите взять за образец. Кости, определенные в этом свойстве, будут отобраны, когда узлы Pose History и Motion Matching будут запрашивать траекторию при выборе анимации.</p>
  <figure id="MGoT" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/32014abd-99e0-4921-ba8a-9ff9b874a7c0/image_20.png" width="1194" />
  </figure>
  <p id="utnR">Сохраните и скомпилируйте анимационный блюпринт. Теперь ваш персонаж использует Motion Matching для выбора позы анимации движения во время выполнения.</p>
  <figure id="I080" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/43724162-502c-4615-a030-f3bc2cba2ac5/image_2100.gif" width="768" />
  </figure>
  <h2 id="motionmatchingnode">Узел Motion Matching</h2>
  <p id="XrJ7">Здесь вы можете ознакомиться со списком настроек узла Motion Matching и описанием их функциональности:</p>
  <figure id="9fW6" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/8ab5902a-5ecc-40ea-9ad8-bbae5c89a10d/image_2200.png" width="1340" />
  </figure>
  <p id="dEVn"><strong>Database<br /></strong>Здесь вы можете задать ассет базы данных, который будет использоваться для выбора.</p>
  <p id="1gXf"><strong>Blend Time<br /></strong>Задайте значение, которое будет использоваться для определения длины смешивания при выборе нового сегмента анимации. В Motion Matching встроено дерево смешивания, которое позволяет нам иметь больше возможностей для выбора типов смешивания, качества смешивания и профилей смешивания. При желании можно сделать так, что, например, верхняя часть тела будет смешиваться дольше, чем нижняя. В будущем эта функция будет расширена еще больше.</p>
  <p id="P72T"><strong>Blend Profile<br /></strong>Здесь вы можете установить один из профилей наложения персонажа, который будет использоваться с помощью Motion Matching.</p>
  <p id="pptU"><strong>Mode<br /></strong>Здесь вы можете задать кривую, которая будет использоваться для определения того, как смешивание будет применяться к костям с течением времени. Обычно выбираются следующие варианты: Linear, Ease In, Ease Out и Ease In and Out. Вы можете получить доступ к этому свойству с помощью выпадающего меню, расположенного под расширением свойства Blend Profile.</p>
  <p id="ebZ4"><strong>Pose Jump Threshold Time<br /></strong>Здесь вы можете задать временные рамки в секундах, при которых система не будет переходить к позам в этом диапазоне на одном и том же ассете, если они не находятся на расстоянии этого количества времени от текущего кадра. Это помогает предотвратить выбор фрагментов анимации в одном и том же клипе снова и снова и поощряет воспроизведение анимации или выбор чего-то нового.</p>
  <p id="zxmV"><strong>Pose Reselect History<br /></strong>Здесь вы можете задать диапазон в секундах, который не позволит системе переходить к позам, которые были выбраны ранее в течение заданного количества секунд.</p>
  <p id="RgQQ"><strong>Search Throttle Time<br /></strong>Установите, как часто система ищет новые позы.</p>
  <p id="j7rO"><strong>Play Rate<br /></strong>Здесь вы можете установить скорость воспроизведения выбранных анимаций.</p>
  <p id="k2OP"><strong>Use Inertial Blend<br /></strong>Если эта функция включена, инерционное смешивание будет применяться к анимационным смешиваниям.</p>
  <p id="x56j"><strong>Reset On Becoming Relevant<br /></strong>Если это свойство включено, оно сбросит состояние Motion Matching, если узел стал актуальным для графа после того, как не был отмечен на предыдущем кадре или кадрах.</p>
  <p id="OCkM"><strong>Should Search<br /></strong>При включении узел Motion Matching будет искать в подключенном ассете Database анимацию для сопоставления с системой запросов.</p>
  <p id="w1vp"><strong>Should Use Cached Channel Data<br /></strong>Если эта функция включена, при поиске по нескольким базам данных с разными схемами будет предпринята попытка передать данные об особенностях позы, вычисленные во время построения запроса. Это делается для того, чтобы иметь возможность как можно чаще использовать вектор признаков позы в разных схемах (и потенциально улучшить производительность). По умолчанию это свойство отключено, чтобы сохранить обратную совместимость с существующими системами согласования движений.</p>
  <p id="mu2B"><strong>Should FIlter Notifies<br /></strong>Если эта опция включена, все уведомления, исходящие от сэмплов проигрывателя анимации, должны быть отфильтрованы. {в секундах}</p>
  <p id="JjWh"><strong>Max Active Blends<br /></strong>Устанавливает максимальное количество активных анимаций смешивания в стеке смешивания. Если это свойство равно 0, то стек наложения будет отключен.</p>
  <p id="hden"><strong>Store Blended Pose<br /></strong>Если это включено и количество запрашиваемых смешиваний превышает значение свойства Max Active Blends, стек смешиваний будет смешиваться и накапливаться в сохраненной позе со всеми переполненными анимациями. При выключенном режиме память для хранения позы будет сохранена, но при достижении значения свойства Max Active Blends стек блендов начнет отбрасывать анимации, что может привести к выскакиванию анимации.</p>
  <p id="cqmL"><strong>Notify Recency Time Out<br /></strong>Устанавливает промежуток времени, в течение которого после отправки уведомления будут отфильтровываться все экземпляры этого уведомления.</p>
  <p id="3hke"><strong>Max Blend in Time to Override Animation<br /></strong>Если последняя добавленная анимация находится в диапазоне, заданном значением этого свойства, то новый запрашиваемый объект займет ее место. В противном случае новая смесь будет добавлена в стек смешивания.</p>
  <p id="l7ug"><strong>Player Depth Blend Time Multiplier<br /></strong>Установите значение, которое умножит таймер смешивания проигрывателя анимации. Увеличение этого значения может быть полезно для ускорения времени смешивания при более глубоком смешивании.</p>
  <hr />
  <h2 id="animnotifyfiltering">Anim Notify Filtering</h2>
  <p id="lekg">При использовании системы Motion Matching можно столкнуться с проблемой, когда выбранные системой позы вызывают определенные анимационные уведомления, например звуковой эффект шагов во время анимации ходьбы или бега. В результате на соседних кадрах воспроизводятся два или более звуковых эффекта шагов, а не один. Эту проблему можно решить с помощью фильтрации анимационных уведомлений.</p>
  <p id="yROK">Здесь вы можете увидеть две записи Rewind Debugger одной и той же игровой ситуации с персонажем. В примере слева не используется фильтрация Anim Notify, и анимация запускает одно и то же Anim Notify более одного раза из-за выбора Anim Pose. В примере справа используется фильтрация анимационных уведомлений, чтобы предотвратить срабатывание одного и того же уведомления в заданном временном интервале, в результате чего анимационное уведомление срабатывает только один раз за определенное время.</p>
  <p id="xorr">Нет фильтрации уведомлений об анимации</p>
  <figure id="glKu" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/a5019e85-df63-4660-8cfa-445d5a03b363/image_2300.png" width="1187" />
  </figure>
  <p id="lJVf">С фильтрацией уведомлений анимации</p>
  <figure id="CPwL" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/352d4699-8c10-41cd-9779-72db19b95ce1/image_2400.png" width="1191" />
  </figure>
  <p id="LwDU">Чтобы реализовать фильтрацию уведомлений, выберите узел Motion Matching в анимационном блюпринте персонажа и включите свойство Should Filter Notifies на панели Details. Затем вы можете задать продолжительность времени в секундах, в течение которого уведомление будет отфильтровываться, используя свойство Notify Recency Time Out.</p>
  <figure id="F7LA" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/0222f823-3b63-48c5-b955-ea163e483e5f/image_2500.png" width="1144" />
  </figure>
  <p id="bi3A">Значение по умолчанию 0,2 можно использовать в качестве базового, так как оно было разработано как наиболее полезное для двуногих движений, однако в вашем проекте может потребоваться другое значение для достижения желаемых результатов.</p>
  <p id="8sri">При включении свойства Should Filter Notifies все анимационные уведомления будут обрабатываться одинаково, отфильтровывая любые повторные экземпляры одного и того же уведомления в течение заданного значения, установленного в свойстве Notify Recency Time Out. Если в вашей анимации есть уведомление, которое вы не хотите фильтровать, выберите это уведомление в анимации или монтаже и отключите свойство Can Be Filtered Via Request в панели подробностей уведомления. По умолчанию это свойство включено для всех уведомлений анимации.</p>
  <figure id="f8nb" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/5351e8fd-3db7-4862-a9d0-f8badd418beb/image_2600.png" width="1313" />
  </figure>
  <p id="9Pv8">Фильтрация Anim Notify Filtering применима только к Anim Notifies и не работает с Anim Notify States.</p>
  <hr />
  <h2 id="posesearchschemachannelweights">Pose Search Schema Channel Weights</h2>
  <p id="PXxS">Вы можете контролировать степень влияния каждого канала на процесс выбора, используя свойство Weight каждого канала в ассетах Pose Search Schema.</p>
  <figure id="oeXC" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/e0bcc33c-0b97-47d2-98c6-fe142a9ae7f0/image_2700.png" width="594" />
  </figure>
  <p id="zEAB">Свойство Weight для каждого канала в ассете Pose Search Schema указывает системе Motion Matching, насколько сильно каждый канал должен влиять на выбор кадров анимации в базе данных.</p>
  <p id="ExaA">В приведенном выше примере рабочего процесса вес канала Pose установлен на 1,0, а вес канала Trajectory - на 3,0. Это означает, что различия в траектории будут влиять на систему в три раза сильнее, чем различия в позе.</p>
  <p id="E67k">Отдельным свойствам в каждом канале также можно присвоить вес, чтобы дополнительно настроить факторы, влияющие на выбор анимации. Например, свойствам &quot; History&quot; и &quot;Prediction Horizon&quot; можно придать вес, чтобы смещать оценку в сторону прошлого или будущего. Это позволяет вам распределить, какие элементы канала используются для определения его влияния среди других каналов в Pose Search Schema.</p>
  <p id="SPEF">Независимо от того, какие значения вы придадите этим различным весам, система автоматически нормализует их. Чтобы предотвратить нормализацию весов, установите для свойства Data Processor значение None.</p>
  <p id="TW6i">Однако весовые коэффициенты не всегда помогают решить проблему неправильного выбора позы. Например, если ваша модель движения движется со скоростью 5 метров в секунду, а средние данные составляют около 4 метров в секунду, это может привести к тому, что система Motion Matching будет последовательно выбирать позы анимации с максимальным значением. Корректировка весовых значений для уменьшения стоимости анимационных поз с максимальным значением может исправить этот повторяющийся выбор, но может привести к тому, что некоторые критерии каналов будут полностью проигнорированы, что приведет к пробелам в вашей системе анимации.</p>
  <p id="X4Qp">При настройке весов каналов вы настраиваете то, как система выбирает позы анимации, а не настраиваете свою систему с учетом систем вашего проекта. Чтобы сохранить всю систему анимации, можно использовать другие методы, например, Pose Search Database Sets, чтобы учесть все сценарии игры.</p>
  <hr />
  <h2 id="posesearchnormalizationsets">Pose Search Normalization Sets</h2>
  <p id="PFLa">Pose Search Normalization Sets - это ряд определенных ассетов базы данных Pose Search, каждый из которых содержит группы анимаций, применимых в конкретных случаях. Например, одна база данных может содержать анимации ходьбы персонажа, а другая - анимации бега. Установив несколько баз данных поиска поз в ассет Pose Search Normalization Set, вы можете разделить наборы анимаций и установить для каждой из них весовые коэффициенты, чтобы они стали предпочтительнее для системы Motion Matching при соблюдении определенных критериев.</p>
  <figure id="ntPu" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/1f7c3de0-be36-46b6-890d-c5b52285dbcd/image_2800.png" width="124" />
  </figure>
  <p id="lIzX">Pose Search Normalization Sets можно динамически менять местами при наступлении определенных игровых событий. Это ограничит набор анимационных данных для выбора узлом Motion Matching, предоставляя вам больше контроля над выводом поз анимации в вашей анимационной системе. Это можно сделать, определив серию баз данных поиска поз в ассете Pose Search Normalization Set и используя систему выбора для динамической установки того, какая база данных активна во время выполнения.</p>
  <hr />
  <h2 id="0uTb">Motion Matching Notifies</h2>
  <p id="fdLa">Вы также можете использовать набор уведомлений Motion Matching Notifies для помощи в настройке. Здесь вы можете ознакомиться со списком доступных уведомлений Motion Matching и описанием их функциональности:</p>
  <figure id="tdnu" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/462dbb0b-9288-49aa-a62f-c6453166a7a6/image_2900.png" width="738" />
  </figure>
  <p id="z831"><strong>Pose Search: Block Transition<br /></strong>Используя это состояние Notify State, вы можете задать области анимации, в которых система не может перейти в отмеченную область, но может воспроизвести ее из предыдущей секции, которая не отмечена этой меткой. Это полезно, когда у вас есть участки анимации, в середину которых вы не хотите прыгать. Если у вас есть неработающая анимация, в середине которой персонаж почесывает голову, вы никогда не захотите прыгать в середину почесывания головы. Если вы пометите эту область, вы сможете перепрыгнуть в любой участок анимации, не помеченный этим.</p>
  <p id="wIT2"><strong>Pose Search: Exclude From Database<br /></strong>Используя это &quot; Notify State &quot;, вы можете полностью исключить секции анимационных данных из их анимаций. Любые секции, установленные с этим уведомлением, не будут строиться или искаться.</p>
  <p id="gvyB"><strong>Pose Search: Motion Matched Branch In<br /></strong>Вы можете использовать это состояние Notify State, чтобы определить, где анимация должна быть разветвлена при выборе системой Motion Matching.</p>
  <p id="o4Y5"><strong>Pose Search: Override Base Cost Bias<br /></strong>Это состояние Notify State позволяет назначить участку анимации бонус или штраф за выбор этого участка анимации. Отрицательные значения дают бонус, а положительные - штраф. Это полезно в ситуациях, когда система покидает начальную анимацию раньше, чем вы хотите, поэтому вы можете поместить это уведомление над участками, которые вы хотите, чтобы она продолжила до идеального выхода, и дать ей небольшой бонус, чтобы попытаться удержать ее в этой области дольше.</p>
  <p id="CfP7"><strong>Pose Search: Override Continuing Pose Cost Bias<br /></strong>Используя это &quot; Notify State &quot;, вы можете установить стоимость поиска позы для продолжения, делая сегмент анимации более или менее вероятным быть выбранным снова для продолжения воспроизведения, основываясь на параметрах уведомления.</p>
  <p id="0dCM"><strong>Pose Search: Sampling Attribute<br /></strong>Каналы вашей схемы Pose Search Schema могут использовать это состояние уведомления в качестве поставщика положения, вращения и линейной скорости в пространстве анимации во время индексации базы данных, указав свойство Sampling Attribute ID канала, чтобы оно соответствовало свойству Sampling Attribute ID состояния уведомления.</p>
  <p id="CxqN"><strong>Pose Search Sampling Effect<br /></strong>Каналы вашей схемы Pose Search Schema могут использовать это состояние уведомления для отграничения событий, идентифицированных по свойству Sampling Attribute ID, во время индексации базы данных, указав свойство Sampling Attribute ID канала, чтобы оно совпадало со свойством Sampling Attribute ID состояния уведомления.</p>
  <hr />
  <h2 id="animationwarping">Animation Warping</h2>
  <p id="8Lt7">Вы можете реализовать узлы Animation Warping в сочетании с Motion Matching, чтобы смягчить недостаток охвата, процедурно изменяя позу персонажа во время выполнения.</p>
  <p id="b3IH">Для получения дополнительной информации об искажении анимации см. следующую документацию:</p>
  <figure id="SgAo" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/dbc6be9e-e07a-4f70-89ae-106ca7da3d54/topicimage.png" width="464" />
  </figure>
  <p id="Tbs6"><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-warping-in-unreal-engine" target="_blank">Motion Warping </a>- Глубокое рассмотрение технологии Motion Warping для анимации в Unreal Engine.</p>
  <hr />
  <h2 id="motionmatchingdebugging">Отладка системы Motion Matching</h2>
  <p id="SrU8">Для получения дополнительной информации об отладке и оптимизации анимационной системы Motion Matching см. <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-debugging-in-unreal-engine" target="_blank">документацию по отладке Motion Matching</a>.</p>
  <hr />
  <h2 id="moreinformation">Дополнительная информация</h2>
  <p id="mZn5">Для получения дополнительной информации о сопоставлении движений в Unreal Engine смотрите <a href="https://www.youtube.com/watch?v=u9Z8CK561_Y&t=1532s%5D(https://www.youtube.com/watch?v=u9Z8CK561_Y&t=1532s)" target="_blank">презентацию Motion Matching | GDC 2024</a>.</p>
  <p id="msYn">Пример игрового анимационного проекта</p>
  <p id="CqNJ"><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/game-animation-sample-project-in-unreal-engine" target="_blank">Проект Game Animation Sample </a>- это пример проекта, который вы можете использовать для наблюдения и изучения высококачественных и отзывчивых систем анимации в Unreal Engine.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/TheIslandEngConcept</guid><link>https://teletype.in/@hardway/TheIslandEngConcept?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/TheIslandEngConcept?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>The Island (English)</title><pubDate>Fri, 12 Jul 2024 10:12:47 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/51/0e/510e3294-9582-4fdc-b1d9-9862795e4d7a.png"></media:content><category>The Island</category><description><![CDATA[<img src="https://img1.teletype.in/files/cc/e4/cce47239-5009-473b-8cd3-859b90ca884c.jpeg"></img>The Island is a new generation of hyper-realistic VR life simulation. Forget about rules and story—here, you decide who you become. Build a business empire from scratch, become a star of the local media scene, explore wild jungles, or simply live for your own pleasure in a massive, ever-changing tropical world. Your life, your rules.]]></description><content:encoded><![CDATA[
  <h3 id="qlTa"><strong>Game Concept: &quot;The Island&quot;</strong></h3>
  <p id="OE0r"><a href="https://t.me/theislangame" target="_blank">https://t.me/theislangame</a></p>
  <p id="JX6b">The Island is a new generation of hyper-realistic VR life simulation. Forget about rules and story—here, you decide who you become. Build a business empire from scratch, become a star of the local media scene, explore wild jungles, or simply live for your own pleasure in a massive, ever-changing tropical world. Your life, your rules.</p>
  <figure id="Cdf8" class="m_column">
    <img src="https://img1.teletype.in/files/01/b9/01b9490f-c171-4935-a06c-9d4c30ea24df.jpeg" width="2560" />
  </figure>
  <p id="pDmk"><strong>The World: Hiʻialo Island</strong></p>
  <p id="2CJj">Welcome to Hiʻialo—a dynamic open world spanning 16 sq. km. These aren&#x27;t just decorations. This is a full simulation with a complete day/night cycle and an advanced weather system that affects everything: from road traffic and resident behavior to the island&#x27;s economy. The world lives and breathes independently of you.</p>
  <p id="zFhj"><strong>Core Gameplay Features</strong></p>
  <ul id="or1s">
    <li id="IH18"><strong>Total Freedom of Action:</strong> Who will you become? A successful businessman owning a hotel chain? A daring ranger protecting nature? A famous journalist running your own TV channel? Or maybe a taxi driver who knows every corner of the city? The choice is yours.</li>
    <li id="Ip44"><strong>True VR Immersion:</strong> Feel the world at your fingertips. Thanks to an advanced physics simulation, you can interact with any object. Open the trunk, load your groceries, start the car, and feel the road—everything just like in real life.</li>
    <li id="8OcB"><strong>Deep Skill System:</strong> Here, your experience matters. The more you drive, the better you handle your car. The more you cook, the more exquisite dishes you can create. Develop your talents and become the best in your field.</li>
    <li id="G0L4"><strong>Be Your Own Boss:</strong> Tired of working for others? Start your own path from scratch. Open a small café, grow it into an elite restaurant. Create a delivery service or become a media mogul. Analyze the market, hire staff (NPCs or real players), and build your empire.</li>
    <li id="HL11"><strong>Endless Customization:</strong> Create a unique avatar and furnish the home of your dreams. From a small studio to a luxurious oceanfront villa—make your home a reflection of your personality.</li>
  </ul>
  <figure id="8AI1" class="m_column">
    <img src="https://img2.teletype.in/files/9c/42/9c42ce9c-2843-4a23-89a7-7febd368c9fe.jpeg" width="2560" />
  </figure>
  <p id="u9f6"><strong>A Living, Social World</strong></p>
  <ul id="6SmX">
    <li id="iusu"><strong>Dynamic Economy:</strong> The heart of the island is tourism. A constant flow of guests creates demand for goods and services. Stay on top of the trends to succeed.</li>
    <li id="ofFV"><strong>Massive Live Events:</strong> Participate in grand music festivals, beach parties, and sports championships held at a huge stadium.</li>
    <li id="UgAX"><strong>Reputation is Everything:</strong> Your actions do not go unnoticed. Break the rules? The world will react. Help others and run an honest business? New, more profitable opportunities will come your way. Your reputation is your main asset.</li>
  </ul>
  <figure id="610N" class="m_column">
    <img src="https://img1.teletype.in/files/cc/e4/cce47239-5009-473b-8cd3-859b90ca884c.jpeg" width="2989" />
  </figure>
  <p id="DkAa"><strong>Next-Gen Features</strong></p>
  <ul id="ytsM">
    <li id="6RKR"><strong>Your Avatar Never Sleeps:</strong> The world of &quot;The Island&quot; is alive 24/7. Even when you&#x27;re offline, your AI-controlled character continues to perform their job, and your business continues to generate income.</li>
    <li id="BZ21"><strong>Constant Evolution:</strong> The launch is just the beginning. The world will constantly expand: new islands, continents, cities, professions, and gameplay mechanics. &quot;The Island&quot; is a game-platform for years to come.</li>
  </ul>
  <p id="r4ld"><a href="https://t.me/theislangame" target="_blank">https://t.me/theislangame</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/TheIslandPitchRu</guid><link>https://teletype.in/@hardway/TheIslandPitchRu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/TheIslandPitchRu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Game Concept: The Island</title><pubDate>Mon, 24 Jun 2024 05:37:43 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/51/0e/510e3294-9582-4fdc-b1d9-9862795e4d7a.png"></media:content><category>The Island</category><description><![CDATA[<img src="https://img1.teletype.in/files/cc/e4/cce47239-5009-473b-8cd3-859b90ca884c.jpeg"></img>The Island — это гиперреалистичный VR-симулятор жизни нового поколения. Забудьте о правилах и сюжете — здесь вы сами решаете, кем стать. Постройте бизнес-империю с нуля, станьте звездой местной медиа-сцены, исследуйте дикие джунгли или просто живите в своё удовольствие в огромном, постоянно меняющемся тропическом мире. Ваша жизнь, ваши правила.]]></description><content:encoded><![CDATA[
  <p id="r21W">Канал проекта: <a href="https://t.me/theislangame" target="_blank">https://t.me/theislangame</a></p>
  <figure id="snI6" class="m_column">
    <img src="https://img1.teletype.in/files/01/b9/01b9490f-c171-4935-a06c-9d4c30ea24df.jpeg" width="2560" />
  </figure>
  <p id="u9VB">The Island — это гиперреалистичный VR-симулятор жизни нового поколения. Забудьте о правилах и сюжете — здесь вы сами решаете, кем стать. Постройте бизнес-империю с нуля, станьте звездой местной медиа-сцены, исследуйте дикие джунгли или просто живите в своё удовольствие в огромном, постоянно меняющемся тропическом мире. Ваша жизнь, ваши правила.</p>
  <p id="R2Vp"><strong>The World: Hiʻialo Island</strong></p>
  <figure id="iUXk" class="m_column">
    <img src="https://img2.teletype.in/files/9c/42/9c42ce9c-2843-4a23-89a7-7febd368c9fe.jpeg" width="2560" />
  </figure>
  <p id="NFSI">Добро пожаловать на Hiʻialo — динамичный открытый мир площадью 16 кв. км. Это не просто декорации. Это полноценная симуляция с полным циклом дня и ночи и продвинутой системой погоды, которая влияет на всё: от трафика на дорогах и поведения жителей до экономики острова. Мир живёт и дышит независимо от вас.</p>
  <p id="ftMD"><strong>Core Gameplay Features</strong></p>
  <ul id="axqe">
    <li id="0TRS"><strong>Полная свобода действий:</strong> Кем вы станете? Успешным бизнесменом, владеющим сетью отелей? Отважным рейнджером, защищающим природу? Известным журналистом, ведущим свой телеканал? А может, таксистом, знающим каждый уголок города? Выбор за вами.</li>
    <li id="tGtF"><strong>True VR Immersion:</strong> Почувствуйте мир на кончиках пальцев. Благодаря продвинутой физической симуляции, вы можете взаимодействовать с любым предметом. Откройте багажник, загрузите покупки, заведите машину и почувствуйте дорогу — всё как в реальной жизни.</li>
    <li id="xV3m"><strong>Глубокая система навыков:</strong> Здесь ваш опыт имеет значение. Чем больше вы водите, тем лучше управляете машиной. Чем чаще готовите, тем более изысканные блюда можете создать. Развивайте свои таланты и становитесь лучшим в своём деле.</li>
    <li id="Ncwd"><strong>Be Your Own Boss:</strong> Надоело работать на других? Начните свой путь с нуля. Откройте маленькое кафе, раскрутите его в элитный ресторан. Создайте службу доставки или станьте медиа-магнатом. Анализируйте рынок, нанимайте персонал (NPC или реальных игроков) и стройте свою империю.</li>
    <li id="9QFf"><strong>Бесконечная кастомизация:</strong> Создайте уникального аватара и обустройте дом своей мечты. От маленькой студии до роскошной виллы на берегу океана — сделайте своё жильё отражением вашей личности.</li>
  </ul>
  <p id="HGH3"><strong>A Living, Social World</strong></p>
  <ul id="mv7Z">
    <li id="EWBQ"><strong>Динамическая экономика:</strong> Сердце острова — туризм. Постоянный поток гостей создаёт спрос на товары и услуги. Будьте в тренде, чтобы преуспеть.</li>
    <li id="lxaN"><strong>Масштабные Live-ивенты:</strong> Участвуйте в грандиозных музыкальных фестивалях, пляжных вечеринках и спортивных чемпионатах, проходящих на огромном стадионе.</li>
    <li id="7c3p"><strong>Репутация — всё:</strong> Ваши действия не остаются незамеченными. Нарушаете правила? Мир отреагирует. Помогаете другим и ведёте бизнес честно? Новые, более выгодные возможности не заставят себя ждать. Ваша репутация — ваш главный актив.</li>
  </ul>
  <figure id="Q33f" class="m_column">
    <img src="https://img1.teletype.in/files/cc/e4/cce47239-5009-473b-8cd3-859b90ca884c.jpeg" width="2989" />
  </figure>
  <p id="p1ZO"><strong>Next-Gen Features</strong></p>
  <ul id="xQBn">
    <li id="bMhl"><strong>Ваш аватар никогда не спит:</strong> Мир &quot;The Island&quot; живёт 24/7. Даже когда вы оффлайн, ваш персонаж под управлением ИИ продолжает выполнять свою работу, а бизнес — приносить доход.</li>
    <li id="7zpi"><strong>Постоянное развитие:</strong> Запуск — это только начало. Мир будет постоянно расширяться: новые острова, континенты, города, профессии и геймплейные механики. &quot;The Island&quot; — это игра-платформа на долгие годы.</li>
  </ul>
  <p id="0YtA">Канал проекта: <a href="https://t.me/theislangame" target="_blank">https://t.me/theislangame</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/anim2texture</guid><link>https://teletype.in/@hardway/anim2texture?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/anim2texture?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Вершинная анимация и плагин AnimToTexture</title><pubDate>Sat, 11 May 2024 14:43:26 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/21/d8/21d8b94c-a01f-440d-8fc5-476d953aa021.png"></media:content><category>Анимация</category><description><![CDATA[<img src="https://ue-cdn.artstation.com/imgproxy/13oRDW8rDg4aKh6l_1jdAZwltd2uaUF-7RldPjU9i7o/filename:28_hero.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMTdkM2Q3MDEtZDM3Mi00ZDExLThiOWItOGMwMTU2Yjg3MjU1LzI4X2hlcm8uZ2lm"></img>Когда вы впервые поддаетесь искушению разместить десятки или сотни персонажей в одной сцене, вы очень быстро поймете, что прощаетесь с высокой частотой кадров. Скелетные модели обеспечивают потрясающую гибкость для сложных анимаций, но они обходятся гораздо дороже, чем статичные модели, поскольку приходится определять вес кости, выполнять постобработку, обновлять анимацию и т. д. Существуют методы оптимизации, такие как LODs и обмен анимацией, но достичь желаемого уровня производительности при определенном количестве персонажей может быть сложно или невозможно.]]></description><content:encoded><![CDATA[
  <h2 id="vertexanimationoverview">Обзор вершинной анимации</h2>
  <p id="chCS">Когда вы впервые поддаетесь искушению разместить десятки или сотни персонажей в одной сцене, вы очень быстро поймете, что прощаетесь с высокой частотой кадров. Скелетные модели обеспечивают потрясающую гибкость для сложных анимаций, но они обходятся гораздо дороже, чем статичные модели, поскольку приходится определять вес кости, выполнять постобработку, обновлять анимацию и т. д. Существуют методы оптимизации, такие как LODs и <a href="https://docs.unrealengine.com/4.26/en-US/AnimatingObjects/SkeletalMeshAnimation/AnimationSharing/" target="_blank">обмен анимацией</a>, но достичь желаемого уровня производительности при определенном количестве персонажей может быть сложно или невозможно.</p>
  <p id="Ul8Z">Обычно разработчики, работающие в режиме реального времени, обходят эту проблему при работе с большими группами анимированных сеток с помощью техники, которая обычно называется вершинная анимация. Это когда вы запекаете данные из скелетной анимации в файлы текстур, которые могут быть легко прочитаны материалом статической модели для перемещения отдельных вершин. Если вы еще не смотрели видео Джозефа Аззама о Симуляции больших толп на Niagara, это замечательный ресурс, позволяющий увидеть потенциал этого метода. Он может создать армию из 1 миллиона персонажей с высокой частотой кадров в реальном времени.</p>
  <figure id="6WPs" class="m_column">
    <iframe src="https://www.youtube-nocookie.com/embed/CqXKSyAPWZY?feature=oembed"></iframe>
  </figure>
  <p id="LRb9">Моделирование большого скопления людей в Niagara | Unreal Engine</p>
  <h2 id="animtotexture">AnimToTexture</h2>
  <p id="dvoc">В течение многих лет Epic поставляла <a href="https://docs.unrealengine.com/4.27/en-US/AnimatingObjects/SkeletalMeshAnimation/Tools/VertexAnimationTool/" target="_blank">Vertex Animation Tool</a> с Unreal Engine, который позволял разработчикам легко запекать анимацию. Однако он ограничен использованием в 3Ds Max и поддерживает только модели до 8192 вершин. В UE 5.1 появился экспериментальный плагин AnimToTexture, который может выполнять все операции по запеканию и воспроизведению данных анимации из редактора. Этот плагин <a href="https://youtu.be/h_dJtk3BCyg?t=526" target="_blank">был первым представлен в демо-версии City Sample</a> и использовался для пешеходов на средних и дальних расстояниях. Цель этого руководства - повысить осведомленность об этом инструменте и показать, как его использовать.</p>
  <blockquote id="SReE"><strong>ВНИМАНИЕ</strong>: Плагин AnimToTexture помечен как &quot;экспериментальный&quot;, поэтому он с большой вероятностью может быть изменен, не имеет официальной документации и может не обладать поддержкой и стабильностью для работы в производстве. Представленная здесь информация не является исчерпывающей или гарантированной, и может быть устаревшей. Она предоставляется как есть для ваших собственных экспериментов.</blockquote>
  <figure id="tya6" class="m_column">
    <img src="https://ue-cdn.artstation.com/imgproxy/13oRDW8rDg4aKh6l_1jdAZwltd2uaUF-7RldPjU9i7o/filename:28_hero.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMTdkM2Q3MDEtZDM3Mi00ZDExLThiOWItOGMwMTU2Yjg3MjU1LzI4X2hlcm8uZ2lm" width="962" />
  </figure>
  <h2 id="theplugin">Плагин AnimToTexture</h2>
  <p id="ZqE5">Чтобы настроить плагин в собственном проекте, откройте любой проект версии 5.1 или более поздней, перейдите в раздел Edit &gt; Plugins и найдите AnimToTexture. Включите его и перезапустите редактор.</p>
  <figure id="EVNH" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/OzY0s6Fb_Igi_jSKGwGOMfXNGsLzpXkJ-l1SAUFPSQ0/filename:00_plugin.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMmJhYWI3ZGEtM2ExMi00MTBhLTk5ZmUtOGFkYWQxZWRlZmQ4LzAwX3BsdWdpbi5wbmc" width="619" />
  </figure>
  <p id="2BB4">Для начала лучше всего изучить работу плагина, используя готовый контент в папке плагина. Чтобы увидеть этот контент, убедитесь, что в Настройках в правом верхнем углу браузера контента включены Показывать содержимое движка и Показывать содержимое плагина.</p>
  <figure id="X42V" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/RqvZIhUqfyNaLGoIZc4lYL6XgnA6czXgIjLiYgafpV8/filename:01_plugincontent.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYTZiODA3MzUtZGFiMi00OGU0LWI4NTEtMjcxZDc0YWYwMzlkLzAxX3BsdWdpbmNvbnRlbnQucG5n" width="301" />
  </figure>
  <p id="lcR2">Затем в браузере содержимого вы должны перейти в раздел Engine &gt; Plugins &gt; AnimToTexture Content.</p>
  <figure id="tf2f" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/1afRUCkTfeJV3xLxUFlrXSwwOWEX86qRRHJdgYdbJio/filename:02_pluginfolder.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNjM4ODcxNGYtNTM2MC00NThkLThmOGUtNDY0ZTlmYjg2Y2YzLzAyX3BsdWdpbmZvbGRlci5wbmc" width="532" />
  </figure>
  <p id="BjlM">В папке Characters &gt; Mannequin вы найдете все ассеты и данные, необходимые для преобразования скелетной модели с анимацией в статическую модель, которая анимируется с помощью материалов. Вы можете открыть одну из двух статических моделей, чтобы посмотреть, как они работают. Также в этой папке находится утилита редактора с простым примером использования некоторых пользовательских узлов Blueprint, которые требует плагин.</p>
  <figure id="NJBz" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/9XObkl0Zlcv1-Z4eTeVTFYTuac6rv_p66HMOJXX-UyY/filename:03_plugincontent.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOThhZjk2MDItMDRlMi00OWRiLTllNGYtMzZjNmZhMjQ4MzAyLzAzX3BsdWdpbmNvbnRlbnQucG5n" width="970" />
  </figure>
  <figure id="iBjX" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/bhRf7ZtG4aHqrp7SPWYt9L7HEPxnrjMc2X4uRikGv4c/filename:04_animmanny.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMjRiOTI1NzItYzE4MC00OGY3LWE3MTgtYjE5YzM3M2U4YzFjLzA0X2FuaW1tYW5ueS5naWY" width="640" />
  </figure>
  <h2 id="howitworks">Как это работает</h2>
  <p id="YRar">Давайте рассмотрим основные моменты настройки системы. В этом разделе я буду ссылаться только на существующий пример контента и освещать некоторые настройки. Вы можете настроить все необходимые элементы вручную, но позже мы рассмотрим, как автоматизировать это для вашего собственного проекта.</p>
  <h3 id="thedataasset">Ассет данных</h3>
  <p id="wo4p">В основе этой системы анимации лежит Data Asset, примеры которого вы можете найти в папке Mannequin &gt; Data. Data Asset выступает в качестве контейнера для хранения различных параметров и ссылок на другие ассеты, а у этого плагина есть свой особый тип, который в дальнейшем используется скриптами автоматизации. Здесь есть два включенных ассета, чтобы показать разницу между анимацией &quot;Bone&quot; и анимацией &quot;Vertex&quot;, соответствующие двум моделям в родительской папке.</p>
  <figure id="dnJL" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/r4o_eEptJefy-WTpLyt0JSPNGOgNXHvksK-k2V3ot28/filename:05_dataassets.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOWU5MjBjMjMtODBjYS00ZWY4LThjNTMtNWE3M2Q3NGUyZWU3LzA1X2RhdGFhc3NldHMucG5n" width="256" />
  </figure>
  <figure id="HYbe" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/PGS22N78wk749-ewqNqUx-MKDLjxVOUZg8CTrdZix8A/filename:06_dataasset.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYmIwZDJlNDMtNjRmNi00MzNjLTg2NjUtZTUxN2Q2MGU2ODY5LzA2X2RhdGFhc3NldC5wbmc" width="546" />
  </figure>
  <h3 id="meshes">Модели</h3>
  <p id="lNM0">Первое, что нужно определить в Data Asset, - это Skeletal Mesh, на который должны ссылаться ее анимации. Вам также понадобится соответствующий Static Mesh. Если автоматизировать этот процесс с помощью Blueprints, в состав плагина входит узел Convert Skeletal Mesh to Static Mesh, но вы также можете сделать это вручную с помощью кнопки Make Static Mesh в верхней части любого окна редактора скелетной модели.</p>
  <p id="BKZL">На момент написания статьи AnimToTexture запекает только один LOD, поэтому для начала вам следует убедиться, что количество треугольников в выбранном LOD достаточно низкое. Более высокое количество полигонов приведет к тому, что в режиме анимации &quot;Vertex&quot; потребуется больше места для текстур, а проблемы с производительностью при большом количестве моделей на экране легко усугубить.</p>
  <p id="tdax">Параметр <strong>UV Channel</strong> - важный параметр, на который следует обратить внимание. В этот слот будет вставлен новый UV-набор, хранящий информацию о позиции для каждой вершины, и это может нарушить работу других функций, основанных на UV, таких как лайтмапы или специальные эффекты материалов.</p>
  <figure id="ucL4" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Hoc41IS4131mMuCZLBMt0EzNRLOVuu6bFH2ZfND0BWw/filename:07_meshes.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOTIwZDhmY2ItMzE5YS00ZWEzLTlmMWYtOTRkMGY5YWRhMWY1LzA3X21lc2hlcy5wbmc" width="547" />
  </figure>
  <h3 id="texture">Текстура</h3>
  <p id="s77p">Здесь мы определяем, как будут храниться данные об анимации.</p>
  <p id="61CW"><strong>Enforce Power of Two</strong> не является строго необходимым, но я обнаружил, что он помогает сделать воспроизведение анимации более плавным и лучше использовать сжатие текстур.</p>
  <p id="DuWH">Важным параметром здесь является <strong>Mode</strong>, который может быть &quot;<strong>Bone</strong>&quot; или &quot;<strong>Vertex</strong>&quot;. </p>
  <h3 id="P7oi">Режим <strong>Bone</strong></h3>
  <p id="uyHE">Режим <strong>Bone </strong>является более гибким вариантом, поскольку положение и влияние отдельных костей не привязано строго к идентификаторам вершин. Это означает, что большая часть запеченных данных может быть повторно использована для любого персонажа или модели с аналогичными пропорциями и всех их LODов. Однако для каждого отдельного статичного меша или LOD, необходима своя текстура <strong>Bone Weight</strong>. Другим преимуществом использования <strong>Bone </strong>является то, что общий объем памяти результирующих текстур будет меньше, потому что количество костей, которые нужно отслеживать, меньше, чем количество вершин в модели.</p>
  <figure id="DdBe" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/hc5eI9WPJVegjqMWMUCtc58dC-mOM0Ukg81sgXjLtLw/filename:08_texture.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNDQ4NTc5NjItZmI3My00YzQzLTkzZjYtYTk3ZWE2NmY1Y2M1LzA4X3RleHR1cmUucG5n" width="530" />
  </figure>
  <h3 id="M6ok">Режим <strong>Vertex</strong></h3>
  <p id="QVUT">Режим <strong>Vertex </strong>записывает положение каждой вершины во время анимации, независимо от того, как движутся кости. Если у вас сложный риг, постобработка анимации, морф-цели или симуляция, происходящие внутри скелетной модели, то вы можете лучше передать это, запекая положение каждой вершины каждый кадр. Компромисс заключается в том, что вам понадобится гораздо больше текстурного пространства для всех этих вершин, и разные модели будут иметь совершенно разные вершины, которые нужно запекать отдельно.</p>
  <p id="nPHz"><strong>Bone Precision</strong> - это еще один компромисс между памятью текстур и точностью анимации в конечном меше. Вы можете увеличить это значение до 16 бит, чтобы убедиться, что все выглядит гладко.</p>
  <p id="vS8y">Вся суть текстурной вершинной анимации заключается в том, что все данные анимации запекаются в текстуры, но AnimToTexture в настоящее время не создает эти ассеты для вас. Вместо этого он хочет получить ссылку на существующие файлы. В зависимости от выбранного режима вам потребуется две или три текстуры для хранения данных. Вы можете создать эти текстуры одним из трех способов:</p>
  <ol id="PkU4">
    <li id="CgJV">Дублировать существующие файлы текстур (содержимое и настройки будут перезаписаны в любом случае)</li>
    <li id="IZnc">Создайте новый объект Render Target, затем щелкните на нем правой кнопкой мыши и Create Static Texture.</li>
    <li id="lVwF">Используйте скриптинг. В Blueprints есть узел Create Asset, доступный в Editor Utility Blueprints.</li>
  </ol>
  <h3 id="animation">Анимация</h3>
  <p id="Ocd5">Теперь вам нужно выбрать, какие анимации вы хотите запечь в текстуры. Это может быть разобрано позже в материале, поэтому можно сохранить несколько.</p>
  <figure id="RjxM" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/isVFacnrxD6L1q0RdQXJeIpZ5WH-8MxnNzZXsWaj3HQ/filename:11_animation.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYzQ5ZDM1YzYtODk4ZS00ZTY2LThiNTktNzEyYWE1YWIyNTM0LzExX2FuaW1hdGlvbi5wbmc" width="530" />
  </figure>
  <p id="PvLn"><strong>Sample rate</strong> можно настроить выше, если вам нужно более точное воспроизведение, или ниже, чтобы сэкономить память и стоимость исполнения материала.</p>
  <p id="zWfl"><strong>Anim Sequences </strong>- это место, где вы добавляете желаемые анимации. Убедитесь, что выбранные анимации работают со скелетной моделью, указанной ранее, поскольку этот список не фильтруется на предмет совместимости.</p>
  <p id="lfHv">Вам нужно использовать <strong>Custom Range</strong> только в том случае, если вы хотите обрезать что-то из анимации. Плагин будет знать начальный и конечный диапазон каждой анимации автоматически.</p>
  <h3 id="info">Информация</h3>
  <p id="iJK3">Остальная часть Data Asset ниже Info предназначена только для хранения и считывания информации плагином. Здесь нет ничего, что можно было бы редактировать.</p>
  <h2 id="thematerialattributelayer">Слой атрибутов материала</h2>
  <p id="3TBY">Когда все данные анимации будут запечены (позже!), они будут перемещаться по нашей статичной модели изнутри материала. Для этого используется пользовательский <strong><a href="https://docs.unrealengine.com/using-material-layers-in-unreal-engine/" target="_blank">Material Attribute Layer</a>,</strong> предоставляемый вместе с содержимым плагина под названием &quot;<strong>ML_VertexAnimation</strong>&quot; или &quot;<strong>ML_BoneAnimation</strong>&quot;, и его нужно вставить в родительский материал статической модели.</p>
  <p id="LQAc">Вам нужно использовать узел <strong>GetMaterialAttributes</strong>, чтобы разделить вывод Normal и вывод World Position Offset, а затем включить их в остальную часть графа материалов. Ниже приведен базовый пример того, как все это работает в редакторе материалов. Чтобы упростить себе задачу, вы можете скопировать &amp; вставить соответствующие узлы из файлов примеров, приведенных ниже, или из материала Mannequin, входящего в состав плагина.</p>
  <figure id="buZ3" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/0lq24VsZgcHjPFBnRsbpi8S9uGGCBk9bG6SXKX5hGks/filename:12_materialhookup.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZGQ5MmJhMTUtNzk2Ni00NjNhLWE0M2UtZDNjZTA0YWEzOTMwLzEyX21hdGVyaWFsaG9va3VwLnBuZw" width="1738" />
  </figure>
  <p id="thematerialattributelayer">Более того, все конечные параметры, которые попадают в слой атрибутов, зависят от того, является ли материал <a href="https://docs.unrealengine.com/instanced-materials-in-unreal-engine/" target="_blank">экземпляром материала</a>. Итак:</p>
  <ol id="LKEm">
    <li id="I0rF">Убедитесь, что <strong>использование атрибутов материала</strong> включено во всех родительских материалах,</li>
    <li id="F6wx">Убедитесь, что вы создали экземпляры материалов,</li>
    <li id="KB1w">Убедитесь, что модель использует экземпляры материала!</li>
  </ol>
  <h2 id="processing">Обработка</h2>
  <p id="qnAQ">Теперь, когда у нас есть Data Asset, загруженный всей необходимой информацией о запекании, и на нашем меше есть материалы, которым нужны запеченные данные, мы можем завершить весь процесс. Внутри содержимого плагина находится простой Editor Utility Blueprint под названием &quot;<strong>BP_AnimToTexture</strong>&quot;, который показывает минимально необходимую обработку. Если щелкнуть правой кнопкой мыши на блюпринте и запустить его, появится узел <strong>Animation To Texture</strong>, который запечет заданный Data Asset, а также два узла <strong>Update Material Instance from Data Asset</strong>. Вместе они наполняют наши анимационные текстуры соответствующими данными и указывают материалам, как их читать. Утилиты редактора на данный момент являются единственным способом работы с этим плагином и создания финальных ассетов.</p>
  <figure id="2yYq" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/atXtCruq8fB6dXBlbogeR_qreDdYtB23ZFj2cDUqPDA/filename:13_editorblueprint.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOTRmNTcwYTEtZGU0NC00ZTgzLThkNzEtYjQzYzkzOWJjZWUzLzEzX2VkaXRvcmJsdWVwcmludC5wbmc" width="1269" />
  </figure>
  <h2 id="modifyinglayerparameters">Изменение параметров слоя</h2>
  <p id="iyIb">Если вы хотите увидеть или отредактировать эти параметры, откройте экземпляры материалов на ваших моделях (или на примере Mannequin) и переключитесь с вкладки <strong>Details </strong>на<strong> Layer Parameters</strong>. Здесь вы можете отредактировать и настроить некоторые параметры, например, указать UV-канал, который он использует (чтобы соответствовать Data Asset), убедиться, что он действительно установлен на <strong>Animate</strong>, когда вы этого хотите, переключиться между <strong>UseFourInfluences </strong>или <strong>UseTwoInfluences </strong>по причинам качества / производительности. По умолчанию ваша модель будет циклически повторять все включенные анимации. <strong>FrameOffset </strong>и <strong>NumFrames </strong>могут быть использованы для указания определенного диапазона воспроизведения (считайте, что это как <strong>Start Frame</strong> и <strong>End Frame</strong>). А <strong>TimeStartOffset </strong>можно использовать для того, чтобы убедиться, что все модели не анимируются в унисон.</p>
  <figure id="UZqh" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/nY3X2slHoeEcGjP2ZLzvzI-kMwryT_hTWE2wkcvquvk/filename:14_params.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNTg2NDYyZjgtZmVlZi00MDJhLWI5ZjctNjQ2OGI5YWVmOGRjLzE0X3BhcmFtcy5wbmc" width="501" />
  </figure>
  <p id="7Y2U">Если вы откроете слой <strong>ML_BoneAnimation</strong>, то сможете увидеть, как используются и изменяются некоторые из этих параметров. По умолчанию все это определяется <strong>PerInstanceCustomData</strong>, который можно программно или вручную редактировать для каждого меша в вашей сцене. Это то, что вы можете использовать для создания динамических толп, где каждый персонаж движется по-своему.</p>
  <figure id="dTBJ" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/4597SdzAWI2I7QBMPEzMKRWS3Bhntw4n4BwphD7-HhA/filename:15_framedata.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvY2YwYTQyOTMtNGFiYi00NzQzLTk3NTItY2Q3ZGJmMjU3MTM2LzE1X2ZyYW1lZGF0YS5wbmc" width="742" />
  </figure>
  <p id="rAH9">Вы также можете продублировать весь этот слой материала и жестко закодировать в нем различные значения. Вот пример, где я вставил узел <strong>PerInstanceRandom</strong>, который будет менять время начала анимации каждого экземпляра в диапазоне от 0 до 1 секунды, придавая разнообразие и жизнь персонажам, появляющимся в виде листвы (foliage).</p>
  <figure id="pNrT" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/8tN5DpRe1RlFlnGtejqbsPTdK-K9WyzDEmoyOGw9t90/filename:16_perinstance.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMThmYmEwOTItNzM4NS00ZDUwLTlkNDUtZWYxNTRkNzgxNDI1LzE2X3Blcmluc3RhbmNlLnBuZw" width="577" />
  </figure>
  <figure id="mh5q" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/j_T_a5PicFFNhR-oMS_Z3-WYCayuJEBOcm0SFTzozPE/filename:foliage.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMDU1NGNkNzktYzE0My00MjA0LTk4M2MtZjZjOTlmZDUzYjYyL2ZvbGlhZ2UuZ2lm" width="719" />
  </figure>
  <h2 id="automation">Автоматизация</h2>
  <p id="2xLs">На момент написания статьи <strong>AnimToTexture </strong>является экспериментальной функцией и не имеет документации, а пользовательский интерфейс не доработан. Ручная настройка и управление всеми необходимыми данными для окончательного запекания - дело утомительное и очень специфичное для вашего проекта, поэтому для эффективного использования этого инструмента вам понадобится умение работать с утилитами редактора или скриптами Python.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="qDBf">Создатель Кевин Ромонд сделал отличный виджет <strong>Editor Utility Widget </strong>и <strong>Blueprint spawner </strong>для своего собственного обзорного видео по этой функции, которое поможет вам сгенерировать необходимые ассеты. <br /><strong><u>Работает только в Unreal Engine 5.1 - 5.2<br /></u></strong>Его файлы свободно доступны для загрузки на GitHub и могут послужить отличной отправной точкой для вашей собственной работы.<br /><a href="https://github.com/kromond/AnimToTextureHelpers" target="_blank">https://github.com/kromond/AnimToTextureHelpers</a></p>
    <figure id="llOV" class="m_custom">
      <iframe src="https://www.youtube.com/embed/vrlFozqB0jA?autoplay=0&loop=0&mute=0"></iframe>
    </figure>
  </section>
  <h2 id="ngyb">Мой вариант автоматизации</h2>
  <p id="TVTy">Параллельно я работал над собственной методикой автоматизации работы с AnimToTexture. Она может работать не в каждой ситуации, и я еще не автоматизировал все шаги, но я надеюсь, что в своем незаконченном виде она все же поможет кому-то использовать инструмент или узнать о утилитах редактора.</p>
  <p id="dQm1">Мой подход был следующим:</p>
  <p id="KiQS">1. Создать <a href="https://docs.unrealengine.com/scripted-actions-in-unreal-engine/" target="_blank">Утилиту действий с ассетами </a>для выполнения заскриптованных действий правой кнопкой мыши на соответствующих ассетах. Например, я хочу щелкнуть правой кнопкой мыши на ассете Skeletal Mesh и одним махом преобразовать его в вершинную анимированную модель.</p>
  <figure id="cRIo" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/9I5Z96HmwR8W4YXzkNWx8Ostyhaw5U8P5wIKqlflyM0/filename:18_scriptedaction.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZmZjMWI0MDEtZWI1NC00NjBlLWI0MDQtNTUxMDZlY2ZiYTIzLzE4X3NjcmlwdGVkYWN0aW9uLnBuZw" width="689" />
  </figure>
  <p id="en7R">2.  Пользователь может выбрать, какие анимации он хотел бы запечь. </p>
  <figure id="XTeq" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/cT1kWxKrYEAKqSNg0Oz6uwLbLEMnRGrgus4sFpxiEfo/filename:19_anims.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYTg3MTcxZTAtNDEwMC00YjRhLWE5YTYtNmViZDg3NWMwMGJhLzE5X2FuaW1zLnBuZw" width="407" />
  </figure>
  <p id="leuR">Диалог появляется потому, что функция, вызываемая в редакторе, имеет переменные входные данные.</p>
  <figure id="C1AN" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/MgASQ_c_Zf8FitjqaWXKyIHEiAggRKSnhREFU4QTkfc/filename:19_1_animvar.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvODhmNzcxYmUtNjNhYS00OTljLThlOGItMWI4MjMyM2UyNzJjLzE5XzFfYW5pbXZhci5wbmc" width="512" />
  </figure>
  <p id="PZYQ">3.  В каталоге меша создается новая папка, содержащая все необходимые ассеты.</p>
  <figure id="7jr6" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/1esja95Jrv2KcKwQqb5tkieyK_eabmgQ4By4UTyys7M/filename:201_folderbp.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMGE0MmRlM2QtOTQ4ZS00MjA5LWIwYzUtZjVkYWI1ZWZiZWU3LzIwMV9mb2xkZXJicC5wbmc" width="1330" />
  </figure>
  <figure id="UwUj" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/AIwVemSwwd68I3Hnr_V7s2GyMtiiJfKpI4y27shcYlQ/filename:20_newfolder.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMmJjNjZlOTMtYWI0Mi00MDUyLWI3ZTAtMTEwNmRhMDk1ZWJkLzIwX25ld2ZvbGRlci5wbmc" width="401" />
  </figure>
  <p id="f3ow">4.  Затем запускается цепочка функций для создания новых ассетов. Скелетная модель преобразуется в новую статическую модель, создаются новые пустые текстуры для данных анимации, все соответствующие данные и ссылки помещаются в новый Data Asset, создаются новые материалы, все данные запекаются и вставляются в материалы.</p>
  <figure id="3wIb" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Da83vRI7Sj8xzrbYbE9hnNfManRTMbAYopteoAEEdC0/filename:21_createdassets.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvODJlNGYwZDctODlmMS00ZmNlLThlN2MtYzRhMjYzNDQ2NjE5LzIxX2NyZWF0ZWRhc3NldHMucG5n" width="1000" />
  </figure>
  <p id="kLmX">Недоработанная часть этой автоматизации с известными ошибками находится в материалах.  </p>
  <p id="oa5d">В первую очередь необходимо убедиться в том, что существуют нужные экземпляры материалов и что правильно назначены родительские материалы (скорее всего, это не так).</p>
  <figure id="SgNq" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Ldg-AKWDheMa4ORhn4uSQ2JnhXyUYa1Quq8tWxN2w6A/filename:23_parentmaterial.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMThjOTUzMmItMTA1Ni00MjZhLWIxMzUtM2YxODdlZjE3MTQ5LzIzX3BhcmVudG1hdGVyaWFsLnBuZw" width="409" />
  </figure>
  <p id="rrtD">А затем убедитесь, что созданные экземпляры материалов назначены в новой модели. Помните, что нам нужны <em><strong><u>экземпляры</u></strong></em>, а не базовые материалы. Так как настройки слоёв и сам слои доступны <strong>только </strong>в иэкземплярах.</p>
  <figure id="3mtX" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/652jPUS49iS8OzgeE-JhgKhjSe8MCR5wIaJDuFG14bY/filename:24_assigned.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZDBlMDU1YmUtZmIxZS00ZjJlLThkZGEtY2QxODhhMDQzNTZkLzI0X2Fzc2lnbmVkLnBuZw" width="387" />
  </figure>
  <p id="nJ1r">Далее необходимо добавить специальный слой - экземпляр ассета<strong> ML_BoneAnimation</strong>, описанный в разделах выше, ко всем <strong>экземплярам-материалам</strong>. Создайте экземпляр ассета <strong>ML_BoneAnimation</strong> из папки движка <strong>/All/EngineData/Plugins/AnimToTexture/Materials </strong>и назначте в слой <strong>Background. </strong><em><u>Если папки нет, то включить плагин AnimToTextures.</u></em></p>
  <figure id="1OZ0" class="m_original">
    <img src="https://img1.teletype.in/files/0f/b4/0fb4032f-2320-40b5-987e-a4202606895d.png" width="502" />
  </figure>
  <p id="EDSO">Далее нужно полуить атрибуты этого слоя и назначить материалу.<br />Его можно скопировать и вставить из примера материала &quot;<strong>A2T_MaterialNodes</strong>&quot; <a href="https://epicgames.box.com/s/qlzveuyov93p9a00gjbiftim1yy207ew" target="_blank">в моем проекте</a>. <br />Для автоматизации этого процесса необходимо провести некоторые исследования и разработки, но технически вы можете получить доступ к узлам редактора материалов через утилиты и скрипты Python.<br />Откройте мастер материал и внесите изменния.</p>
  <figure id="1NGR" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/pW2pElbcRG48UQFm_qcUnZu_zFoPpiAPcpd8d9D-Pj0/filename:25_insertnodes.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMjcyOGRjOWMtNDg4My00ODllLWEwZGYtYTE4YzA5MjgwMGNjLzI1X2luc2VydG5vZGVzLnBuZw" width="1090" />
  </figure>
  <p id="6p5d">Следующий шаг: В слоях экземпляров материалов по-прежнему отсутствуют все параметры анимации, поскольку этот слой не существовал во время остальной части автоматизации. Я также создал скриптовое действие, которое можно использовать для экземпляров материалов, чтобы обновить соответствующие данные из Data Asset.</p>
  <figure id="hVUZ" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/hYNKo-DebzkF53KyqNao1E-n8MmUp4qdqcWu4q_wj-w/filename:26_updateparameters.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZDMxYmI5OWQtNDkyOS00MTJiLThjNGMtODdiNmQ1ZDMzNzAyLzI2X3VwZGF0ZXBhcmFtZXRlcnMucG5n" width="814" />
  </figure>
  <figure id="r6QO" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/-6frUZ7zCGBHYDjvpnzVGQf5jGp7UmMW9f1Z0GRRJKQ/filename:27_dataasset.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvM2QwYmUwNTUtOGVjOC00OGU5LTliMmMtNzViZTBkOGQxOGEyLzI3X2RhdGFhc3NldC5wbmc" width="404" />
  </figure>
  <p id="iK1F">6.  Теперь анимированная статическая модель готова к внедрению в любые системы, которые вам нравятся. Это может быть компонент <strong>Instanced Static Mesh</strong>, <strong>Foliage mesh</strong> или рендерер <strong>Niagara mesh</strong>.</p>
  <figure id="pnla" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/blfN8HE8hzfiHnS3V4xMMP_6zegL9g7tjCry9YCLxg4/filename:27_final.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNDAzZDc5NjUtZjhkYi00ZWFlLWI0OTgtYTVhYWJiZTA0MTYzLzI3X2ZpbmFsLmdpZg" width="494" />
  </figure>
  <p id="Rfji">7. Если вы хотите изменить какие-либо настройки и заново запечь данные, есть еще одно скриптовое действие под названием &quot;<strong>Rebake Anim Textures</strong>&quot;, которое можно использовать для Data Asset. Затем следует выполнить последующие действия и снова обновить экземпляры материалов.</p>
  <figure id="JHBi" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/oss0QU4Hwge9bchUMZfK_mTdm7mykmFR3ODVt_dfEPM/filename:28_hero.gif/resizing_type:fit/width:1920/height:1080/ext:gif/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvODg4MmNmYzEtYzAxZi00NmFjLWFlODctZGU0ZTM0YWNhYmRmLzI4X2hlcm8uZ2lm" width="962" />
    <figcaption>Add some PerInstanceRandom HueShift and it’s a party.</figcaption>
  </figure>
  <h2 id="xRiz">Вопросы и соображения</h2>
  <ul id="k4nl">
    <li id="oA6B">В некоторых сценариях освещения, например в редакторе статичных сеток, модель будет самозатеняться на основе исходного поля расстояния. Поле расстояния не перемещается вместе с моделью.</li>
    <li id="BF8d">Иногда WPO не очень хорошо работает с виртуальными картами теней. Вы можете увидеть артефакты отбрасывания теней.</li>
    <li id="gzjH">Nanite поддерживает WPO начиная с версии 5.1, но не надейтесь на это слишком сильно. Сейчас при использовании техники AnimToTexture инстансные модели не могут вращаться должным образом при включенном Nanite. Статические сетчатые актеры будут работать и анимироваться с Nanite, но как только Nanite начнет схлопывать вершины по мере удаления, появятся дикие артефакты.</li>
    <li id="vEZR">Для запуска определенных анимаций в списке запекания существуют другие узлы Blueprint, которые я здесь уже затрагивал. Посмотрите видео Кевина выше, чтобы узнать больше.</li>
    <li id="NXZx">Вы определенно можете включить это в симуляцию Niagara для реалистичной динамики пешеходного потока!</li>
  </ul>
  <p id="bKRu">Надеюсь, это руководство помогло вам начать работу с этим новым плагином. Я считаю, что это очень крутая встроенная функция движка, которая откроет людям возможности вершинной анимации. Эта техника существует уже давно, но теперь вы можете делать все это, не выходя из Unreal Engine.</p>
  <p id="DM0G">Ниже приведена ссылка на скачивание файлов примеров, которые я использовал для этого урока. Не стесняйтесь изменять их под свои нужды и доводить начатое до конца.</p>
  <h2 id="KYPP">ФАЙЛЫ ПРОЕКТОВ</h2>
  <ul id="HIXz">
    <li id="W4Pj"><a href="https://epicgames.box.com/s/qlzveuyov93p9a00gjbiftim1yy207ew" target="_blank">Vertex Animation Sample Project</a></li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/statetree</guid><link>https://teletype.in/@hardway/statetree?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/statetree?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Обзор StateTree</title><pubDate>Tue, 07 May 2024 17:36:24 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3c/dc/3cdcdd20-3c19-4d42-abd6-a79d66e5ee59.png"></media:content><category>AI</category><description><![CDATA[<img src="https://img1.teletype.in/files/c6/0c/c60c8c7a-74b9-4ac2-b041-e8b28491cf4e.png"></img>Обзор системы StateTree.]]></description><content:encoded><![CDATA[
  <p id="w8KL">Обзор системы StateTree.</p>
  <figure id="3EEd" class="m_column">
    <img src="https://img1.teletype.in/files/c6/0c/c60c8c7a-74b9-4ac2-b041-e8b28491cf4e.png" width="1920" />
  </figure>
  <h2 id="overview">Обзор</h2>
  <p id="KrkH"><strong>StateTree </strong>- это иерархическая машина состояний общего назначения, которая объединяет <strong>Selectors </strong>из деревьев поведения с <strong>States </strong>(состояния)и <strong>Transitions </strong>(переходы)из машин состояний. Пользователи могут создавать высокопроизводительную логику, которая остается гибкой и организованной.</p>
  <p id="Usba">StateTree содержит состояния, расположенные в древовидной структуре. Выбор состояния может быть запущен в любом месте дерева, но первоначально он начинается с корня. В процессе выбора оцениваются <strong>Условия </strong>входа каждого состояния. Если они выполняются, выбор переходит к дочерним состояниям состояния, если они доступны. Если дочерние состояния недоступны, активируется текущее состояние.</p>
  <p id="anyf">При выборе состояния активируются все состояния от корневого до листового. Каждое состояние состоит из <strong>Tasks </strong>(Задач) и <strong>Transitions </strong>(Переходов).</p>
  <p id="eMfD">При выборе состояния, выбранное состояние и все его родительские состояния становятся активными. Все задания выполняются для всех активных состояний, начиная с корня и заканчивая выбранным состоянием.</p>
  <p id="000y">Каждая задача обеспечивает выход в дерево StateTree. Обычными примерами вывода являются выбор цели, воспроизведение анимации и просмотр объекта. Каждое состояние может иметь несколько задач, и все задачи в состоянии выполняются одновременно, пока состояние остается активным. Первая задача, завершившая свое выполнение, запускает переход, который может привести к выбору нового состояния.</p>
  <p id="Ffm2">В качестве простого примера можно создать систему учета времени суток с помощью StateTree. Вы создадите состояние для каждого времени суток, а под каждым состоянием создадите отдельные задачи. Каждая задача может обрабатывать различные элементы, такие как плотность тумана, цвет небесной сферы и так далее.</p>
  <p id="JKNQ">Другим примером может быть агент ИИ, который ходит по уровню и постоянно проверяет попадания, осматриваясь вокруг. У вас может быть состояние для ходьбы и осмотра, а другое - для реакции на попадание.</p>
  <p id="1OF9">Переход в дереве состояний может указывать на любое другое состояние в дереве. Переходы имеют <strong>Trigger Conditions (</strong>Условия триггера), которые должны быть выполнены, прежде чем переход запустит процесс выбора состояния.</p>
  <p id="j3Hk">Если выбор состояния прошел успешно, будет выбрано новое состояние. Некоторые переходы отслеживаются постоянно, в то время как другие выполняются только по завершении состояния. Переходы оцениваются, начиная с листового состояния и продвигаясь вверх к корню. В ходе этого процесса выбирается первый Переход, который преуспел и привел к выбору Состояния. Эта иерархия позволяет группировать общие переходы.</p>
  <p id="edhY">Это различные элементы дерева StateTree:</p>
  <figure id="cBUP" class="m_column">
    <img src="https://img1.teletype.in/files/45/79/4579111f-b35b-40ba-9f74-7127a5a8cd93.png" width="1312" />
  </figure>
  <p id="MJph"><strong>1 Корень<br /></strong>Первое состояние, выбранное при запуске StateTree.</p>
  <p id="AUIs"><strong>2 Состояние селектора<br /></strong>Относится к состоянию, у которого есть дочерние состояния. Это состояниеникогда не будет выбрано напрямую, и выбор будет продолжен до одного из его дочерних состояний.</p>
  <p id="REJy"><strong>3 Условие входа в состояние<br /></strong>Относится к списку условий, которые определяют, может ли состояние быть выбрано.</p>
  <p id="wvpw"><strong>4 Задание<br /></strong>Относится к набору действий, которые принадлежат состоянию и выполняются, когда состояние становится активным.</p>
  <p id="vzu8"><strong>5 Переход<br /></strong>Определяет условия, которые запускают процесс выбора состояния. Переход запускается при завершении, успешном выполнении или неудаче задачи, а также при успешном выполнении контролируемого условия.</p>
  <h2 id="selectionflow">Поток выбора</h2>
  <h3 id="selectinganewstate">Выбор нового состояния</h3>
  <p id="LxLh">StateTree выбирает активные состояния аналогично дереву поведения. Выбор состояния начинается с корня на первом тике и продолжается вниз по дереву, оценивая условия входа каждого состояния.</p>
  <ul id="3nIh">
    <li id="cUIj">Если условия ввода не выполняются, выбор переходит к следующему состоянию.</li>
    <li id="fMF6">Если условия ввода выполнены, а состояние является состоянием-листом, оно выбирается в качестве нового состояния.</li>
    <li id="5grL">Если у состояния есть дочерние состояния, тот же процесс продолжается до первого дочернего состояния, пока не будет найдено листовое состояние.</li>
  </ul>
  <p id="eIvG">Если у состояния есть дочерние состояния, но ни одно из них не может быть выбрано (их условия ввода не работают), состояние не будет выбрано, даже если все его условия ввода прошли проверку.</p>
  <p id="uYyH">Одно из существенных различий между деревьями поведения и машинами состояний заключается в том, что машины состояний обычно фиксируют выбор состояния по мере продвижения по дереву, в отличие от деревьев поведения, которые пытаются найти подходящий листовой узел.</p>
  <p id="qHR1">В общем случае деревья поведения продолжают выполнять логику выбора состояния, даже если состояние уже выбрано. Это единственный метод перехода между состояниями.</p>
  <p id="nvfv">StateTree запускает процесс выбора состояния по требованию, основываясь на переходах. При первом тике происходит неявный переход к корневому состоянию, который выбирает первое состояние для запуска. После того как состояние выбрано, переходы определяют, когда и где будет выполняться логика выбора.</p>
  <h3 id="executingthestatetasks">Выполнение задач состояния</h3>
  <p id="zgJX">После выбора состояния все его задачи начнут выполняться <u><strong>параллельно</strong></u>. Задачи будут выполняться до тех пор, пока переход не запустит процесс выбора и не будет выбрано состояние. Выбранное состояние может быть текущим состоянием (состояние продолжает выполняться) или новым состоянием.</p>
  <p id="WzD4">Наиболее распространенным триггером перехода является завершение, который выполняется, как только завершается первая задача активного состояния. Другие Переходы могут быть помечены как Tick и проверяются на каждом тике. Если условный переход проходит проверку, выполняется логика выбора состояния и начинается процесс выбора в целевом состоянии. Если у целевого состояния есть дочерние состояния, процесс выбора будет учитывать дочерние состояния как часть логики выбора.</p>
  <h2 id="dataflow">Поток данных</h2>
  <p id="IPHL">Деревья состояний используют привязку данных для передачи данных внутри дерева. Привязка данных может использоваться для создания условий или настройки задач для выполнения. Привязка данных может получить доступ к данным, переданным в дерево состояний, или между узлами определенным образом.</p>
  <p id="WxFU">Для всех узлов дерева состояний доступны следующие общие типы данных:</p>
  <p id="EnFg"><strong>Параметры дерева состояний <br /></strong>Пользователи могут добавлять в дерево состояний входные параметры, на которые можно ссылаться во время работы дерева. Эти параметры позволяют настраивать использование дерева в зависимости от его назначения. Например, пользователь может определить параметр анимационного актива, который может быть передан дереву извне для использования во время игрового процесса.</p>
  <p id="gRvN"><strong>Контекстные данные</strong><br />Контекстные данные относятся к предопределенным данным, доступным для дерева состояний на основе выбранной схемы дерева состояний. Они меняются в зависимости от того, где используется дерево состояний. Например, дерево состояний, используемое актором, будет иметь этого актора в качестве контекста. Однако если то же дерево состояний используется с поведением смарт-объекта, контекст будет относиться к используемому смарт-объекту и использующему его актору.</p>
  <p id="6P3W"><strong>Оценщики</strong><br />Оценщики предоставляют способ передачи данных в дерево состояний, которые иначе невозможно было бы передать с помощью параметров или контекстных данных. Оценщики - это отдельный класс, который может быть выполнен в дереве состояний во время выполнения. Оценщики содержат переменные и могут выполнять пользовательский код при запуске, остановке и при каждом тике дерева. Свойства Evaluator могут быть привязаны к Parameters или Context Data, или к другим Evaluators, которые находятся перед ними в списке Evaluator.</p>
  <p id="g2qA"><strong>Глобальные задачи</strong><br />Глобальные задачи позволяют запускать задачи StateTree, которые активны между событиями запуска и остановки дерева. Глобальные задачи можно использовать, если вам нужны постоянные данные для выбора состояния. Например, в системе учета времени суток можно создать глобальную задачу, определяющую текущее время суток. Поскольку глобальные задачи запускаются до корневого состояния дерева, эта информация будет доступна при запуске дерева и во время первого выбора состояния.</p>
  <p id="G7Fy">Узлы StateTree могут обмениваться данными между собой. Различные элементы дерева StateTree могут связываться с данными следующим образом:</p>
  <p id="BBvD"><strong>Условия ввода</strong><br />Можно привязать к общим данным, а также к задачам во всех родительских состояниях.</p>
  <p id="UP0x"><strong>Условия перехода</strong><br />Могут связываться с общими данными и задачами из текущего состояния и всех родительских состояний.</p>
  <p id="J3tA"><strong>Задачи </strong><br />Могут привязываться к общим данным, а также к более ранним задачам в текущем состоянии и во всех родительских состояниях.</p>
  <h2 id="blueprintintegration">Blueprint Integration</h2>
  <p id="p10K">StateTree разработан для расширения с помощью сценариев Blueprint. Вы можете создавать пользовательские Задачи, Оценщики и Условия, расширяя следующие классы Blueprint:</p>
  <p id="SLjY"><strong>UStateTreeTaskBlueprintBase</strong> <br />Базовый класс для задачи StateTree.</p>
  <p id="X1K9"><strong>UStateTreeEvaluatorBlueprintBase </strong><br />Базовый класс для оценщика StateTree Evaluato<strong>r.</strong></p>
  <p id="6LAZ"><strong>UStateTreeConditionBlueprintBase </strong><br />Базовый класс для StateTree Condition.</p>
  <p id="U0qt">Продолжая упомянутый ранее пример, вы можете создать систему времени суток, используя StateTree и Blueprints. Эта система будет изменять плотность тумана на уровне в зависимости от времени. Система также может проверять наличие заклинания шторма, чтобы изменить условия освещения независимо от времени.</p>
  <p id="SG4N">Для этого примера вы можете создать следующие классы Blueprint:</p>
  <p id="6Po4"><strong>Task</strong><br />Постепенно изменяет плотность тумана с течением времени. Эта задача может быть добавлена во все состояния, которые представляют определенное время суток.</p>
  <p id="rSh2"><strong>Condition</strong><br />Проверяет, было ли произнесено заклинание шторма. Это условие может быть оценено в корневом состоянии. Если оно истинно, то переводит выполнение в специальное состояние &quot;Шторм&quot;.</p>
  <p id="mr19"><strong>Evaluator</strong><br />Выставляет время суток для Переходов и Условий входа.</p>
  <h2 id="commonpatterns">Общие закономерности</h2>
  <h3 id="groupingsimilartasks">Группировка похожих задач</h3>
  <figure id="graU" class="m_original">
    <img src="https://img2.teletype.in/files/14/78/1478c3f7-e799-4b77-bb18-3b6f55d15938.png" width="979" />
  </figure>
  <p id="Yqqu">Задачи могут быть сгруппированы в рамках общего состояния. В приведенном выше примере есть состояние, которое управляет смарт-объектами в мире. Это состояние содержит дочерние состояния, которые обрабатывают достижение смарт-объекта и использование смарт-объекта.</p>
  <p id="ld85">Каждое из этих дочерних состояний содержит задачи, которые выполняются при выборе этого состояния. Дочернее состояние Reach содержит задачи, которые находят Smart-объект и перемещают агента ИИ к нему.</p>
  <p id="wA30">При использовании этой стратегии группировки все задачи имеют одинаковые переходы через состояние.</p>
  <h3 id="sequences">Последовательности</h3>
  <figure id="LKgv" class="m_original">
    <img src="https://img1.teletype.in/files/88/d9/88d91cb6-95e7-4b57-b1ac-b4fd95b81593.png" width="979" />
  </figure>
  <p id="yKWs">StateTree поставляется с переходом <strong>Next</strong>, который упрощает создание и упорядочивание последовательности состояний.</p>
  <p id="KOtc">В приведенном выше примере, когда выбрано состояние Reach, выполняются задачи <strong>Find SO Target</strong>, <strong>Move to SO</strong> и <strong>Look</strong>. После выполнения этих задач переход <strong>Next </strong>переводит выполнение в состояние <strong>Use </strong>ниже, где его задачи могут начать выполняться.</p>
  <h3 id="failurehandling">Работа с отказами</h3>
  <figure id="FWGg" class="m_original">
    <img src="https://img1.teletype.in/files/cd/91/cd91b0bc-3117-40f3-94d0-f0fb94408a56.png" width="1189" />
  </figure>
  <p id="r0Bf">StateTree обрабатывает сбой завершения задачи иерархически, начиная с активной задачи и поднимаясь вверх по дереву.</p>
  <p id="kVl6">В приведенном выше примере состояние <strong>Reach Slot</strong> переведет выполнение в следующее состояние при успехе (<strong>Wait</strong>) или переведет выполнение в родительское состояние при неудаче (<strong>Wait at Intersection</strong>). Состояние <strong>Wait at Intersection</strong>  вызовет переход в состояние <strong>Idling</strong>, если любое из его дочерних состояний завершится неудачей.</p>
  <p id="h0fH">Состояние <strong>Wait </strong>будет перемещать выполнение на себя бесконечно долго при успехе или неудаче, пока его родительское состояние не выберет другое состояние.</p>
  <h3 id="hierarchicaldata">Иерархические данные</h3>
  <figure id="cL3U" class="m_original">
    <img src="https://img4.teletype.in/files/b2/3f/b23f928e-0764-4ffa-bae4-83e41daf2080.png" width="1189" />
  </figure>
  <p id="ArTm">Задачи могут обмениваться данными между собой. Данные, открытые задачей, будут доступны любой другой задаче, принадлежащей к активному состоянию. Это делает работу с ресурсами в дереве StateTree более эффективной.</p>
  <p id="tIfQ">В приведенном выше примере задача <strong>Crowd Claim Wait Slot</strong> попытается занять слот Smart Object для агента ИИ, и если ей это удастся, она передаст выполнение задаче <strong>Move To Wait Slot</strong>. Эта задача будет использовать местоположение слота из родительской задачи. В случае успеха она передаст выполнение задаче <strong>Wait At Slot</strong>, которая также будет использовать местоположение слота из родительской задачи.</p>
  <h3 id="refiningbehavior">Уточненное поведение</h3>
  <figure id="JHpJ" class="m_original">
    <img src="https://img2.teletype.in/files/d8/38/d8385568-6575-4c45-b337-1b5fc9f9fd20.png" width="1135" />
  </figure>
  <p id="5EW4">StateTree обеспечивает способ организации Задач таким образом, что контекстное поведение может быть легко достигнуто.</p>
  <p id="rWdc">В приведенном выше примере состояние <strong>Wait </strong>управляет стоянием агента ИИ - агент ИИ осматривается и реагирует на удары. По умолчанию будет выполнено состояние <strong>Wait Look</strong>. Если состояние успешно, оно вернет исполнение своему родителю. Однако в случае неудачи оно переместит выполнение в состояние <strong>Wait Hit</strong>.</p>
  <p id="R6qJ">Состояние <strong>Wait Hit</strong> выполняет задачи <strong>Mass LookAt</strong> и <strong>Mass Contextual Anim</strong>. Эти задачи воспроизведут соответствующую анимацию удара.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/ue_ability_system</guid><link>https://teletype.in/@hardway/ue_ability_system?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/ue_ability_system?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Unreal Engine 5 - The truth of the Gameplay Ability System</title><pubDate>Fri, 03 May 2024 05:15:05 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/18/69/1869b701-12ba-4b29-a699-028959d91abc.png"></media:content><category>Unreal engine 5</category><description><![CDATA[<img src="https://img3.teletype.in/files/e2/20/e2206fe3-d342-4f83-9db6-fb04dcdd51b0.png"></img>This brand new version of Unreal includes a number of features that enhance the experience of working with the engine. Such as Nanite, which with an avant-garde application of virtualized geometry technology, can allow for taking significant shortcuts when creating game-ready photorealistic assets.]]></description><content:encoded><![CDATA[
  <section>
    <p id="G8W8">If we talk about trending engines, we have to talk about <a href="https://www.unrealengine.com/en-US/unreal-engine-5" target="_blank">Unreal Engine 5</a>.</p>
    <p id="hEVc">This brand new version of Unreal includes a number of features that <em>enhance</em> the experience of working with the engine. Such as <a href="https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/" target="_blank">Nanite</a>, which with an avant-garde application of <strong>virtualized geometry</strong> technology, can allow for taking significant shortcuts when creating game-ready photorealistic assets.</p>
    <p id="30Pf">However, these new goodies shall present developers with new challenges. For example, in Nanite we get presented with the following difficulties:</p>
    <ul id="ZZho">
      <li id="03VA">Where to use it: Static opaque non-deformable geometry. Better explained in this <a href="https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/#supportedfeaturesofnanite" target="_blank">list</a>.</li>
      <li id="EyJ8">Size: Compressed Nanite meshes often take more disk space than normal low-poly meshes.</li>
      <li id="GMHj"><a href="https://youtu.be/xUUSsXswyZM?t=791" target="_blank">Overdraw</a>: Dense overlapping geometry can cause performance issues.</li>
      <li id="ITiW">Profiling tools: If we want to use Nanite properly, we should learn these tools. For that, we have the following <a href="https://docs.unrealengine.com/5.0/en-US/RenderingFeatures/Nanite/#performanceandcontentissues" target="_blank">reference</a>.</li>
    </ul>
    <p id="hADm">Most of these tools entail a shift in the way the industry approaches traditional problems. With Nanite, artists no longer need to go through the tedious retopology phase, which implies a reduction in the production cost for the development of photorealistic assets, as the length of the workflow, and thus the hours required for an asset to be considered game-ready have been considerably reduced.</p>
    <p id="CMYS">The industry will of course adopt these changes. So instead of disregarding them because - “I’m so used to the old workflows and I don’t care” - we should always be down to explore new technology and study the new challenges as they come to keep ourselves up to date and, of course, relevant to the industry.</p>
    <h1 id="the-gameplay-ability-system-gas">The Gameplay Ability System (GAS)</h1>
    <p id="mOuJ">Another of these <em>overwhelming</em> new tools that has been around for a while is the <a href="https://docs.unrealengine.com/4.26/en-US/InteractiveExperiences/GameplayAbilitySystem/" target="_blank">Gameplay Ability System</a>. I’ve seen lots of skepticism surrounding this tool, such as:</p>
    <ul id="ZAX3">
      <li id="RJXf">It’s just too much!</li>
      <li id="iOFF">Stay away from it as much as you can!</li>
      <li id="TOen">The learning curve is very stiff!</li>
      <li id="KBz8">It really doesn’t solve any problem…</li>
    </ul>
    <p id="Thl5">Unfortunately, the story gets repeated, most of the disdain and criticism comes from people that haven’t worked in depth with the system. In this post, we’ll demystify and comment real pros and cons of the system.</p>
    <h1 id="the-gist-of-it">The gist of it</h1>
    <p id="qAta">What’s the Gameplay Ability System? The answer is simple, an ability framework which enables the creation of stateful systems through the usage of <strong>gameplay tags</strong>, <strong>abilities</strong> and mutable <strong>gameplay attributes</strong>. It is also complemented by a <strong>gameplay cue</strong> system for those juicy visuals. Let’s elaborate a tiny bit on them:</p>
    <ul id="sM34">
      <li id="KlKW"><strong>Gameplay tags</strong>: Labels that you can add and remove to your game entities to denote a state or any other particularity free to interpretation in game code.</li>
      <li id="xwDL"><strong>Abilities</strong>: Encapsulated UObject that represents a coarse action in a game (ie. a dashing mechanic), it counts with high degree of controllability (ie. can’t execute if certain tags exist…).</li>
      <li id="sIgr"><strong>Gameplay attributes</strong>: Mutable float that you can add to your game entities. Can be conditionally mutated through <strong>Gameplay effects</strong> and other modifiers.</li>
      <li id="Y9Iw"><strong>Gameplay cue</strong>: These non-reliable events were created for visuals. Keep here your VFX and sounds.</li>
    </ul>
    <p id="8hAw">And here is where we see the first issue:</p>
    <pre id="9rU4">GAS is one of those things... It isn&#x27;t terribly complex. 
But there&#x27;s a lot of new concepts. 

And until you really understand all the concepts, the design 
doesn&#x27;t quite fall together. So it feels like a lot of conceptual 
effort to still be stumbling in the dark.

- ImmutableLambda
</pre>
    <p id="coMH"><strong>So… Something as “simple” as casting an ability is becoming complex?</strong> No… no, not really, who told you that? That’s not really the complication of the system. The next Section elaborates on how easy is to implement an ability with casting using the concepts explained above.</p>
    <h2 id="the-pros-implementing-an-ability-is-easy-i-swear">The pros: Implementing an ability is easy, I swear</h2>
    <p id="8ms9">To make things simpler and fairer, we are going to explore the <em>Light Dart</em> ability blueprint from the <a href="https://docs.unrealengine.com/5.0/en-US/ContentAndSamples/ValleyOfTheAncient/" target="_blank">Valley of the Ancient Sample</a> provided by Epic.</p>
    <figure id="fitvid0" class="m_column">
      <iframe src="https://www.youtube.com/embed/wp33UIbQkfw?autoplay=0&loop=0&mute=0"></iframe>
    </figure>
    <p id="CS4K">This ability is feature complete as it adds <strong>Tags</strong>, <strong>Cues</strong>, mutates some <strong>Attributes</strong> and employs the controllability offered by the ability system.</p>
    <h3 id="1-activation-controllability">1. Activation controllability</h3>
    <p id="DfWE">Abilities expose a section in their Class Default Object (CDO) to define a series of conditions and actions to perform using the <strong>Tag</strong> system when attemping an ability activation.</p>
    <figure id="sbl7" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-1.PNG" width="1273" />
    </figure>
    <p id="TfmI">In summary, this ability does the following:</p>
    <ul id="3AHC">
      <li id="shvz"><strong>Ability Tags</strong>: The <em>Ability.PlayerActivated</em> tag identifies this ability.</li>
      <li id="jdBa"><strong>Cancel Abilities with Tag</strong>: Cancels all the abilities with the <em>Ability.LocomotionControl</em> tag.</li>
      <li id="fkMS"><strong>Block Abilities with Tag</strong>: Prevents abilities with tag <em>Ability.TerrainInteraction</em> to be activated.</li>
      <li id="Q4J9"><strong>Activation Blocked Tags</strong>: The ability is blocked if the activating actor/component has the <em>Status.LocomotionControl</em> tag or the <em>Status.BlockingAction</em> tag.</li>
    </ul>
    <p id="LqIl">As we can see, the gameplay tag system shifts the paradigm towards stateful systems by providing a simple controllability interface in our abilities. In traditional systems this would be equivalent to a long and complicated <strong>if-else</strong> boolean statement chain.</p>
    <h3 id="2-on-ability-activated">2. On ability activated</h3>
    <p id="A7bg">Once the ability goes through its initial phase, the event <strong>ActivateAbility</strong> gets called. Let’s see the first phase of the ability.</p>
    <figure id="SpC4" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-2.PNG" width="1036" />
    </figure>
    <p id="C3rf">Numbered nodes explanation:</p>
    <ol id="cLXn">
      <li id="zrbF">Waits until the <em>Status.InCinematic</em> tag is added. If added, it calls <em>OnThrowAborted</em> to abort the ability.</li>
      <li id="PfZe">ActorInfo holds all the information relevant to our <a href="https://docs.unrealengine.com/4.27/en-US/API/Plugins/GameplayAbilities/UAbilitySystemComponent/" target="_blank">Ability System Component</a> (ASC). Within this information we can find the Avatar, which represents the physical Actor that executes abilities.</li>
      <li id="RY3p"><em>EndAbility</em> should be called when we want to terminate the ability and remove all the tags added in the controllability phase.</li>
      <li id="0qC6">This node isn’t related to the ability system. It simply mutates the camera with certain specified configuration determined by the passed-in <em>Camera Mode</em> class.</li>
      <li id="6ob3">Similar to the <em>WaitGameplayTagAdd</em> node, it waits until the specified gameplay tag event is triggered. Right after the execution of this node the blueprint calls <em>Enter Charging State</em>. If the event is received, it performs a smooth rotation over Echo’s root.</li>
    </ol>
    <h3 id="3-charging-state">3. Charging State</h3>
    <p id="d8QX">Following this, the character begins to levitate, spawning particles and triggering sounds, for that, this project uses the gameplay cue system. When this happens, Echo reduces their movement speed and starts casting the <em>Light Dart</em>.</p>
    <figure id="zILx" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-3.PNG" width="1436" />
    </figure>
    <figure id="5Ikd" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-4.PNG" width="1794" />
    </figure>
    <p id="Ho3G">Numbered nodes explanation:</p>
    <ol id="SrEL">
      <li id="3YRY">Adds a gameplay-cue to the owner, in this case it starts the orb charging animation.</li>
      <li id="EV16">Abilities can also define their own internal state and react accordingly when their state is ended through its neighbour node <em>End Ability State</em>.</li>
      <li id="sAzu">Similar to 1, however this time we are adding a looping cue (looping animation or sound). In the case of this ability, it makes Echo levitate in place while we hold the button.</li>
      <li id="bbeO">As we commented before, Gameplay Effects can modify attributes, in this case it mutates the MoveSpeed value that sets its new value directly in the Character Movement Component (CMC).</li>
      <li id="uC6W">Expects the ability activator to provide target data over a target actor special class. In this case it’s waiting for the target actor to define the aim vector to throw the <em>Light Dart</em>.</li>
      <li id="QI6u">Removes a looping cue giving a tag handle. In this case, if we obtain valid data from the target actor, Echo stops levitating.</li>
      <li id="zkCz">Waits for the input to be released.</li>
      <li id="GDXX">If the user releases the input, the <em>Wait Target Data</em> node executes the <em>Valid Data</em> output.</li>
    </ol>
    <h3 id="3-throwing-the-projectile">3. Throwing the projectile</h3>
    <p id="0Ndc">Assuming the target actor returned valid data, we can proceed with the launch of the projectile.</p>
    <figure id="wiXq" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-5.PNG" width="1512" />
    </figure>
    <figure id="ilm7" class="m_original">
      <img src="https://vorixo.github.io/devtricks//assets/images/per-post/gas/gas-6.PNG" width="1266" />
    </figure>
    <p id="kv3Q">Numbered nodes explanation:</p>
    <ol id="kcbC">
      <li id="Zgzg">Starts the throwing internal state.</li>
      <li id="6p8w">Preparing the projectile actor to be thrown.</li>
      <li id="SfHn">Reliable animation node that plays a montage for the animation. In this case it ends the ability if the montage is completed. If we follow the execution path we can see how Echo waits for a gameplay event to release the Light Dart in the precise moment. In this case it comes from an animation notifier contained within the LightDart_Release_Montage animation.</li>
    </ol>
    <h3 id="thats-it">That’s it?</h3>
    <p id="hbAV">And that’s about it. The graph has more to it, but this is the essence of the implementation of the ability. Still, If you want to learn more about this specific ability you can download the <a href="https://docs.unrealengine.com/5.0/en-US/ContentAndSamples/ValleyOfTheAncient/" target="_blank">Valley of the Ancient Sample</a> by Epic Games.</p>
    <p id="rj77">As you can see, implementing an ability isn’t that complicated once you grasp the basic GAS concepts. There are more advanced concepts such as <strong>Stacking</strong> or <strong>Ability costs</strong>, but these are simply additional features to make your life easier. If you want to learn about them, take a look at the resources Section at the bottom of this article!</p>
    <h3 id="lyra-a-gas-multiplayer-official-example">Lyra: A GAS Multiplayer official example<a href="https://vorixo.github.io/devtricks/gas/#lyra-a-gas-multiplayer-official-example" target="_blank">Permalink</a></h3>
    <p id="nBE3">With the release of Unreal Engine 5.0 Epic released <a href="https://docs.unrealengine.com/5.0/en-US/lyra-sample-game-in-unreal-engine/" target="_blank">Lyra</a>, an official multiplayer feature-complete example that we can look at and learn good practices about GAS. Lyra is a modular sample project using techniques already explored in Fortnite. Learn more about it here:</p>
    <figure id="fitvid1" class="m_column">
      <iframe src="https://www.youtube.com/embed/Fj1zCsYydD8?autoplay=0&loop=0&mute=0"></iframe>
    </figure>
    <h2 id="the-cons-not-so-plug-and-play">The cons: Not so plug-and-play</h2>
    <p id="Otr4">Using GAS and creating abilities is easy. That’s clear. Then… what’s the problem?</p>
    <h3 id="the-setup">The setup</h3>
    <p id="DY49">Setting up GAS involves writing hundreds of boilerplate lines of code. Literally hundreds. The system is not really plug-and-play, although some Epic staff have recently commented that they would like to make the setup more user friendly so that people can start using the system without spending hours adding initialization code.</p>
    <p id="fD29">Also, multiplayer games require to do pretty specific setups to simply initialize GAS. For example some games might require adding the component in the PlayerState, while some others in the Character (see <em>Dave Ratti from Epic’s answer to <a href="https://epicgames.ent.box.com/s/m1egifkxv3he3u3xezb9hzbgroxyhx89" target="_blank">community questions #5</a></em>):</p>
    <ul id="A7W2">
      <li id="IUcw">Plan to add the ability system component in the player state?</li>
      <ul id="moFp">
        <li id="4rht">Be prepared to write hundreds of code in your avatar Actor to use it as a replication proxy if you don’t want to boost the net update frequency of the PlayerState.</li>
        <li id="YyM3">Understanding the difference between the Owner (actor which has the component) and the Avatar (actor which uses the component) of the Ability System Component is key.</li>
        <li id="EUD8">Network roles: Being autonomous proxy in the character doesn’t mean being autonomous proxy in the PlayerState. This can cause some confusion as some functions in the Ability System framework use the Owner’s role instead of the Avatar’s role (ie. Gameplay Effect application).</li>
      </ul>
      <li id="nENz">Plan to add the ability system component in the pawn?</li>
      <ul id="8AuK">
        <li id="JgCa">No biggie. This one is easy, you won’t have to worry much about networking stuff.</li>
        <li id="9Yg3">Non-persistent ASC unless you pool your pawns.</li>
      </ul>
    </ul>
    <h3 id="adding-attributes-and-abilities">Adding attributes and abilities</h3>
    <p id="ZXuJ">There is not an standardized way of adding attributes and abilities to your Actors. I’ve read around ways of doing it… but I feel we are missing a handbook of good practices coming from Epic themselves. Adding and initializing attributes and abilities can get pretty complicated in multiplayer games due to replication and possible data races.</p>
    <p id="LYWy">One example I found recently was <a href="https://vorixo.github.io/devtricks/gas-input/" target="_blank">binding an ability to an input action</a> using the <a href="https://docs.unrealengine.com/4.26/en-US/InteractiveExperiences/Input/EnhancedInput/" target="_blank">Enhanced Input</a> plugin. But really, most of the time you feel like you are work-arounding issues setting up the system to work.</p>
    <h2 id="but-once-its-setup">But once it’s setup…</h2>
    <p id="Y8p6">Once set up, the system is quite easy to use and intuitive. Game designers will love it! And scaling it up is quite easy.</p>
    <p id="IW0K">Like everything else, when it comes to code design, it is just a matter of learning the tools provided by the system and using them appropriately to solve different problems (see Dan’s <a href="https://github.com/tranek/GASDocumentation" target="_blank">GASDocumentation</a>):</p>
    <ul id="1mtl">
      <li id="GzJz">Creating new tasks</li>
      <li id="8Cg4">Damage Calculations</li>
      <li id="zmgd">Non-ability code that interacts with the system</li>
      <li id="H2K7">And so on…</li>
    </ul>
    <h1 id="relevant-resources">Relevant resources</h1>
    <p id="rtl2">Let’s now list some resources that helped me getting introduced to the Gameplay Ability System.</p>
    <h2 id="epic">Epic</h2>
    <ul id="0pYY">
      <li id="4uDe"><a href="https://docs.unrealengine.com/5.0/en-US/lyra-sample-game-in-unreal-engine/" target="_blank">Lyra Sample Game</a></li>
      <li id="6pGf"><a href="https://docs.unrealengine.com/5.0/en-US/ContentAndSamples/ValleyOfTheAncient/" target="_blank">Valley of the Ancient Sample</a></li>
      <li id="vZ21"><a href="https://docs.unrealengine.com/4.27/en-US/Resources/SampleGames/ARPG/" target="_blank">Action RPG Game</a></li>
    </ul>
    <h2 id="community">Community</h2>
    <ul id="2TVo">
      <li id="of9b">Dan’s <a href="https://github.com/tranek/GASShooter" target="_blank">GASShooter</a></li>
      <li id="UP6y">Dan’s <a href="https://github.com/tranek/GASDocumentation" target="_blank">GASDocumentation</a></li>
      <li id="ieZH">KaosSpectrum’s <a href="https://www.thegames.dev/" target="_blank">The Games Dev</a></li>
      <li id="jIbO"><a href="https://discord.gg/unreal-slackers" target="_blank">Slacker’s <strong>gameplay-ability-system</strong> channel</a>.</li>
    </ul>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/cont_anims</guid><link>https://teletype.in/@hardway/cont_anims?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/cont_anims?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Contextual Animation Plugin в многопользовательских играх (UE 5.3+)</title><pubDate>Fri, 03 May 2024 05:03:32 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/43/23/4323595e-aed2-418a-88ec-72e84c9ed4d0.png"></media:content><category>Анимация</category><description><![CDATA[<img src="https://img1.teletype.in/files/c4/18/c418a9d1-88a8-4227-bf6a-b12b03f8a84a.jpeg"></img>В Unreal Engine появилась система контекстной анимации, позволяющая создавать синхронизированные анимации для определенных действий, о которой мы впервые узнали из видеоролика-откровения Unreal Engine 5:]]></description><content:encoded><![CDATA[
  <section>
    <section>
      <h1 id="introduction">Введение</h1>
      <p id="jN2H">В Unreal Engine появилась система контекстной анимации, позволяющая создавать синхронизированные анимации для определенных действий, о которой мы впервые узнали из видеоролика-откровения Unreal Engine 5:</p>
      <figure id="uF16" class="m_column">
        <iframe src="https://www.youtube.com/embed/qC5KtatMcUw?autoplay=0&loop=0&mute=0&start=307"></iframe>
      </figure>
      <p id="ggbC">Эта система позволяет воспроизводить анимации, требующие определенной синхронизации, как в трансформации, так и во времени. Чтобы активировать эту функцию, откройте Edit и в окне Plugins включите Motion Warping и Contextual Animation.</p>
      <h1 id="how-to-setup-a-contextual-animation">Как настроить контекстную анимацию</h1>
      <p id="iTm1">Все актеры, входящие в состав контекстной анимации, должны иметь компонент ContextualAnimSceneActorComponent. Плагин обрабатывает выравнивание этих акторов с помощью Motion Warping. Поэтому только Актор, инициирующий взаимодействие и требующий синхронизации с назначенным преобразованием, должен быть оснащен MotionWarpingComponent.</p>
      <figure id="f6zS" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/actor-comps.jpg" width="556" />
      </figure>
      <h2 id="contextual-anim-scene">Контекстная анимационная сцена</h2>
      <p id="SLFy">После того как мы предоставили все необходимые компоненты нашим актерам, мы можем создать наш первый актив Contextual Anim Scene Asset. Для этого создайте актив Contextual Anim Scene (CAS) в браузере контента.</p>
      <figure id="SA8H" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/creating-cas.jpg" width="1099" />
      </figure>
      <p id="0GQE">Если мы откроем только что созданный актив, то обнаружим область просмотра, временную шкалу и ряд свойств, которые мы рассмотрим далее. Но сначала давайте сосредоточимся на активе Roles Asset.</p>
      <p id="0BQs">Этот актив данных определяет несколько ролей по имени в нашей контекстной анимации, как показано на рисунке ниже.</p>
      <figure id="YtuL" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/cad-roles.jpg" width="1254" />
      </figure>
      <p id="kxQa">Мы рекомендуем давать несколько обобщенные названия, поскольку эти активы предназначены для повторного использования в нескольких контекстных анимационных сценах. На изображении Interactor - это Актор, который начинает взаимодействие, а Target - это Актор, с которым мы взаимодействуем.</p>
      <p id="iepn">Затем в активе CAS мы назначаем только что созданный актив Roles Asset и для нашего примера задаем Target как Primary Role (актер, с которым мы хотим взаимодействовать). Затем добавьте в массив Override Preview Data столько записей, сколько участников в нашей контекстной анимации, определенной также с помощью Roles Asset.</p>
      <p id="EXix">В нашем случае у нас два участника, поэтому мы расширяем массив на два элемента следующим образом:</p>
      <figure id="6RuX" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/overridepreview.jpg" width="1057" />
      </figure>
      <p id="Wfko">В моем случае взаимодействие начинает женщина-манекен.</p>
      <p id="64p4">Примечание: Контекстные анимации можно использовать и для неанимированных актеров (например, сидящих на стуле), которые также должны быть частью вашего актива &quot;Роли&quot;.</p>
      <h2 id="animation-sequence-requirements-and-montages">Требования к анимационным последовательностям (и монтажу)</h2>
      <p id="1noR">После настройки актива CAS со всеми необходимыми свойствами мы готовы приступить к созданию анимационных дорожек. Но прежде чем начать, давайте рассмотрим требования к анимационным последовательностям, составляющим нашу анимационную дорожку.</p>
      <p id="eajP">Система контекстных анимаций использует motion warping для внутреннего искривления выбранных участников к определенному трансформированию. Это гарантирует, что анимация будет воспроизводиться в нужное время и в нужном положении, позволяя идеально синхронизировать анимацию во время игры, в соответствии с первоначальным видением анимационного программного обеспечения (Maya, Blender...).</p>
      <p id="fVxp">В нашем случае Interactor должен двигаться к Цели перед началом анимации захвата, для этого мы включим Root Motion в Animation Sequence в Montage нашего Interactor, а затем, добавим Motion Warping Anim Notify State на время, которое мы хотим, чтобы длилось искривление (чем короче, тем быстрее наш персонаж доберется до места назначения, чтобы воспроизвести контекстную анимацию).</p>
      <figure id="77XZ" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/montagewarping.jpg" width="787" />
      </figure>
      <p id="jDN2">Имя Warp Target Name будет использовано позже для определения преобразования синхронизации в активе CAS.</p>
      <p id="RkxD">Примечание: Посетите документацию motion warping, чтобы узнать больше об этой функции и всех переменных, которые вы найдете в Anim Notify State.</p>
      <p id="LSvW">В нашем случае монтаж Target не нуждается в дополнительной настройке. Однако, если анимация персонажа в CAS Asset подразумевает движение, Root Motion будет необходим для их монтажей, чтобы персонаж двигался вместе с движением Root Bone.</p>
      <p id="B5VP">Примечание: Каждая анимационная дорожка в активе CAS состоит из комбинации анимаций для всех наших участников.</p>
      <h2 id="creating-a-new-track">Создание новой дорожки</h2>
      <p id="dNRJ">Чтобы создать новую анимационную дорожку, нажмите на кнопку New AnimSet, расположенную в верхней части CAS Asset; откроется окно, в котором вы можете добавить монтаж для каждого участника (если применимо).</p>
      <figure id="A5Jx" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/newanimset.jpg" width="577" />
      </figure>
      <p id="3uW4">Вы также можете настроить поведение столкновений между участниками и логику их вложений. Например, в случае анимации захвата мы вставим монтаж нападающего в анимацию Interactor, а монтаж смерти - в анимацию Target.</p>
      <p id="U74n">После добавления монтажей вы можете щелкнуть на них в треке анимации, чтобы настроить дальнейшие параметры. Здесь мы найдем Mesh to scene, который позволит вам настроить трансформацию вашего актора для правильного воспроизведения синхронизированной анимации.</p>
      <figure id="i8CQ" class="m_custom">
        <img src="https://vorixo.github.io/devtricks//assets/images/per-post/contextual-anim/animsetparams.jpg" width="1639" />
      </figure>
      <p id="4crx">Если все сделать правильно, получится что-то вроде этого:</p>
      <figure id="WQqy" class="m_custom">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/takedown.gif" width="938" />
      </figure>
      <p id="Vhe8">Наше превью выглядит отлично! Но если мы хотим, чтобы это работало во время игры, нам нужно настроить искривление движения в нашем CAS Asset. Для этого добавьте новый член в массив Warp Point Definitions, затем в его свойствах напишите имя, которое вы написали в Warp Target Name в предыдущем разделе, используя Primary Actor (Target) в качестве Mode, и, наконец, нажмите на Update Warp Points. Это добавит точку искривления в нашем Целевом актере, которая заставит Motion Warping, настроенный в нашем монтаже, искривляться в его сторону.</p>
      <figure id="M1gB" class="m_custom">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/warping.jpg" width="2257" />
      </figure>
      <p id="WRvz">После этого мы можем добавить больше наборов AnimSets, если хотим добавить различные монтажи к этой контекстной анимации (например, различные анимации захвата), Критерии отбора обеспечат воспроизведение подходящего.</p>
      <figure id="BZg1" class="m_original">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/multipleanimsets.jpg" width="1109" />
      </figure>
      <h2 id="contextual-animation-selection-criteria">Критерии выбора контекстной анимации</h2>
      <p id="ZdnH">Как уже говорилось, в CAS может быть несколько наборов анимации, каждый из которых может содержать свой набор критериев отбора. В контекстных анимационных активах (CAS) критерии выбора устанавливают правила для определения того, какой набор анимации подходит.</p>
      <p id="FtLZ">Проще говоря, эти критерии выбора помогают выбрать подходящий AnimSet для работы. В начале выполнения анимационные наборы оцениваются в случайном порядке. Выбирается первый, удовлетворяющий всем критериям отбора. Если же ни один из них не удовлетворяет критериям, то не будет выбран ни один.</p>
      <h3 id="adding-a-selection-criteria">Добавление критериев выбора</h3>
      <p id="QVkl">Чтобы добавить критерии отбора, перейдите к Монтажу, добавленному в ваш CAS. В нем вы обнаружите массив &quot;Критерии отбора&quot;.</p>
      <figure id="WrWW" class="m_custom">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/selectioncriteria.jpg" width="1594" />
      </figure>
      <p id="AOmJ">В этот массив можно включить несколько критериев выбора, которые можно определить как с помощью C++, так и с помощью Blueprints. Плагин поставляется с несколькими:</p>
      <ul id="K1Jr">
        <li id="UUrv"><code>Contextual Anim Selection Criterion Cone</code>: Проверяет, находится ли цель внутри заданного пользователем Конуса. Если да, то критерий проходит.</li>
        <li id="nr4G"><code>Contextual Anim Selection Criterion Distance</code>: Проверяет, находится ли цель в пределах дистанции, может оцениваться в 3D или 2D.</li>
        <li id="mS2R"><code>Contextual Anim Selection Criterion Trigger Area</code>: Проверяет, находится ли цель в заданной пользователем 3D-области, если да, то критерий проходит.</li>
      </ul>
      <p id="SqhH">Некоторые из этих критериев сопровождаются визуализацией отладки.</p>
      <h1 id="how-to-play-a-contextual-animation-during-gameplay">Как воспроизвести контекстную анимацию во время игрового процесса</h1>
      <p id="Iniv">Воспроизвести контекстную анимацию в Blueprints и C++ очень просто, для этого нужно всего лишь 2 функции:</p>
      <figure id="bHVX" class="m_custom">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/callingcontextual.jpg" width="1485" />
      </figure>
      <p id="94xI">В приведенном примере я воспроизвожу контекстную анимацию внутри способности, инициированной атакующим, поэтому Primary будет жертвой, а Secondary - атакующим, как в CAS. После того как наши привязки настроены, мы можем запустить контекстную анимационную сцену.</p>
      <h2 id="extra-functionalities">Дополнительные функциональные возможности</h2>
      <p id="bSRM">Компонент Contextual Anim Scene Actor Component определяет ряд делегатов, которые мы можем использовать для реакции на различные события, происходящие во время набора анимации.</p>
      <figure id="NhIg" class="m_custom">
        <img src="https://vorixo.github.io/devtricks/assets/images/per-post/contextual-anim/delegatescontextual.jpg" width="915" />
      </figure>
      <p id="WP76">При желании контекстную анимацию можно вывести заблаговременно, вызвав EarlyOutContextualAnimScene из Contextual Anim Scene Actor Component.</p>
      <h2 id="multiplayer-details">Подробности мультиплеера</h2>
      <p id="OS0x">В контекстных анимациях реализована поддержка мультиплеера, так что вам не придется ни о чем беспокоиться, когда дело дойдет до того, чтобы заставить их работать в мультиплеере.</p>
      <p id="QVDx">На момент написания статьи контекстные анимации должны вызываться только с сервера или с автономного прокси (ROLE_AutonomousProxy), и они не поддерживают предсказание. Для примера, в примере Ability, приведенном выше, я запускаю Anim Scene только на Authority.</p>
      <p id="MnwA">Если вы все сделали правильно, то сможете делать много крутых вещей (благодаря Doğa):</p>
      <figure id="fitvid1" class="m_column">
        <iframe src="https://www.youtube.com/embed/kuv5OM3CiYw?autoplay=0&loop=0&mute=0"></iframe>
      </figure>
      <figure id="fitvid2" class="m_column">
        <iframe src="https://www.youtube.com/embed/r8DQkq6AOLk?autoplay=0&loop=0&mute=0"></iframe>
      </figure>
    </section>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/smartobjectsqs</guid><link>https://teletype.in/@hardway/smartobjectsqs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/smartobjectsqs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>(Исправить картинки) Smart Objects в Unreal Engine 5. Быстрый старт</title><pubDate>Wed, 01 May 2024 07:25:44 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/21/f4/21f4c046-b8e1-427a-bdd4-76271efe37b1.png"></media:content><category>Unreal engine 5</category><description><![CDATA[<img src="https://ue-cdn.artstation.com/imgproxy/_H5t3uUDGebWaZcQ99Y1UZeChNKEZnJl4nWLsDNyu9s/filename:SO-HeroImage.png/resizing_type:fill/width:1920/height:335/ext:jpg/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9kb2N1bWVudGF0aW9uL2ltYWdlcy81ZTA3NjI1OS1kNjY3LTQwNzktYjA0Ny1hOWVkOTNiNWEyZDQvc28taGVyb2ltYWdlLnBuZw"></img>В этом руководстве показано, как создавать и использовать смарт-объекты с агентом искусственного интеллекта.]]></description><content:encoded><![CDATA[
  <p id="gaMb">В этом руководстве показано, как создавать и использовать смарт-объекты с агентом искусственного интеллекта.</p>
  <figure id="BE0A" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/_H5t3uUDGebWaZcQ99Y1UZeChNKEZnJl4nWLsDNyu9s/filename:SO-HeroImage.png/resizing_type:fill/width:1920/height:335/ext:jpg/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9kb2N1bWVudGF0aW9uL2ltYWdlcy81ZTA3NjI1OS1kNjY3LTQwNzktYjA0Ny1hOWVkOTNiNWEyZDQvc28taGVyb2ltYWdlLnBuZw" width="1920" />
  </figure>
  <h2 id="overview">Обзор</h2>
  <p id="bIfw">Умные объекты - это объекты, размещенные на уровне, с которыми могут взаимодействовать агенты ИИ и игроки. Эти объекты содержат всю информацию, необходимую для взаимодействия.</p>
  <p id="q3SL">На высоком уровне Смарт-объекты представляют собой набор действий на Уровне, которые можно использовать с помощью системы резервирования. Эта система отслеживает все смарт-объекты на Уровне и позволяет агенту ИИ &quot;зарезервировать&quot; смарт-объект, чтобы другие агенты не могли его использовать до тех пор, пока он не станет снова доступен.</p>
  <h2 id="goals">Цели</h2>
  <p id="m5JW">В этом кратком руководстве вы узнаете, как создавать и использовать смарт-объекты с агентом искусственного интеллекта.</p>
  <h2 id="objectives">Задачи</h2>
  <ul id="iz8d">
    <li id="Q7m3">Создайте AI Gameplay Behavior и Behavior Definition, которые агент ИИ может использовать, когда достигает Smart Object.</li>
    <li id="dFrP">Создайте Smart Object, содержащий Behavior Definition для воспроизведения анимационного монтажа.</li>
    <li id="r4OL">Создайте простое поведение ИИ с помощью Behavior Tree и Behavior Tree Tasks.</li>
    <li id="SBgu">Создайте AI Agent, который может искать и использовать Smart Objects на уровне.</li>
  </ul>
  <h2 id="qpxD">1 - Необходимая настройка</h2>
  <p id="feZv">Создайте новый Blueprint проект на основе шаблона Third Person.</p>
  <p id="rHok">В главном меню перейдите к пункту Settings &gt; Plugins, чтобы открыть окно Plugins.<br /></p>
  <figure id="Xl2c" class="m_original">
    <img src="https://img3.teletype.in/files/e4/08/e4083ea5-a3bf-43a9-91e0-086a083ade29.png" width="305" />
  </figure>
  <p id="C2lR">Перейдите в раздел Gameplay  и включите плагины Smart Objects, AI Behaviors и Gameplay Behavior Smart Objects. При появлении запроса перезапустите редактор.<br /></p>
  <figure id="2uUS" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/31811d63-56b3-4410-b31e-c0d52ec86e4c/so-qs-plugins-2.png" width="680" />
  </figure>
  <figure id="8Z50" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/28ca8767-d31c-4d33-a6be-17fe806b6d89/so-qs-plugins-3.png" width="681" />
  </figure>
  <figure id="ncXG" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/5a7314ca-8d5d-4e6c-9d07-6dcadb908428/so-qs-plugins-4.png" width="800" />
  </figure>
  <h3 id="sectionresults">Результаты</h3>
  <p id="Zeg3">В этом разделе вы создали новый проект и включили плагины Smart Objects и AI Behaviors. Теперь вы готовы к созданию AI Gameplay Behavior для вашего AI Agent.</p>
  <h2 id="2-createtheaigameplaybehavior">2 - Создайте AI Gameplay Behavior</h2>
  <p id="dwui">В этом разделе вы создадите блупринты Gameplay Behavior и Gameplay Config, которые определят, что будет делать ваш агент, когда он достигнет слота Smart Object.</p>
  <ul id="xiCt">
    <li id="Sevu">В Content Browser щелкните правой кнопкой мыши и выберите Blueprint Class в разделе Create Basic Asset.</li>
  </ul>
  <figure id="bAPY" class="m_original">
    <img src="https://img4.teletype.in/files/78/8f/788febfe-d04a-4631-87a6-efe5e5e2535a.png" width="239" />
  </figure>
  <p id="rDTG">В окне Pick Parent Class раскройте раздел All Classes, затем найдите и выберите Gameplay Behavior. Нажмите Select  и назовите новый ассет BP_SO_Behavior_PlayMontage.<br /></p>
  <figure id="BRU6" class="m_original">
    <img src="https://img2.teletype.in/files/17/52/1752cbfb-1efe-4d53-85be-51f4b2577ba5.png" width="626" />
  </figure>
  <p id="ZDKc">Создайте новый класс Blueprint, затем найдите и выберите Gameplay Behavior Config. Нажмите Select  и назовите новый ассет BP_SO_BehaviorConfig.</p>
  <figure id="9F5i" class="m_original">
    <img src="https://img2.teletype.in/files/1f/2c/1f2cae4d-1667-4b6a-b574-f18fb915c067.png" width="626" />
  </figure>
  <p id="6knt">В Браузере контента дважды щелкните BP_SO_BehaviorConfig, чтобы открыть его. Перейдите на панель Details  и щелкните на раскрывающемся списке Behavior Class. Выберите BP_SO_Behavior_PlayMontage. Скомпилируйте и сохраните блупринт.</p>
  <figure id="Zm1W" class="m_original">
    <img src="https://img2.teletype.in/files/94/2a/942a1003-e417-4526-a7b0-a9bfa21190a7.png" width="453" />
  </figure>
  <p id="1Ymu">В Браузере контента дважды щелкните BP_SO_Behavior_PlayMontage, чтобы открыть его. Щелкните на раскрывающемся списке Override  рядом с Functions  и выберите OnTriggeredCharacter.</p>
  <figure id="mRJh" class="m_original">
    <img src="https://img3.teletype.in/files/a5/50/a5508488-514a-4cf3-90ee-d4ec45740a9d.png" width="576" />
  </figure>
  <p id="psiI">Щелкните правой кнопкой мыши на Avatar узла Event OnTriggeredCharacter и выберите Promote to Variable.</p>
  <figure id="34ed" class="m_original">
    <img src="https://img4.teletype.in/files/be/26/be2694af-9f1f-4885-ba03-4100cb11ca60.png" width="406" />
  </figure>
  <p id="9hvp">Перетащите переменную Avatar  в Event Graph и выберите Get Avatar. Перетащите из узла Avatar, затем найдите и выберите Get Component by Class.</p>
  <figure id="usAF" class="m_original">
    <img src="https://img2.teletype.in/files/9a/01/9a01fe4b-ed9b-4132-bc31-c2a859637c8c.png" width="556" />
  </figure>
  <p id="Qaws">Нажмите на выпадающий список Component Class, затем найдите и выберите Skeletal Mesh Component.</p>
  <figure id="X7K4" class="m_original">
    <img src="https://img3.teletype.in/files/66/5c/665c4d81-f5cf-46c2-b514-03ad276c5cc9.png" width="475" />
  </figure>
  <p id="V4iC">Щелкните правой кнопкой мыши на графике событий Event Graph, затем найдите и выберите Play Montage.</p>
  <p id="p5le">Подключите вывод Return Value узла Get Component by Class к выводу In Skeletal Mesh Component узла Play Montage.</p>
  <p id="pVBg">Подключите узел Set Avatar к узлу Play Montage.</p>
  <figure id="XqmP" class="m_original">
    <img src="https://img4.teletype.in/files/f8/16/f816080d-36ab-4a04-bc1d-6066f8d78434.png" width="417" />
  </figure>
  <figure id="INQr" class="m_original">
    <img src="https://img4.teletype.in/files/b1/70/b170ca20-e823-4ae8-9934-b8eb6260b1d0.png" width="1149" />
  </figure>
  <p id="hdrk">Щелкните раскрывающийся список Montage to Play на узле Play Montage. Выберите анимационный монтаж из списка.</p>
  <blockquote id="WL6T">Если у вас нет анимации, вы можете получить бесплатные пакеты анимационных ассетов в Unreal Engine Marketplace, например Animation Starter pack. Вы также можете преобразовать любую анимационную последовательность в анимационный монтаж, щелкнув ее правой кнопкой мыши и выбрав Create &gt; Create AnimMontage.</blockquote>
  <figure id="M2Ga" class="m_original">
    <img src="https://img1.teletype.in/files/4f/4b/4f4b6775-406f-4fcd-bb7c-feea705cb32c.png" width="363" />
  </figure>
  <p id="73gl">Перетащите переменную Avatar  в Event Graph и выберите Get Avatar. Перетащите из узла Avatar , затем найдите и выберите End Behavior.</p>
  <figure id="L4yz" class="m_original">
    <img src="https://img3.teletype.in/files/ed/8b/ed8baf59-8fa4-4784-9d04-608e20dd722f.png" width="572" />
  </figure>
  <p id="IV5I">Подключите контакты On Completed и On Interrupted от узла Play Montage к узлу End Behavior.</p>
  <figure id="raYj" class="m_original">
    <img src="https://img4.teletype.in/files/fd/b7/fdb7d065-2c1b-4864-87e6-4afcd6dd66c1.png" width="733" />
  </figure>
  <p id="COD6">Скомпилируйте и сохраните блупринт.</p>
  <blockquote id="XCEa">В этом примере используется узел Play Montage, а не узел Play Anim Montage, чтобы использовать контакты On Completed и On Interrupted для завершения поведения. Это гарантирует, что смарт-объект останется занятым до окончания воспроизведения анимации.</blockquote>
  <h3 id="sectionresults-2">Результаты секции</h3>
  <p id="2fs3">В этом разделе вы создали чертежи Gameplay Behavior и Gameplay Config Blueprints, которые агент будет использовать для воспроизведения анимационного монтажа, когда достигнет слота смарт-объекта. Теперь вы можете создать определение поведения, которое будет использоваться смарт-объектом.</p>
  <h2 id="3-createthesmartobjectdefinitiondataasset">3 - Создание ассета данных Smart Object Definition</h2>
  <p id="LLvn">В этом разделе вы создадите ассет данных SmartObject Definition, который будет определять поведение каждого слота смарт-объекта.</p>
  <ul id="nqpL">
    <li id="sM9p">В Браузере контента щелкните правой кнопкой мыши и выберите Miscellaneous &gt; Data Asset.</li>
  </ul>
  <ol id="qhvu">
    <ol id="vCaT">
      <li id="vnZO">В окне Pick Class for Data Asset Instance найдите и выберите Smart Object Definition.</li>
      <li id="4h5w">Нажмите Select , чтобы создать ассет, и назовите его SO_Definition_PlayMontage.</li>
    </ol>
  </ol>
  <figure id="K95c" class="m_original">
    <img src="https://img1.teletype.in/files/00/87/00870569-19cf-48d9-886a-4c8f91412ecd.png" width="514" />
  </figure>
  <figure id="muhN" class="m_original">
    <img src="https://img4.teletype.in/files/35/ba/35bac795-a9a7-41fc-8ec2-6f8ee217a5ec.png" width="626" />
  </figure>
  <p id="c3kl">В Браузере контента дважды щелкните SO_Definition_PlayMontage, чтобы открыть его. Прокрутите страницу вниз до раздела Smart Object и нажмите кнопку Add (+) рядом с Slots, чтобы добавить новый слот. Это слот, который будет использоваться агентом ИИ при выполнении поведения.</p>
  <figure id="ljVd" class="m_original">
    <img src="https://img4.teletype.in/files/74/6c/746c8be1-d7c9-4372-a176-b740c3d8b9fb.png" width="676" />
  </figure>
  <p id="IfRH">Нажмите кнопку Add (+) рядом с Default Behavior Definitions и выберите Gameplay Behavior Smart Object Behavior Definition для Index 0. Щелкните на раскрывающемся списке Gameplay Behavior Config и выберите BP_SO_BehaviorConfig.</p>
  <figure id="kfav" class="m_original">
    <img src="https://img1.teletype.in/files/41/3b/413b7bc3-85af-47a0-9b59-cc7fe9aa07d1.png" width="592" />
  </figure>
  <p id="YF40">Сохраните и закройте блупринт.</p>
  <h3 id="sectionresults-3">Результаты секции</h3>
  <p id="nbEm">В этом разделе вы создали актив данных SmartObject Definition, который определяет каждый слот смарт-объекта и его поведение по умолчанию.</p>
  <h2 id="4-createasmartobject">4 - Создание смарт-объекта</h2>
  <p id="KM97">В этом разделе вы создадите смарт-объект, который может быть найден и использован агентом на уровне.</p>
  <ul id="zFwg">
    <li id="2GqM">В Content Browser щелкните правой кнопкой мыши и выберите Blueprint Class в разделе Create Basic Asset.</li>
  </ul>
  <figure id="3pc2" class="m_custom">
    <img src="https://img4.teletype.in/files/78/8f/788febfe-d04a-4631-87a6-efe5e5e2535a.png" width="239" />
  </figure>
  <ul id="efAN">
    <li id="tmGQ">В окне Pick Parent Class нажмите кнопку Actor class, чтобы создать актив. Назовите новый актив BP_SO_RunBT.</li>
  </ul>
  <figure id="Oisy" class="m_custom">
    <img src="https://img3.teletype.in/files/a7/cd/a7cd74a3-9bc5-49b4-9aca-1f060415bb59.png" width="626" />
  </figure>
  <ul id="42wU">
    <li id="1df5">В Браузере контента дважды щелкните BP_SO_RunBT, чтобы открыть его. Перейдите в окно Компоненты  и нажмите кнопку + Добавить . Найдите и выберите Smart Object.</li>
  </ul>
  <figure id="tGef" class="m_custom">
    <img src="https://img4.teletype.in/files/ff/f1/fff139f0-bd7f-456a-bb17-48a3d8932416.png" width="261" />
  </figure>
  <ul id="SoN7">
    <li id="j7Ux">Выбрав компонент SmartObject , перейдите на панель Details  и прокрутите вниз до раздела Smart Object. Щелкните на раскрывающемся списке Definition Asset  и выберите SO_Definition_PlayMontage.</li>
  </ul>
  <figure id="pJva" class="m_custom">
    <img src="https://img3.teletype.in/files/66/eb/66ebfbb2-2ed2-45a3-a28c-f8ca0d57ec2f.png" width="438" />
  </figure>
  <ul id="QFBH">
    <li id="dXG5">Скомпилируйте и сохраните блупринт.</li>
  </ul>
  <h3 id="sectionresults-4">Результаты секции</h3>
  <p id="cB1n">В этом разделе вы создали смарт-объект и добавили определение поведения, определяющее поведение его слота по умолчанию.</p>
  <h2 id="5-createthebehaviortreefortheaiagent">5 - Создание дерева поведения для агента искусственного интеллекта</h2>
  <p id="bNbu">В этом разделе вы создадите необходимое поведение для агента ИИ, чтобы он мог искать и использовать смарт-объекты на уровне. Для этого вы будете использовать простое дерево поведения и две пользовательские задачи дерева поведения.</p>
  <h3 id="createthebehaviortreeandblackboard">Создайте дерево поведения и черную доску</h3>
  <ul id="rjif">
    <li id="q0y0">В Браузере контента щелкните правой кнопкой мыши и выберите AI &gt; Blackboard. Назовите Blackboard BB_SO_Agent.</li>
  </ul>
  <figure id="YvjS" class="m_custom">
    <img src="https://img4.teletype.in/files/b6/64/b6646146-cfa2-4b54-b2b8-a1ff9dae4685.png" width="430" />
  </figure>
  <ul id="iCUF">
    <li id="pmWw">Дважды щелкните BB_SO_Agent , чтобы открыть его. Щелкните раскрывающийся список Новый ключ и выберите SO Claim Handle. Назовите ключ ClaimHandle. Сохраните и закройте Blackboard.</li>
  </ul>
  <figure id="eH5j" class="m_custom">
    <img src="https://img1.teletype.in/files/cc/83/cc8354d7-914c-4095-a9ac-1e3de73398c8.png" width="209" />
  </figure>
  <ul id="QFNU">
    <li id="miA1">В Браузере контента щелкните правой кнопкой мыши и выберите AI &gt; Behavior Tree. Назовите дерево поведения BT_SO_Agent.</li>
  </ul>
  <figure id="SZZl" class="m_original">
    <img src="https://img2.teletype.in/files/96/06/96069f95-d333-4a1e-a1c5-a76e9f6c0c03.png" width="436" />
  </figure>
  <h3 id="createthebehaviortreetasks">Создание задач дерева поведения</h3>
  <p id="JGYR">Поиск смарт-объектов</p>
  <ul id="xJif">
    <li id="vqp6">В Content Browser щелкните правой кнопкой мыши и выберите Blueprint Class в разделе Create Basic Asset.</li>
  </ul>
  <figure id="4nWq" class="m_custom">
    <img src="https://img4.teletype.in/files/78/8f/788febfe-d04a-4631-87a6-efe5e5e2535a.png" width="239" />
  </figure>
  <ul id="MMMO">
    <li id="W4wl">В разделе All Classes найдите и выберите BT Task Blueprint Base, затем нажмите Select. Назовите блюпринт BTT_FindSmartObject.</li>
  </ul>
  <figure id="uV1q" class="m_custom">
    <img src="https://img2.teletype.in/files/1a/ef/1aef851b-13ad-4260-811d-e4f60edcb198.png" width="626" />
  </figure>
  <ul id="zN2Y">
    <li id="vVAM">В Браузере контента щелкните правой кнопкой мыши BTT_FindSmartObject  и выберите Duplicate. Назовите новый чертеж BTT_UseSmartObject.</li>
  </ul>
  <figure id="wVn4" class="m_custom">
    <img src="https://img4.teletype.in/files/74/00/7400748b-f952-4330-ad5c-d320ad6bda48.png" width="239" />
  </figure>
  <ul id="rFCy">
    <li id="e6zq">В Браузере контента дважды щелкните BTT_FindSmartObject , чтобы открыть его. В Графе событий щелкните правой кнопкой мыши, затем найдите и выберите Событие Получение Выполнение ИИ.</li>
  </ul>
  <figure id="4u2n" class="m_custom">
    <img src="https://img1.teletype.in/files/83/dd/83dd86f6-97b8-4945-8c1d-dfe7978118e4.png" width="410" />
  </figure>
  <ul id="FNim">
    <li id="4gKU">Перетащите с выводов Owner Controller узла Event Receive Execute AI, затем найдите и выберите Get Blackboard.</li>
  </ul>
  <figure id="9MPk" class="m_original">
    <img src="https://img4.teletype.in/files/73/b7/73b7281a-4ffc-4ff0-9908-94be5c92faa6.png" width="649" />
  </figure>
  <figure id="vdpf" class="m_original">
    <img src="https://img1.teletype.in/files/89/db/89db5c02-7fa5-46ec-ad66-24452ef682d6.png" width="640" />
  </figure>
  <p id="dGMH">Щелкните правой кнопкой мыши на значке Return Value узла Get Blackboard и выберите Promote to Variable. Назовите переменную Blackboard.</p>
  <p id="IcdH">Подключите узел Event Receive Execute AI к узлу Set Blackboard.</p>
  <p id="fR2m">Перетащите Pawn с Controlled Pawn узла Event Receive Execute AI, затем найдите и выберите Get Actor Location.</p>
  <p id="NJbx">Перетащите из узла Return Value узла Get Actor Location, затем найдите и выберите Subtract.</p>
  <p id="AUcn">Перетащите из узла Return Value узла Get Actor Location, затем найдите и выберите Add.</p>
  <p id="8C2w">Установите значения X, Y и Z обоих узлов на 2000. Это создает поле поиска размером 4000 x 4000 единиц, или 40 x 40 метров вокруг агента</p>
  <figure id="AQFN" class="m_original">
    <img src="https://img4.teletype.in/files/b9/e9/b9e9e4b8-4617-4d97-95e3-bd4d25e06653.png" width="664" />
  </figure>
  <figure id="rOWX" class="m_original">
    <img src="https://img1.teletype.in/files/4f/52/4f52b638-ba3d-4f6f-acde-1bdc48a003b7.png" width="564" />
  </figure>
  <ul id="FAUN">
    <li id="OtPa">На графике событий Event Graph щелкните правой кнопкой мыши, затем найдите и выберите Make Box.</li>
    <li id="FT6u">Подключите узел Subtract  к контакту Min  узла Make Box.</li>
    <li id="hEmD">Подключите узел Add  к контакту Max  узла Make Box.</li>
  </ul>
  <figure id="0Ef2" class="m_custom">
    <img src="https://img2.teletype.in/files/9b/f1/9bf1c21c-f18e-4028-837e-369be2ac028d.png" width="410" />
  </figure>
  <figure id="gGG5" class="m_custom">
    <img src="https://img3.teletype.in/files/2d/87/2d872068-1cc5-4156-a321-cc71a05d35ec.png" width="777" />
  </figure>
  <ul id="Nig7">
    <li id="AvZF">В Event Graph щелкните правой кнопкой мыши, затем найдите и выберите Get Smart Object Subsystem.</li>
    <li id="OI4r">Перетащите из узла Подсистема смарт-объектов, затем найдите и выберите Найти смарт-объекты.</li>
    <li id="1Tpy">Перетащите мышью Request  из узла Find Smart Objects и выберите Make SmartObjectRequest.</li>
  </ul>
  <figure id="Xbsa" class="m_custom">
    <img src="https://img4.teletype.in/files/bc/bf/bcbf8897-5a53-482b-b8a1-1d2447f71d21.png" width="663" />
  </figure>
  <figure id="I2xy" class="m_custom">
    <img src="https://img3.teletype.in/files/2f/d6/2fd62dd3-c07c-4261-8769-98e01baeb9ea.png" width="410" />
  </figure>
  <ul id="8Spp">
    <li id="gldo">Подключите вывод Return Value узла Make Box к выводу Query Box узла Make SmartObjectRequest.</li>
    <li id="LeH3">Перетащите с Filter pin узла Make SmartObjectRequest и выберите Make SmartObjectRequestFilter.</li>
    <li id="fbHa">Перетащите из области Behavior Definition Classes, найдите и выберите Make Array.</li>
    <li id="H4DS">Щелкните на выпадающем списке узла Make Array и выберите GameplayBehaviorSmartObjectBehaviorDefinition.</li>
    <li id="o4Kj">Подключите узел Set Blackboard  к узлу Find Smart Objects.</li>
  </ul>
  <figure id="84lh" class="m_custom">
    <img src="https://img2.teletype.in/files/55/2c/552c6e9e-ca41-4387-ad9b-5d8c9ee90528.png" width="778" />
  </figure>
  <figure id="YnGu" class="m_custom">
    <img src="https://img4.teletype.in/files/fb/d4/fbd4f2b8-91ea-4231-a5ac-cf19a5abc5d7.png" width="707" />
  </figure>
  <ul id="5Oc6">
    <li id="PKAh">Вот как выглядит проект на данный момент.</li>
  </ul>
  <figure id="ycSL" class="m_original">
    <img src="https://img4.teletype.in/files/ff/e4/ffe4f408-4203-4a97-a927-3d4ae27c1c35.png" width="1447" />
  </figure>
  <ul id="eVoW">
    <li id="ycnB">Щелкните правой кнопкой мыши вывод Out Results узла Find Smart Objects и выберите Promote to Variable. Подключите узел Out Results  к узлу Blackboard.</li>
    <li id="53oc">Перетащите булавку из узла Результаты, затем найдите и выберите Из валидного индекса.</li>
    <li id="XShq">Перетащите из узла Is Valid Index, затем найдите и выберите Branch. Подключите узел Out Results к узлу Branch .</li>
  </ul>
  <figure id="04T5" class="m_custom">
    <img src="https://img3.teletype.in/files/eb/b3/ebb306f0-ca90-4050-b287-762ed4a0b9e0.png" width="476" />
  </figure>
  <figure id="SVss" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/b3dcc0de-5184-4064-9976-912fef329f8b/so-qs-createbt-20.png" width="596" />
  </figure>
  <figure id="JI8e" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/ef9cf066-c09e-4c86-ba6f-88296cecb4fc/so-qs-createbt-21.png" width="930" />
  </figure>
  <ul id="NDNX">
    <li id="4HIu">Перетащите из False концентратор узла Branch , затем найдите и выберите Finish Execute. Результаты Выхода будут недействительными, если ни один из близлежащих смарт-объектов не соответствует критериям поиска.</li>
  </ul>
  <figure id="n7eK" class="m_custom">
    <img src="https://img1.teletype.in/files/c5/0f/c50fdac6-fe01-43bd-966e-148f66822c6e.png" width="513" />
  </figure>
  <ul id="c8Oc">
    <li id="RHpQ">Создайте узел Smart Object Subsystem в Event Graph. Перетащите объект из узла, затем найдите и выберите Claim.</li>
    <li id="V5HJ">Подключите контакт True  узла Branch  к узлу Claim .</li>
  </ul>
  <figure id="BZeZ" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/ef880fb9-17eb-4ed8-a55d-78913e244f20/so-qs-createbt-23.png" width="646" />
  </figure>
  <figure id="muIi" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/9f2e3a6a-f557-4e5a-814e-cc11001df721/so-qs-createbt-24.png" width="576" />
  </figure>
  <figure id="wbFv" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/d88b6365-8cf5-42fc-85a8-e9e73c7951f1/so-qs-createbt-25.png" width="949" />
  </figure>
  <ul id="y287">
    <li id="TFhX">Перетащите переменную Out Results в Event Graph и выберите Get Out Results. Перетащите переменную из узла, затем найдите и выберите Random Array Item.</li>
    <li id="gi6J">Перетащите из узла Random  и подключите его к выводу Request Results узла Claim .</li>
    <li id="4Y2O">Щелкните правой кнопкой мыши на выводе Return Value узла Claim  и выберите Promote to Variable. Назовите переменную ClaimHandle.</li>
    <li id="ixWS">Перетащите из узла Claim Handle, затем найдите и выберите Is Valid Smart Object Claim Handle.</li>
    <li id="10tD">Перетащите из Возвращаемое значение узла Is Valid Smart Object Claim Handle, затем найдите и выберите Branch.</li>
  </ul>
  <figure id="06jF" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/5b954349-ba30-4cd7-be72-2f4a8aced6e9/so-qs-createbt-26.png" width="458" />
  </figure>
  <figure id="ySnR" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/2f450d27-1321-43d7-8cdc-4f6948d2a0e9/so-qs-createbt-27.png" width="611" />
  </figure>
  <figure id="M1OR" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/dbdd3fcf-5c4c-42e4-8d5f-0060a98532c6/so-qs-createbt-28.png" width="948" />
  </figure>
  <ul id="wM2I">
    <li id="iBkf">Перетащите из False концентратор узла Branch , затем найдите и выберите Finish Execute.</li>
  </ul>
  <figure id="btbo" class="m_custom">
    <img src="https://img1.teletype.in/files/c5/0f/c50fdac6-fe01-43bd-966e-148f66822c6e.png" width="513" />
  </figure>
  <ul id="t9Of">
    <li id="Qbyl">Перетащите переменную Blackboard  в Event Graph и выберите Get Blackboard.</li>
    <li id="7m0E">Перетащите из узла Blackboard , затем найдите и выберите Set Value as SOClaim Handle.</li>
    <li id="Kw84">Подключите контакт True  узла Branch  к узлу Set Value as SOClaim Handle.</li>
    <li id="Exrj">Щелкните правой кнопкой мыши на значке Имя ключа узла Set Value as SOClaim Handle и выберите Promote to Variable.</li>
    <li id="D49B">Выбрав переменную Key Name, перейдите на панель Details  и установите флажок Instance Editable. Установите Значение по умолчанию на ClaimHandle.</li>
  </ul>
  <p id="D49B"></p>
  <figure id="wx17" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/cfc76d26-964d-4a53-9073-58f4bc097f0f/so-qs-createbt-29.png" width="563" />
  </figure>
  <figure id="o0Db" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/1b32ee61-2ce4-4222-9abe-29a2266af4ae/so-qs-createbt-30.png" width="399" />
  </figure>
  <figure id="iZ1l" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/631edb6f-f619-4696-8a3b-799928493f8f/so-qs-createbt-31.png" width="396" />
  </figure>
  <ul id="etaV">
    <li id="x2nC">Перетащите переменную ClaimHandle  и подключите ее к контакту Value  узла Set Value as SOClaim Handle.</li>
  </ul>
  <figure id="evfE" class="m_custom">
    <img src="https://img4.teletype.in/files/39/35/3935822b-9c93-4515-8670-5605faf1f40a.png" width="396" />
  </figure>
  <ul id="ajZT">
    <li id="raPN">Перетащите из узла Set Value as SOClaim Handle, затем найдите и выберите Finish Execute. Включите флажок Success  на узле.</li>
  </ul>
  <figure id="FFsB" class="m_custom">
    <img src="https://img1.teletype.in/files/8f/7c/8f7cfff0-56c7-4c2c-b9bd-799b89e62417.png" width="671" />
  </figure>
  <ul id="eIrI">
    <li id="E3it">Скомпилируйте и сохраните чертеж.</li>
  </ul>
  <p id="GwFr">Используйте смарт-объект</p>
  <ul id="DT7L">
    <li id="2UvH">В Браузере контента дважды щелкните BTT_UseSmartObject , чтобы открыть его. В Графе событий щелкните правой кнопкой мыши и найдите, а затем выберите Событие Получение Выполнить ИИ.</li>
  </ul>
  <figure id="xpKa" class="m_custom">
    <img src="https://img1.teletype.in/files/83/dd/83dd86f6-97b8-4945-8c1d-dfe7978118e4.png" width="410" />
  </figure>
  <ul id="22P6">
    <li id="Kg6k">Перетащите с выводов Owner Controller узла Event Receive Execute AI, затем найдите и выберите Get Blackboard.</li>
  </ul>
  <figure id="ova4" class="m_custom">
    <img src="https://img1.teletype.in/files/86/ef/86ef7d68-6c06-4b4a-9527-8adab89d29df.png" width="458" />
  </figure>
  <ul id="fybs">
    <li id="wORY">Перетащите из узла Return Value в узел Get Blackboard, затем найдите и выберите Get Value as SOClaim Handle.</li>
  </ul>
  <figure id="ydmF" class="m_custom">
    <img src="https://img4.teletype.in/files/7a/09/7a09fe93-06a1-4bfe-ba4f-52efa4e0679e.png" width="767" />
  </figure>
  <ul id="4hrG">
    <li id="FTCo">Щелкните правой кнопкой мыши на значке Имя ключа узла Получить значение как SOClaim Handle и выберите Передать в переменную.</li>
    <li id="YB9U">Выбрав переменную Key Name, перейдите на панель Details  и установите флажок Instance Editable. Установите Значение по умолчанию на ClaimHandle.</li>
  </ul>
  <figure id="lPiy" class="m_custom">
    <img src="https://img2.teletype.in/files/5e/5f/5e5f57cc-eaa6-4b82-b545-eb8459f13741.png" width="396" />
  </figure>
  <ul id="NrSr">
    <li id="AnBg">Перетащите из узла Return Value в узел Get Value as SOClaim Handle, затем найдите и выберите Use Claimed Gameplay Behavior Smart Object.</li>
  </ul>
  <ol id="EFMz">
    <ol id="UXNi">
      <li id="H1OU">Подключите узел Get Value as SOClaim Handle к узлу Use Claimed Smart Object.</li>
      <li id="T6Sm">Перетащите с Owner Controller узла Event Receive Execute AI и подключите его к контакту Controller  узла Use Claimed Smart Object.</li>
    </ol>
  </ol>
  <figure id="YuU8" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/278b9bd0-e515-4a25-a7b3-a726ca4766b6/so-qs-createbt-36.png" width="723" />
  </figure>
  <figure id="JN3M" class="m_original">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/12de93ca-8d12-4379-99b2-1e8b6d17106c/so-qs-createbt-37.png" width="1212" />
  </figure>
  <ul id="hMuY">
    <li id="qvyS">Перетащите с On Succeeded узел Use Claimed Smart Object, затем найдите и выберите Finish Execute. Включите флажок Sucess на узле.</li>
  </ul>
  <figure id="WnHD" class="m_custom">
    <img src="https://img1.teletype.in/files/05/f0/05f0cc05-42a8-4729-8df7-bdd2011f8e66.png" width="629" />
  </figure>
  <ul id="ncFL">
    <li id="wgKW">Скомпилируйте и сохраните чертеж.</li>
  </ul>
  <p id="eSY5">Создайте дерево поведения</p>
  <ul id="FiLS">
    <li id="nD4B">В Браузере контента дважды щелкните BT_SO_Agent , чтобы открыть его. Перетащите из узла Root  и выберите Selector.</li>
  </ul>
  <figure id="AwuB" class="m_custom">
    <img src="https://img1.teletype.in/files/c0/df/c0df12f3-d0ff-4246-a204-087799a8c02e.png" width="466" />
  </figure>
  <ul id="CUuz">
    <li id="EYBR">Перетащите из узла Selector  и выберите Sequence.</li>
  </ul>
  <ol id="owey">
    <ol id="NuH7">
      <li id="arxy">Перетащите узел Selector и выберите Wait. Этот узел заставит агента подождать 5 секунд перед поиском нового смарт-объекта, если первоначальный поиск не увенчался успехом.</li>
      <li id="gbXq">Убедитесь, что узел Sequence  находится слева от узла Wait . Это гарантирует, что последовательность будет выполнена первой в дереве поведения.</li>
    </ol>
  </ol>
  <figure id="2G0X" class="m_custom">
    <img src="https://img2.teletype.in/files/11/33/11335260-5cc3-489f-ae04-5deb4a3caa57.png" width="312" />
  </figure>
  <ul id="QMMK">
    <li id="ZLHN">Перетащите из узла Sequence  и выберите BTT_FindSmartObjects.</li>
  </ul>
  <figure id="9ZrN" class="m_custom">
    <img src="https://img1.teletype.in/files/cc/de/ccde3d95-04c9-459c-bf3b-ee4228a0aeae.png" width="420" />
  </figure>
  <ul id="jHEE">
    <li id="4CaU">Перетащите из узла Sequence  и выберите BTT_UseSmartObjects.</li>
  </ul>
  <figure id="UPcs" class="m_custom">
    <img src="https://img4.teletype.in/files/b8/9a/b89a8f20-0753-4f25-ba07-607d1e6e4a8b.png" width="613" />
  </figure>
  <ul id="VMRI">
    <li id="KoXs">Перетащите из узла Sequence  и выберите Wait. Выбрав узел, установите Время ожидания на 2,0 и Случайное отклонение на 0,5. В этом узле агент будет ждать от 1,5 до 2,5 секунд, прежде чем искать новый смарт-объект.</li>
  </ul>
  <figure id="abnt" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/35ea8c39-ee6e-4385-af9b-1b63930bf6d9/so-qs-createbt-43.png" width="344" />
  </figure>
  <figure id="S6Vm" class="m_custom">
    <img src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/297fd29f-d0fb-422f-a322-02a973e17711/so-qs-createbt-44.png" width="677" />
  </figure>
  <ul id="FPlv">
    <li id="tlRW">Сохраните и закройте дерево поведения.</li>
  </ul>
  <p id="ByzE">Результаты секции</p>
  <p id="7j37">В этом разделе вы создали дерево поведения и задачи дерева поведения, которые позволяют агенту находить и использовать смарт-объекты на уровне.</p>
  <h2 id="6-createtheaiagent">6 - Создание агента искусственного интеллекта</h2>
  <p id="g9AE">В этом разделе вы создадите агента ИИ, который будет искать смарт-объекты на уровне.</p>
  <ul id="jKJf">
    <li id="Sc4Q">В Браузере контента дважды щелкните на BP_ThirdPersonCharacter Blueprint, чтобы открыть его.</li>
  </ul>
  <figure id="a9VG" class="m_custom">
    <img src="https://img3.teletype.in/files/e4/3c/e43c117d-b9bc-40f3-8d0a-d566aed4ea13.png" width="117" />
  </figure>
  <ul id="gItO">
    <li id="7iaR">Выберите все узлы в Event Graph и удалите их. Щелкните правой кнопкой мыши на Event Graph, затем найдите и выберите <strong>Event Possessed</strong></li>
  </ul>
  <figure id="pbsN" class="m_custom">
    <img src="https://img3.teletype.in/files/ea/d0/ead0e1ef-08a3-44ad-84a7-9bbeaed0cf93.png" width="410" />
  </figure>
  <ul id="p574">
    <li id="mKOH">Перетащите со вывода New Controller узел Event Possessed, затем найдите и выберите Cast to AI Controller. Подключите узел Event Possessed к узлу Cast to AIController.</li>
  </ul>
  <figure id="7DAa" class="m_custom">
    <img src="https://img2.teletype.in/files/50/73/50736358-fa83-43f2-9c4c-2b7212cd64b8.png" width="599" />
  </figure>
  <ul id="baGs">
    <li id="qUHG">Перетащите из выводов As AIController узла Cast to AIController, затем найдите и выберите Run Behavior Tree. Щелкните раскрывающийся список BTAsset  и выберите BT_SO_Agent.</li>
  </ul>
  <figure id="84h0" class="m_custom">
    <img src="https://img1.teletype.in/files/06/18/06188a67-0025-436a-800c-d01bccc8f116.png" width="747" />
  </figure>
  <ul id="HC9O">
    <li id="PzF6">Скомпилируйте и сохраните блупринт.</li>
  </ul>
  <p id="kSSA">Результаты секции</p>
  <p id="pNEw">В этом разделе вы создали чертеж AI Agent, который будет искать смарт-объекты на уровне. Вы также изменили чертеж анимации, чтобы убедиться, что анимационный монтаж может воспроизводиться правильно.</p>
  <h2 id="7-testthesmartobjects">7 - Проверка смарт-объектов</h2>
  <p id="mie6">Теперь вы протестируете агента, чтобы убедиться, что он может найти и использовать смарт-объекты на уровне.</p>
  <ul id="JUmf">
    <li id="RYf2">На главной панели инструментов нажмите Add Content (+) &gt; Volumes &gt; NavMeshBoundsVolume, чтобы добавить новый Navigation Mesh актор на ваш уровень. Масштабируйте сетку так, чтобы она покрывала ваш уровень, и агент мог перемещаться к месту назначения.</li>
  </ul>
  <figure id="hHYn" class="m_custom">
    <img src="https://img4.teletype.in/files/34/c4/34c46bfe-9958-4599-af67-f9b9dbbb7d39.png" width="571" />
  </figure>
  <ul id="oEvb">
    <li id="REap">Перетащите несколько BP_SO_RunBT Blueprints на свой уровень.</li>
  </ul>
  <figure id="nOvV" class="m_custom">
    <img src="https://img2.teletype.in/files/99/85/9985c3c7-ac5c-4d58-8c55-3324bdce1bf3.png" width="787" />
  </figure>
  <ul id="gM2w">
    <li id="TCwU">Перетащите ThirdPersonCharacter Blueprint на свой уровень.</li>
  </ul>
  <figure id="cOtQ" class="m_custom">
    <img src="https://img2.teletype.in/files/13/a4/13a441ad-e735-4cb2-91ce-fc1a9869a908.gif" width="800" />
  </figure>
  <ul id="XWNe">
    <li id="mlGV">Нажмите Симуляция , чтобы увидеть, как агент находит и использует смарт-объекты на уровне.</li>
  </ul>
  <p id="W7WI">Результаты секции</p>
  <p id="0IDn">В этом разделе вы подтвердили, что агент может находить и использовать смарт-объекты на уровне.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/T_U7lXgYAYS</guid><link>https://teletype.in/@hardway/T_U7lXgYAYS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/T_U7lXgYAYS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Обзор Smart Objects в Unreal Engine</title><pubDate>Wed, 01 May 2024 06:38:44 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/21/f4/21f4c046-b8e1-427a-bdd4-76271efe37b1.png"></media:content><category>Unreal engine 5</category><description><![CDATA[<img src="https://img1.teletype.in/files/05/ea/05eae88c-a210-4e15-a70f-98f7d6a1a7e9.png"></img>Смарт-объекты представляют собой набор действий на уровне, который можно использовать через систему бронирования.]]></description><content:encoded><![CDATA[
  <p id="3ihK">Смарт-объекты представляют собой набор действий на уровне, который можно использовать через систему бронирования.</p>
  <figure id="ucbB" class="m_column">
    <img src="https://ue-cdn.artstation.com/imgproxy/jxKJiBlBVXmc41c7LSrA8tfjTJYruA_ViuY8lHV5LiA/filename:SO-HeroImage.png/resizing_type:fill/width:1920/height:335/ext:jpg/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9kb2N1bWVudGF0aW9uL2ltYWdlcy8xZjBlMzU2MC1jMmY2LTQ2NjktYWFkYS1mZmNlZjAyY2RjNmYvc28taGVyb2ltYWdlLnBuZw" width="1920" />
  </figure>
  <h2 id="overview">Обзор</h2>
  <p id="oGXC">Умные объекты (Smart Objects) - это объекты, размещенные на уровне, с которыми могут взаимодействовать агенты ИИ и игроки. Эти объекты содержат всю информацию, необходимую для взаимодействия. Смарт-объекты являются частью глобальной базы данных и используют структуру пространственного разделения. Это означает, что их можно запрашивать во время выполнения игры, используя такие фильтры, как область поиска вокруг агента и игровые теги (gameplay tag).</p>
  <p id="jrT4">На высоком уровне Smart Objects представляют собой набор действий на уровне, который может быть использован через систему бронирования.</p>
  <p id="35Kr">Важно отметить, что смарт-объекты не содержат логики выполнения. Вместо этого они предоставляют интерактору всю необходимую информацию для выполнения взаимодействия, в зависимости от его реализации. Каждый интерактор (агент или игрок) выполняет свою собственную логику реализации смарт-объекта.</p>
  <h2 id="smartobjectelements">Элементы смарт-объектов</h2>
  <h3 id="smartobjectsubsystem">Подсистема SmartObject</h3>
  <p id="BVqD">Подсистема SmartObject отвечает за отслеживание всех Smart Objects, доступных на уровне. Смарт-объекты автоматически регистрируются в подсистеме для доступа и отслеживания.</p>
  <p id="Omr8">Эта подсистема автоматически создается в мире, когда активен плагин Smart Objects.</p>
  <h3 id="smartobjectpersistentcollection">SmartObject Persistent Collection</h3>
  <p id="xIYf">SmartObject Persistent Collection - это размещаемый на уровне Актор, содержащий список смарт-объектов, которые всегда будут частью симуляции, независимо от того, загружены они или выгружены во время выполнения.</p>
  <p id="wqVm">Обратите внимание, что на уровне может быть несколько SmartObject Persistent Collection или вообще ни одной. Коллекция влияет только на время жизни SmartObject&#x27;а, а не на то, будет ли он использоваться системой.</p>
  <h3 id="smartobjectcontainer">SmartObject Container</h3>
  <p id="Kef3">Контейнер SmartObject Container отслеживает группу смарт-объектов. Подсистема Smart Object Subsystem и постоянная коллекция Smart Object Persistent Collection используют его для выполнения определенных операций над SmartObject&#x27;ами.</p>
  <p id="1csu">Частым примером является объединение групп SmartObjects при добавлении постоянной коллекции в подсистему SmartObject Subsystem.</p>
  <h3 id="smartobjectcomponent">Компонент SmartObject</h3>
  <p id="nIJS">Компонент SmartObject можно добавить к любому Актору, чтобы отметить его как Смарт-объект на уровне. Компонент указывает на актив Smart Object Definition, в котором хранится конфигурация данного шаблона Smart Object.</p>
  <p id="Gr1d">Актор, содержащий компонент SmartObject, может быть загружен и выгружен во время выполнения с помощью Streaming. Если компонент SmartObject включен в любую из загруженных постоянных коллекций Smart Object, экземпляр во время выполнения будет оставаться активным в памяти и будет считаться частью симуляции независимо от состояния потоковой передачи компонента.</p>
  <p id="PlCH">Если Actor, содержащий компонент SmartObject, порожден во время выполнения, то после выгрузки он не останется активным в памяти. Это происходит потому, что компонент не входит ни в одну из постоянных коллекций SmartObject.</p>
  <h3 id="smartobjectdefinition">Smart Object Definition</h3>
  <p id="Ar2m">Определение смарт-объекта - Smart Object Definition - это ассет данных, который содержит неизменяемые данные, разделяемые между несколькими экземплярами времени выполнения смарт-объекта. Определение смарт-объекта хранит информацию о фильтрации, такую как требуемые пользователем теги, теги активности, теги активации объекта и стандартный набор определений поведения, которые могут быть использованы для взаимодействия со смарт-объектом.</p>
  <p id="xVAo">Определение смарт-объекта открывает один или несколько слотов, которые могут быть использованы агентами или игроками для конкретного смарт-объекта. Каждый слот включает в себя положение и вращение относительно родительского якоря (запекается из редактора размещения), а также несколько переопределяемых свойств. Обычные примеры переопределяемых свойств включают требуемые пользователем теги и конкретные определения поведения для каждого слота.</p>
  <h3 id="smartobjectbehaviorsdefinition">Smart Object Behaviors Definition</h3>
  <p id="oKIe">Определения поведения умных объектов - <strong>Smart Object Behaviors Definition </strong>- содержат данные, необходимые агенту или игроку для определенного взаимодействия. В настоящее время доступны следующие типы определений поведения:</p>
  <ul id="75rK">
    <li id="zyZK">Mass Entity Behavior - содержит данные, используемые для настройки смарт-объектов, которые могут использоваться объектами Mass AI.</li>
    <li id="BQoN">Gameplay Behavior - содержит данные, используемые для настройки смарт-объектов, которые могут быть использованы плагином Gameplay Behavior.</li>
  </ul>
  <h2 id="runtimeflow">Течение выполнения</h2>
  <p id="omKx">В этом разделе вы узнаете, как агенты взаимодействуют со смарт-объектом на уровне.</p>
  <h3 id="agentdata">Данные агента</h3>
  <p id="7EeH">Для поиска смарт-объектов агент может использовать одну или несколько игровых тегов - gameplay tag, а также запрос меток (Activity Requirements), содержащий нужные теги на объекте. Эта информация будет использоваться при поиске подходящих смарт-объектов на уровне.</p>
  <h3 id="smartobjectdata">Данные интеллектуального объекта</h3>
  <p id="TPZ7">Определения смарт-объектов (Smart Object Definition) могут содержать один или несколько тегов активности, которые используются для описания объекта. Они также могут содержать запрос тегов со списком желаемых тегов. Запрос тегов - это выражение, используемое для определения того, разрешено ли пользователю, запрашивающему использование смарт-объекта, взаимодействовать с ним.</p>
  <p id="hIAa">Определение смарт-объекта содержит список определений поведения по умолчанию, которые будут использоваться для всех слотов. Если для слота назначено определенное определение поведения, то оно будет переопределять поведение по умолчанию.</p>
  <h3 id="searchingforasmartobject">Searching for a Smart Object</h3>
  <figure id="Yxzf" class="m_original">
    <img src="https://img2.teletype.in/files/52/d0/52d0e89b-bd4e-4ec9-8d7a-a33482846f07.png" width="1606" />
  </figure>
  <figure id="wRoG" class="m_custom">
    <img src="https://img3.teletype.in/files/e2/5f/e25fa1ef-2535-4dee-b6d5-9dee9504f3e5.png" width="936" />
  </figure>
  <ol id="DQ1C">
    <li id="vlZf">Агент выполняет поиск близлежащих смарт-объектов с заданным интервалом. Агент выполняет поиск, вызывая метод FindSmartObjects в подсистеме Smart Object. Этот метод содержит пользовательские теги, теги активности, класс определения поведения и область поиска.</li>
    <li id="uJs5">Подсистема Smart Object находит все Smart Objects в области поиска, которые соответствуют всем заданным фильтрам.</li>
    <li id="BEEz">Подсистема Smart Object возвращает агенту результаты Smart Object Results. Результаты Smart Object Results представляют собой структурный массив, содержащий все совпадающие хэндлы Smart Object и их свободные слоты. На изображении выше вы можете видеть Smart Object автомобиля с одним свободным слотом, обозначенным кольцом зеленого цвета.</li>
  </ol>
  <h3 id="claimingthesmartobject">Утверждение смарт-объекта</h3>
  <ol id="xqUb">
    <li id="r54d">Агент выбирает нужный результат Smart Object Result и вызывает метод ClaimSmartObject в подсистеме Smart Object. В этом методе будет предпринята попытка заявить слот из смарт-объекта.</li>
    <li id="kpXR">Подсистема Smart Object пытается получить слот от Smart Object.</li>
    <li id="VOS6">Доступный слот занят в смарт-объекте, и его состояние установлено на Claimed.</li>
    <li id="r1QM">Подсистема Smart Object возвращает агенту Claim Handle.</li>
    <li id="X7tj">Агент проверяет, действителен ли Claim Handle. Если он действителен, то попытка утверждения была успешной, и он может перейти к следующему шагу. Однако если Claim Handle недействителен, агент может попытаться потребовать другой слот смарт-объекта из Smart Object Results. Требуемый слот не может быть потребован другим агентом до тех пор, пока он не будет освобожден агентом, который его потребовал.</li>
  </ol>
  <figure id="c9ER" class="m_original">
    <img src="https://img1.teletype.in/files/82/45/82459b00-eec9-45bd-a6ca-f3044afc4c76.png" width="1602" />
  </figure>
  <figure id="fbDE" class="m_original">
    <img src="https://img2.teletype.in/files/d7/67/d767005f-1690-4cbd-9fc6-15040f3e9bc4.png" width="888" />
  </figure>
  <p id="Pql3">На изображении выше слот 0 был занят агентом.</p>
  <h3 id="approachingthesmartobject">Подход к смарт-объекту</h3>
  <ol id="G3Js">
    <li id="frJO">Агент вызывает метод GetSlotLocation или GetSlotTransform в подсистеме Smart Object и передает Claim Handle. Этот метод возвращает положение или трансформацию заявленного слота. В качестве альтернативы, пользователи могут использовать следующий код C++ для получения трансформации слота:</li>
  </ol>
  <pre id="65Pb" data-lang="cpp">FSmartObjectSlotView: FSmartObjectSlotView View = Subsystem-&gt;GetSlotView(ClaimHandle.SlotHandle); 

const FSmartObjectSlotTransform&amp; SlotTransform = View.GetStateData&lt;FSmartObjectSlotTransform&gt;(); 

FTransform Transform = SlotTransform.GetTransform();</pre>
  <ol id="SWm8">
    <li id="MtYP">Подсистема Smart Object возвращает агенту местоположение или трансформацию запрошенного слота.</li>
    <li id="7Ix8">Теперь агент может начать навигацию к месту расположения слота на уровне. Агент может использовать любой способ навигации, чтобы добраться до места назначения.</li>
    <li id="CH3G">Агент прибывает в местоположение слота, вызывает метод Use в подсистеме Smart Object и передает ему Claim Handle.</li>
    <li id="SnTR">Метод Use вызывает изменение состояния заявленного слота. Состояние слота изменяется с Claimed на Occupied.</li>
    <li id="rxj5">Подсистема Smart Object возвращает агенту структуру Behavior Definition. Определение поведения содержит все необходимые данные для выполнения агентом желаемого поведения в месте расположения слота.</li>
  </ol>
  <figure id="u2dg" class="m_original">
    <img src="https://img2.teletype.in/files/d4/72/d472b731-49c4-4823-8d05-9474878310f7.png" width="1606" />
  </figure>
  <figure id="jEMv" class="m_original">
    <img src="https://img2.teletype.in/files/db/26/db26daed-18b7-49cf-b1f6-0c406210a98f.png" width="936" />
  </figure>
  <p id="Ummk">На изображении выше агент прибывает в слот и начинает выполнять желаемое поведение. Теперь слот занят, что обозначено кольцом красного цвета.</p>
  <h3 id="releasingthesmartobject">Высвобождение смарт-объекта</h3>
  <ol id="e96w">
    <li id="ZM3v">Агент выполняет желаемое поведение, описанное в определении поведения.</li>
    <li id="lQN7">Как только поведение завершено или прервано, агент вызывает метод Release с обработкой Claim Handle в подсистеме Smart Object.</li>
    <li id="7UhG">Подсистема Smart Object изменяет состояние слота с Занято на Свободно.</li>
    <li id="cTRt">Теперь агент свободен для выполнения других задач или поиска другого интеллектуального объекта. Агенты несут ответственность за освобождение занятых ими слотов. Это может произойти, как только их поведение будет завершено или прервано.</li>
  </ol>
  <h3 id="abortingtheprocess">Прерывание процесса</h3>
  <p id="2CED">Описанный выше процесс может быть прерван или отменен агентом или смарт-объектом в любой момент.</p>
  <p id="KjCu">Если состояние смарт-объекта изменится, он автоматически освободит все заявленные или занятые слоты и уведомит об этом соответствующих агентов через обратный вызов OnSlotInvalidatedDelegate. Частым примером является уничтожение смарт-объекта во время игрового процесса.</p>
  <p id="6DCO">Агент также может прервать процесс в любой момент по любой причине. В этом случае агент отвечает за освобождение слота, чтобы другие агенты могли его занять. Частыми примерами являются смерть агента или выполнение другой задачи с более высоким приоритетом.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@hardway/60minwithmass</guid><link>https://teletype.in/@hardway/60minwithmass?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway</link><comments>https://teletype.in/@hardway/60minwithmass?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=hardway#comments</comments><dc:creator>hardway</dc:creator><title>Ваши первые 60 минут с Mass AI</title><pubDate>Tue, 30 Apr 2024 18:08:36 GMT</pubDate><category>Mass AI</category><description><![CDATA[<img src="https://img2.teletype.in/files/d2/13/d213faee-f06f-45d6-82f3-404c87fcda93.png"></img>Руководство по использованию системы MassEntity для начинающих пользователей. В нем рассматриваются концепции Mass, ключевая терминология и то, как процессоры Mass работают под капотом. Все это связано с созданием агентов Mass, которые ведут себя как блуждающие пешеходы.]]></description><content:encoded><![CDATA[
  <figure id="uknK" class="m_column">
    <img src="https://img4.teletype.in/files/39/41/39416ef5-7c40-480a-b91b-69b3736881fb.png" width="1600" />
  </figure>
  <p id="BVK2">Руководство по использованию системы MassEntity для начинающих пользователей. В нем рассматриваются концепции Mass, ключевая терминология и то, как процессоры Mass работают под капотом. Все это связано с созданием агентов Mass, которые ведут себя как блуждающие пешеходы.</p>
  <h2 id="p2BF">Настройка плагина</h2>
  <p id="Bnln">В этом руководстве используются многие плагины Mass для создания агентов ИИ с помощью Mass и их перемещения по уровню. В редакторе Unreal Editor выберите Edit→Plugins в строке меню. Включите следующие плагины:</p>
  <ul id="03CB">
    <li id="RIGi">MassEntity</li>
    <li id="WX4d">MassGameplay</li>
    <li id="7T9Q">MassAI</li>
    <li id="e5zl">MassCrowd</li>
    <li id="y5P6">ZoneGraph (Для навигации)</li>
    <li id="Iumn">StateTree</li>
  </ul>
  <p id="8kzE">После включения любого из плагинов редактор предложит перезапустить его, но лучше всего подождать, пока все плагины будут включены, чтобы потребовался только один перезапуск. Как только все плагины будут включены, перезапустите редактор.</p>
  <h1 id="massconceptsoverview">Обзор концепций Mass</h1>
  <h2 id="massframeworksynopsis">Синопсис Mass Framework</h2>
  <p id="AIBK">Mass - это ориентированный на данные фреймворк, предназначенный для высокопроизводительных вычислений над большим количеством сущностей. В Unreal Engine обычный рабочий процесс состоит из акторов и компонентов. Хотя такой дизайн очень гибок с точки зрения создания логики для акторов, он часто приводит к несогласованности данных, что приводит к промахам кэша процессора, а это довольно дорого. Вместо этого Mass использует ориентированную на данные структуру проектирования Entities  и Fragments , которая обеспечивает альтернативный способ хранения данных, отделяющий их от логики обработки. Сущность Entity  - это один экземпляр группы фрагментов со связанным с ним идентификатором. Сущности не имеют посторонних фрагментов. Фрагменты одинаково составленных сущностей хранятся в смежной памяти. Более подробное описание MassEntity можно найти в официальной документации по MassEntity.</p>
  <h2 id="masskeyterminology">Ключевая Терминология Mass</h2>
  <ul id="XcWh">
    <li id="jX56">Сущность (Entity)- это базовый класс Mass, который содержит указатели на все его фрагменты.</li>
    <li id="z4pI">Фрагмент (Fragment)- хранит данные/состояние сущности в виде плотно упакованных массивов (например, трансформация, скорость, текущий LOD и т. д.).</li>
    <li id="Bgds">Архетип (Arhetype)- сущности с идентичным составом фрагментов, которые группируются вместе. Состав сущностей может меняться во время выполнения, что приводит к миграции архетипов</li>
    <li id="nA2u">Признак (Trait)- группирует фрагменты вместе и обычно представляет характеристики сущности (например, движение, навигация ZoneGraph, пользователь SmartObject).</li>
    <li id="lem3">Теги (Tag) - фрагменты на уровне архетипов, не содержащие данных, которые могут использоваться запросами для фильтрации архетипов на основе их наличия или отсутствия</li>
    <li id="skNV">Chunk Fragment - фрагменты, которые применяются к подмножеству сущностей в архетипе, а не непосредственно к одной сущности.</li>
    <li id="cXkU">Shared Fragment - Фрагменты с данными, которые совместно используются несколькими сущностями для оптимизации памяти.</li>
    <li id="8r1K">Процессор - место массового выполнения логики. Процессоры могут изменять значения фрагмента, а также состав сущностей (добавлять или удалять).</li>
    <li id="aVdG">Entity Query - запрос, используемый процессорами, который фильтрует архетипы на основе требований к фрагментам и/или тегам. Запрос EntityQuery возвращает группы фрагментов без учета идентификаторов отдельных сущностей.</li>
    <li id="XpT1">Mass Spawner - система для добавления сущностей на уровень во время выполнения.</li>
    <li id="gwPx">Mass Entity Config - ассет, определяющий массового агента для порождения путем указания признаков сущности.</li>
  </ul>
  <h2 id="massprocessorexecutionflow">Поток выполнения процессора Mass</h2>
  <p id="J7Bm">Хотя может показаться, что процессоры Mass проходят все сущности за один раз, на самом деле процессоры охватывают часть сущностей в архетипе. Шаги выглядят следующим образом:</p>
  <ol id="eLSJ">
    <li id="aNLX">Каждый процессор начинает с конфигурирования запроса сущности, который добавляет требования к сущности, такие как теги, фрагменты, общие фрагменты, фрагменты чанков и даже подсистемы.</li>
    <li id="UCiU">Затем процессоры выполняют пакетные обновления для куска сущностей, вызывая ForEachEntityChunk. Здесь используются фрагменты чанков, и один фрагмент чанка может быть использован для всех сущностей в чанке.</li>
    <li id="CTSp">MassEntityQuery сопоставляет требования с архетипами и может отфильтровывать фрагменты совпадающих архетипов на основе фильтров фрагментов. Хотя требования обычно заключаются в том, чтобы теги или фрагменты присутствовали в архетипе, их можно использовать для выбора архетипов без указанных тегов и фрагментов.</li>
    <li id="2LgH">После фильтрации Mass Entity Query запускает функцию для каждого куска сущностей, а доступ к отдельным сущностям куска можно получить через FMassExecutionContext. Большая часть кода плагина использует лямбда-выражения при выполнении ForEachEntityChunk.</li>
  </ol>
  <h2 id="masspluginoverview">Обзор плагина Mass</h2>
  <h3 id="productionreadyasof52">Готовность к производству по состоянию на 5.2</h3>
  <ul id="cZmR">
    <li id="MZM4">MassEntity - основной плагин для фреймворка Mass. Он необходим для любого проекта, желающего использовать Mass.</li>
  </ul>
  <h3 id="experimentalasof52">Экспериментальная версия 5.2</h3>
  <ul id="CtDW">
    <li id="AjKg">MassGameplay - Этот плагин содержит специализированный контент для взаимодействия с миром, репликации, LOD, движения и визуализации сущностей в мире. В плагин также включена поддержка сущностей, представленных в виде агентов, а также некоторые утилиты для предотвращения &quot;топтания&quot; данных, если актор или масса хотят изменить данные агента.</li>
    <li id="n7no">MassAI - Содержит логику для таких действий, как запуск деревьев состояний, навигация по миру с помощью ZoneGraph, избегание других массовых агентов и репликация ИИ.</li>
    <li id="Nllr">MassCrowd - Содержит специализированные классы для создания толп сущностей Mass со специальными процессорами визуализации и навигации. Он широко использовался в City Sample и был построен поверх других плагинов Mass.</li>
  </ul>
  <h1 id="settingupyourfirstentity">Создание первого Entity</h1>
  <h2 id="creatingthemassentityconfig">Создание MassEntityConfig</h2>
  <p id="WNt9">Чтобы создать MassEntityConfig, нажмите кнопку &#x27;Add&#x27; в браузере содержимого и выберите Miscellaneous-&gt;Data Asset из меню. Найдите &#x27;MassEntityConfigAsset&#x27;, затем нажмите &#x27;Select&#x27;. Назовите конфигурацию &#x27;MassNPCEntityConfig&#x27;. Откройте только что созданный конфиг. В окне редактора должна появиться панель &#x27;Details&#x27; с разделом &#x27;Entity Config&#x27;, в котором прямо под заголовком есть кнопка с надписью &#x27;Validate Entity Config&#x27;.</p>
  <figure id="Fstt" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/fCIE1yAkIQdCui165hrvpLGBkQcazcgbGZnre8tt_mM/filename:image6.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZTg5MWU3MWUtNDU2Yi00YTZhLTkzMGQtY2RhZDhlZTkxODRlL2ltYWdlNi5wbmc" width="1305" />
    <figcaption>Начальная MassEntityConfig для NPC</figcaption>
  </figure>
  <h2 id="addingtraitstotheentityconfig">Добавление признаков в конфигурацию сущности</h2>
  <p id="BeyT">Если щелкнуть на выпадающем списке &#x27;Index [0]&#x27;, появится длинный список опций. Это признаки, которые поставляются с включенными плагинами MassEntity. Признаки по умолчанию, поставляемые плагинами, охватывают некоторые стандартные поведения, которые можно ожидать от соответствующих плагинов, такие как ZoneGraphNavigation, Avoidance или SmartObject User. Дополнительные признаки можно добавить в конфигурацию, нажав клавишу &#x27;+&#x27; или щелкнув по нисходящему значку рядом с выпадающим признаком и выбрав &#x27;Insert&#x27;. Будьте осторожны с нажатием на значок мусорной корзины в верхней части списка признаков, так как это приведет к удалению всех признаков из конфигурации сущности.</p>
  <p id="sDMT">Начните с добавления признака Debug Visualization в конфигурацию сущности. После добавления трейта рядом с Index[0] появится тумблер расширения. Разверните признак и для поля mesh выберите из списка Shape Cone. Установите для поля Visual Near Cull Distance значение 0, а для Visual Far Cull Distance - 25000. Это позволит отладить отрисовку статической сетки для данного архетипа сущности. Сохраните конфигурацию сущности.</p>
  <figure id="5dqD" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/D8L_tfVQUkNwKfa0SQjr22i1WRADKWYq9BpyDM8ZQf4/filename:ConeMassEntityConfig.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZGIwMTlkOTktNWM2MS00Zjg4LThiMTQtMTgyN2QwODUyM2Q1L2NvbmVtYXNzZW50aXR5Y29uZmlnLnBuZw" width="1319" />
    <figcaption>MassEntityConfig для конуса</figcaption>
  </figure>
  <h2 id="addingtraitstotheentityconfig">Настройка MassSpawner</h2>
  <p id="TJqE">Создайте новый уровень на основе шаблона Basic. Добавьте MassSpawner на уровень через Place Actors. На вкладке Details  для MassSpawner раскройте раздел с надписью Spawn. Нажмите кнопку &#x27;+&#x27; рядом с Entity Types и выберите из выпадающего списка MassNPCEntityConfig ассет. Поле Count  - это количество сущностей, которые будет генерировать данный породитель. Вы можете изменить пропорцию каждой отдельной сущности в конфигурации. Пропорции типов сущностей для порождения нормализуются среди всех типов сущностей, связанных с породителем. Это позволяет избежать странных результатов от пропорций, которые превышают 1 или не достигают 1.</p>
  <p id="XGbA">Затем добавьте запись в раздел Генераторы данных порождения в породителе и разверните новый генератор. Выберите EQS Spawn Points Generator из выпадающего списка. Создайте запрос EQS под названием EQS_SpawnEntitiesInDonut. Откройте новый запрос окружения и перетащите корневой узел, выбрав Points: Donut из списка. Установите следующие параметры для генератора:</p>
  <ul id="ZZzJ">
    <li id="joKc"><strong>Inner Radius</strong> = 1000</li>
    <li id="Wjtl"><strong>Outer Radius </strong>= 3000</li>
    <li id="yKMZ"><strong>Number of Rings</strong> = 5</li>
    <li id="IrF0"><strong>Points Per Ring</strong> = 12</li>
  </ul>
  <figure id="tnaf" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/47dZWGvFOGvdJLkaupvi0qTlYvm54ZhJt7IN2tcw2uc/filename:image11.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMTgzYTBkYjQtMTJiNC00YjY3LTk3NjgtNDI1NDlhYjk4OTE3L2ltYWdlMTEucG5n" width="1064" />
    <figcaption>EnvQuery used for MassEQSSpawnPointsGenerator</figcaption>
  </figure>
  <p id="MySH">Сохраните запрос окружения. Вернитесь на уровень и снова выберите MassSpawner. В разделе Generator Instance выберите новый запрос окружения. Сохраните уровень и нажмите Simulate для PIE. Вокруг MassSpawner должно появиться 25 конусов. Это основные принципы добавления массовых сущностей на уровень.</p>
  <h2 id="**massprocessorbugin52**">**Ошибка MassProcessor в 5.2**</h2>
  <blockquote id="Nnh8">Это было исправлено в обновлении 5.2.1. Если вы используете версию 5.2.1 или более позднюю, вам не нужно использовать приведенные ниже обходные пути.</blockquote>
  <p id="YFub">В версии 5.2 обнаружена ошибка при установке флагов выполнения для мира и массовых процессоров. Проблема связана с добавлением поддержки запуска массовых процессоров в редакторе для утилит редактора. В основной ветке UE5 есть исправление, которое можно найти на GitHub здесь.</p>
  <p id="HQ87">Вы также можете обойти эту проблему, добавив флаг Editor в CDO процессора внутри Project Settings-&gt;Mass-&gt;Mass Entity.  Это необходимо сделать для следующих процессоров:</p>
  <ul id="xtXa">
    <li id="lZ4F"><strong>DebugVisLocationProcessor</strong></li>
    <li id="33tm"><strong>MassProcessor_UpdateDebugVis</strong></li>
    <li id="1i4E"><strong>MassStateTreeActivationProcessor</strong></li>
    <li id="WPrS"><strong>MassStateTreeProcessor</strong></li>
    <li id="r05X"><strong>MassUpdateISMProcessor</strong></li>
    <li id="qo7Z"><strong>MassVisualizationLODProcessor</strong></li>
    <li id="rylK"><strong>MassVisualizationProcessor</strong></li>
  </ul>
  <figure id="Eh1M" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/IfvS2ExNAGPJHrhSXYZC5LAL1fQq8nBPvy187uZ9Wmg/filename:MassDebugVizProcessorCDO.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNjZjZmNlYWItMTE2YS00N2FlLWFkMDgtZmZkZDZlZTk3MjRiL21hc3NkZWJ1Z3ZpenByb2Nlc3NvcmNkby5wbmc" width="1539" />
    <figcaption>Example of the Execution Flag setup for the Processor CDO</figcaption>
  </figure>
  <figure id="CABu" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/_Yx8vXYD9GI2Sfy65LGa5ShLBJaaIgVx6EqIfcR7y6g/filename:image7.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYmM0MjNmM2UtZTQzZS00OGNjLTg3NDUtODgxMDY5NDFkNzQzL2ltYWdlNy5wbmc" width="982" />
    <figcaption>Cone entities spawned by Mass</figcaption>
  </figure>
  <h1 id="makingmorecomplexentities">Создание более сложных объектов</h1>
  <h2 id="improvingtheentityconfig">Улучшение конфигурации сущности</h2>
  <p id="DhAX">Хотя стационарные конусы, конечно, могут быть интересными, следующим шагом будет добавление большей глубины сущностям через конфигурацию сущности. Во-первых, измените признак Debug Visualization на признак Visualization в конфигурации сущности. Признак Visualization  позволяет получить более тонкое визуальное представление сущностей за счет возможности поставлять шаблонные акторы высокого разрешения, шаблонные акторы низкого разрешения и статические экземпляры сетки для более высоких LOD.</p>
  <p id="iTuc">Развернув раздел Params, вы сможете выбрать, какой шаблонный актер будет использоваться с каждым уровнем LOD. Этот раздел также содержит опции, позволяющие отключить актеров Low Res Actors, если они представлены в виде статичной сетки. Флаг Keep Actor Extra Frame служит для помощи в рендеринге при переходе между LODами в случае, если запрос окклюзии запоздал на один кадр.</p>
  <p id="WhyO">Раздел LOD Params позволяет задать расстояние, на котором действует диапазон LOD, с отдельными значениями для необработанного расстояния и расстояния при видимости. LOD Max Count содержит настройки того, сколько каждого представления может быть активно в одном LOD.</p>
  <p id="DimH">Установите High Res Actor Template в Visualization trait, чтобы использовать шаблон персонажа проекта или любого персонажа, у которого есть компонент капсулы и скелетная сетка всего тела. Вы можете импортировать содержимое шаблона Third Person, чтобы получить готового персонажа для использования. Установите Low Res Actor Template, чтобы использовать того же персонажа, что и High Res Actor Template. Для Static Mesh Instance Desc добавьте сетку в Meshes коллизию и установите для нее использование Shape_NarrowCapsule. Измените для сетки Min LODSignificance на 3,0.</p>
  <p id="YyzG"></p>
  <figure id="O6Ep" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Otx52lCIWaHC0d6lJao_D0OznyXe5Si5tetZzvWnlLo/filename:image9.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOGE1NjBmOWYtYzBjYy00NWQyLWJiNGYtZjc0OWVhMGEwYWY0L2ltYWdlOS5wbmc" width="1312" />
    <figcaption>Entity Config with updated Visualization trait</figcaption>
  </figure>
  <h2 id="addingfragmentstoanentity">Добавление фрагментов к сущности</h2>
  <p id="dj6w">Поскольку конфиг сущности был обновлен, нажмите кнопку Validate Entity Config в левом верхнем углу. БЕЗ ПАНИКИ! В правом нижнем углу должно появиться всплывающее окно, объясняющее, что некоторым сущностям не хватает фрагментов, которые они требуют. Чтобы найти недостающие фрагменты и любые другие детали проверки конфигурации, загляните в Output Log, где красным цветом будут выделены все найденные проблемы. Для трейта Visualization  требуется 3 фрагмента: MassViewerInfoFragment, TransformFragment и MassActorFragment. Чтобы добавить эти фрагменты в сущность, добавьте еще один признак в конфигурацию сущности и выберите Assorted Fragments из выпадающего списка.</p>
  <p id="SuJT">Признак Assorted Fragments позволяет указать массив фрагментов, которые могут потребоваться различным признакам. Можно добавить больше фрагментов, чем нужно сущности, поэтому следует позаботиться о проверке конфигурации при каждом ее изменении. Создание дубликатов фрагментов также является проблемой при использовании трейта Assorted Fragments. Добавьте в массив 3 фрагмента и установите их в MassViewerInfoFragment, TransformFragment и MassActorFragment.</p>
  <figure id="w2Am" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/bma3cYTlWqT04UJK32KZk66TjQrvNi45S3kA69CEuts/filename:image2.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNGM5MTAxM2YtM2M3Zi00MTVmLTg1OTMtZDVkMmJhOTNlNWMzL2ltYWdlMi5wbmc" width="1239" />
    <figcaption>Assorted Fragments trait</figcaption>
  </figure>
  <p id="97dk">Вот краткое объяснение добавленных фрагментов:</p>
  <ul id="KAcm">
    <li id="7Q2A">MassViewerInfoFragment - этот фрагмент хранит рассчитанное расстояние до зрителей, которое будет использоваться при расчете уровня LOD</li>
    <li id="GaDm">TransformFragment - этот фрагмент хранит преобразование мира для сущности</li>
    <li id="Wx0y">MassActorFragment - этот фрагмент содержит указатель на AActor в мире, который используется для представления сущности с признаком визуализации</li>
  </ul>
  <p id="U4AT">Теперь, когда фрагменты добавлены, снова нажмите Validate Entity Config. В правом нижнем углу должно появиться всплывающее окно, но на этот раз оно должно сообщить, что ошибок валидации не было. Сохраните конфигурацию еще раз.</p>
  <h2 id="enableautomaticprocessorregistration">Включить автоматическую регистрацию процессора</h2>
  <p id="C4E8">Прежде чем вы начнете PIE, текущая форма Mass требует, чтобы у нескольких процессоров был включен флаг Auto Register With Processing Phases в настройках Mass. Без установки этого флага сущности Mass не будут видны в игре. Вы можете увидеть, что сущности по-прежнему порождаются с помощью инструментов Gameplay Debugger или Visual Logger, но у них нет никакого AActor-представления. Более подробно отладка Mass будет рассмотрена позже.</p>
  <p id="YIR1">Включить флаг Auto Register с фазами обработки можно двумя способами. Первый - открыть в редакторе Настройки проекта и выбрать Mass в разделе Engine. Разверните раздел Module Settings в разделе Mass. Разверните раздел Mass Entity и снова Processor CDOs. Далее найдите в массиве процессоров MassLODCollectorProcessor, MassRepresentationProcessor и MassVisualizationLODProcessor. Разверните процессоры и вручную включите флаг Auto Register with Processor Phases для каждого процессора.</p>
  <figure id="8bFC" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/uKQ0HfCE3Ep98Zz-gCQ1HCPRmIFmHSO9LqpIVfieq8M/filename:MassProcessorCDOAutoRegister.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYjA5M2E1ZWYtMmQ4OC00M2ZmLTkyYjItNTBhNTllNWI3ZDRmL21hc3Nwcm9jZXNzb3JjZG9hdXRvcmVnaXN0ZXIucG5n" width="1392" />
    <figcaption>Регистрация массовых процессоров</figcaption>
  </figure>
  <p id="97dk">Второй способ включить флаг Auto Register with Processing Phases заключается в том, чтобы добавить следующее в DefaultMass.ini проекта:</p>
  <p id="0QcV">[/Script/MassRepresentation.MassRepresentationProcessor]</p>
  <p id="e6Dh">bAutoRegisterWithProcessingPhases=True</p>
  <p id="KNiW">[/Script/MassRepresentation.MassVisualizationLODProcessor]</p>
  <p id="6K1I">bAutoRegisterWithProcessingPhases=True</p>
  <p id="k48a">[/Script/MassLOD.MassLODCollectorProcessor]</p>
  <p id="zJwh">bAutoRegisterWithProcessingPhases=True</p>
  <p id="IOoJ">Файл DefaultMass.ini должен находиться в папке Config в основании каталога проекта.</p>
  <p id="QSWt">Причина необходимости вручную включать эти процессоры заключается в конфликте с визуализацией Crowd. Процессоры визуализации по умолчанию все равно забирают сущности Crowd, поэтому они были отключены для City Sample. В будущем планируется решить эту проблему, но сроки пока не определены. Если конфигурации сущностей были изменены для использования Визуализации толпы, необходимо обновить включенные процессоры, а также фрагменты визуализации. Процессоры, которые нужны визуализации Crowd, следующие:</p>
  <ul id="uEN5">
    <li id="eqKI">MassCrowdLODCollectorProcessor</li>
    <li id="Jlgs">MassCrowdVisualizationProcessor</li>
    <li id="QWkZ">MassCrowdVisualizationLODProcessor</li>
  </ul>
  <h2 id="fixingthevisualization">Исправление визуализации</h2>
  <p id="MUlB">Теперь, когда процессоры включены, пришло время PIE, чтобы увидеть, что сущности теперь имеют полные скелетные сетки. Если вы используете полноценного персонажа для шаблона High Res Actor, он может выглядеть примерно так: сущности наполовину скрыты под полом.</p>
  <figure id="IiRB" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/gPyO1kMzwApSA-Z6r6EzFsjsLv-3uRX0--9jXkr1DS8/filename:image1.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNGU1ZGM2NDAtYTUzOC00Njc2LThkMTMtNmI5NWJlYzQ2YWM2L2ltYWdlMS5wbmc" width="1157" />
    <figcaption>Entities that are halfway through the floor</figcaption>
  </figure>
  <p id="FEKJ">Это связано с тем, что в UE5 компонент капсулы персонажа рассчитывается таким образом, что локально он центрируется вокруг (0, 0, 0). Чтобы компенсировать это, добавьте Post Projection Vertical Offset в запрос EQS, чтобы каждая возвращаемая позиция имела значение Z, увеличенное на эту величину. При значении 90.0 (равном половине высоты капсулы) визуализация персонажа должна быть полностью над землей. В качестве альтернативы это можно исправить с помощью синхронизации сущности и ее представителя-актера, как это делается далее в руководстве в Обновление массового актера BP.</p>
  <figure id="mMKM" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Lc07ABFCvzc_-0AljYQksswRg0V9KOWUkgSBwifO_jE/filename:MassGuideEntitiesOnFloor.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNDFhYWJlNWItYjgzOC00YmJjLTg5YzQtOGM4MzI1NDc5YzcwL21hc3NndWlkZWVudGl0aWVzb25mbG9vci5wbmc" width="1652" />
    <figcaption>Mass entities properly spawned above the floor</figcaption>
  </figure>
  <h1 id="implementinglodformassentities">Внедрение LOD для массовых организаций</h1>
  <h2 id="creatinglowresactortemplate">Создание шаблона актера низкого разрешения</h2>
  <p id="lL67">Несмотря на то, что полноценные актеры High Res работают в этой небольшой выборке, затраты на их использование могут быстро увеличиться. Именно в этом случае шаблон актера низкого разрешения может помочь, используя более легкого актера для представления сущности. Это позволяет разместить на экране больше сущностей, не жертвуя производительностью Mass.</p>
  <p id="FNPx">Для актера низкого разрешения создайте новый чертеж Actor Blueprint под названием BP_MassLowResActor. Откройте чертеж и добавьте компонент Skeletal Mesh Component. Установите Skeletal Mesh Asset для использования SKM_Manny_Simple и Anim Class для использования ABP_Manny. Использование манекена из другого движка для актера с низким разрешением позволяет легче увидеть, когда LOD сущности меняется в PIE.</p>
  <figure id="0l6J" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/Hq6hXRx5epxRmsTM4YzxWiJmi65FHaOH17m0pLzzGHM/filename:image8.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMTQ2NzhiNDYtMTY0ZS00MWI4LWE1NWItZjc3MjA3OTRjM2ZiL2ltYWdlOC5wbmc" width="623" />
    <figcaption>Настройка LowResActor</figcaption>
  </figure>
  <p id="tQY2">Также задайте Трансформацию  скелетной сетки, чтобы Значение расположения Z было -90,0 и Вращение  по оси Z было 270,0. Трансформация должна отражать трансформацию актера высокого разрешения и учитывать смещение в запросе EQS. Скомпилируйте чертеж и сохраните его.</p>
  <figure id="e64F" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/z1WutibNXZ8RevA9M-t6Pd8uc7YEy5jImgf1J8yGn84/filename:MassGuideLowResActorTransform.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZGZkNWJlZDgtOGYwZS00YjJjLWE4OTQtNWFiOTMzODdmOGJhL21hc3NndWlkZWxvd3Jlc2FjdG9ydHJhbnNmb3JtLnBuZw" width="622" />
    <figcaption>Настройки преобразования для LowResActor Transform</figcaption>
  </figure>
  <p id="JTbI">Откройте конфигурацию сущности массы. В разделе Visualization trait установите Low Res Template Actor для использования BP_MassLowResActor. Разверните раздел Params  и в разделе LODRepresentation  установите Medium LOD для использования Low Res Template Actor. Разверните раздел LODParams  и раздел LODMax Count. Установите общее число 10 для параметра High LOD Max Count.</p>
  <figure id="cet3" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/LfzftdUbAE9Sho2WTpMTpisB_lKyL8BGcTUaTAhCFGc/filename:MassGuideLowResVisualizationConfig.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZTU4ODUwN2UtZWIzZC00YjY2LWIwNjktZWQ2YmRjZTVkOTU0L21hc3NndWlkZWxvd3Jlc3Zpc3VhbGl6YXRpb25jb25maWcucG5n" width="1307" />
    <figcaption>EntityConfig Visualization values after changes</figcaption>
  </figure>
  <h2 id="addinglodinfotomassentities">Добавление информации LOD к массовым объектам</h2>
  <p id="Fy1q">Для настройки между уровнями LOD в конфигурации сущности потребуется новый признак: LODCollector. Процессор LODCollector определяет LOD, который должен иметь данный объект, основываясь на его расстоянии до зрителей и фрустра камеры. Подсистема MassLODSubsystem отвечает за сбор и синхронизацию всех контроллеров игроков в TMap, а LOD Collector затем использует эту TMap при определении LOD для сущностей.</p>
  <p id="GOnj">Добавьте LODCollector признак в MassNPCEntityConfig. Если на этом этапе конфиг будет проверен, редактор выдаст ошибку о том, что фрагмент был добавлен несколько раз. Это связано с тем, что признак LODCollector  добавляет фрагмент MassViewerInfoFragment  в своем методе BuildTemplate , а в текущем конфиге сущности он также добавляется признаком Assorted Fragments. Удалите запись для Mass Viewer Info Fragment из Assorted Fragments, щелкнув по нисходящему каре рядом с выпадающим списком фрагмента. Не нажимайте НЕ на значок мусорной корзины для массива Фрагменты, так как это приведет к удалению всех записей в массиве. Проверьте конфигурацию сущности и сохраните ее. На данный момент конфигурация сущности должна выглядеть следующим образом:</p>
  <figure id="m2PN" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/zQ-Flt0l_EdVLw-NAGKnZhSycrIz79C1ksQOguavaDs/filename:image4.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvOGViNjllZTQtN2YyZi00YWNiLWJiYjUtMjcxMGY2ZmY0YmM5L2ltYWdlNC5wbmc" width="1297" />
    <figcaption>Entity Config with LOD trait</figcaption>
  </figure>
  <p id="D6o5">Запустите PIE и перемещайтесь по уровню, чтобы увидеть, как актеры высокого разрешения (использующие скелет Квина) меняются на актеров низкого разрешения (использующих скелет Мэнни) по мере удаления от камеры, а актеры низкого разрешения должны меняться на актеров высокого разрешения, когда они приближаются к камере.</p>
  <figure id="sN9B" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/4SuhMyT51fmB_AdklGObdMPeJnAVPvQM9DpT57GOZCE/filename:MassGuideHighAndLowResActors.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvNGQwY2MwNDQtYjY3OS00YWZmLThiZTgtZGRmMTQ3MDU5ZmVhL21hc3NndWlkZWhpZ2hhbmRsb3dyZXNhY3RvcnMucG5n" width="1652" />
    <figcaption>Closer entities use Quinn, but further/background entities use Manny</figcaption>
  </figure>
  <h1 id="creatingmovingmassentities">Создание объектов с движущейся массой</h1>
  <h2 id="settingupazonegraph">Настройка ZoneGraph</h2>
  <p id="wANw">Добавьте Профиль полосы в раздел &#x27;Настройки проекта-&gt;График зоны&#x27;. Добавьте 2 полосы в профиль полосы с тегами по умолчанию, одну вперед и одну назад. Добавьте на уровень ZoneShapes, чтобы создать замкнутую сеть дорожек. Постройте граф зон и сохраните уровень. Дополнительные ресурсы по настройке ZoneGraph можно найти здесь: <a href="https://dev.epicgames.com/community/learning/tutorials/qz6r/unreal-engine-zonegraph-quick-start-guide" target="_blank">ZoneGraph Quick Start Guide</a></p>
  <figure id="aXUF" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/dKXAGkxO65_yhLhzdVTx8Ek80zqrMfP0jWUcLrnN0-Y/filename:MassGuideZoneGraph.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvY2ZmNmMyM2YtMTg2MC00ZDU1LWI3MmYtY2UyMmQ4OWEwOWNiL21hc3NndWlkZXpvbmVncmFwaC5wbmc" width="1657" />
    <figcaption>Simple ZoneGraph setup in level</figcaption>
  </figure>
  <h2 id="spawningentitiesonthezonegraph">Порождение объектов на ZoneGraph</h2>
  <p id="IuFC">Помимо использования ZoneGraph для навигации, Mass также включает в себя спаунер для порождения сущностей вдоль ZoneGraph. Выберите MassSpawner из Outliner на уровне. В разделе Mass-&gt;Spawn-&gt;Spawn Data Generators измените Generator Instance на ZoneGraph Spawn Points Generator. Установите фильтр Any Tags Filter на использование тега Default , используемого с профилями полос ZoneShape.</p>
  <figure id="eZGn" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/lY9wUg4_WMuyVcM5l20ZFpyHlReyvNe2yeVnS-N0o3M/filename:MassGuideZGSpawnSettings.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMTA5NzdhMGItYzUwMi00ZDA4LWFkZDktZjJjNWFkYzY4NDI0L21hc3NndWlkZXpnc3Bhd25zZXR0aW5ncy5wbmc" width="493" />
    <figcaption>MassSpawner settings with ZoneGraph points generator</figcaption>
  </figure>
  <p id="9u9P">Mass может работать с несколькими экземплярами генераторов данных на одном нерестовике. Количество локаций, созданных каждым генератором, будет нормировано на общее значение пропорции всех генераторов. Если вы используете генератор EQS вместо генератора ZoneGraph, существа, порожденные через EQS, могут находиться вне ZoneGraph, но если они настроены на навигацию по ZoneGraph, они будут пытаться двигаться к дорожкам ZoneGraph на уровне.</p>
  <h2 id="addingnavigationandmovementtotheentityconfig">Добавление навигации и движения в конфигурацию сущности</h2>
  <p id="5Qzp">Откройте конфигурацию Mass entity. Для правильной работы движения и навигации требуется несколько трейтов и фрагментов. Поскольку черты Mass представляют возможности, начните с добавления базовых черт движения: Движение, Направление, Плавная ориентация и Наведение. Вот высокоуровневое представление о том, что делают эти черты:</p>
  <ul id="yBzB">
    <li id="ni4e">Movement - Позволяет задать параметры движения для сущности. Параметрами могут быть различные скорости и режимы движения. Параметры можно добавлять и удалять в Настройки проекта-&gt;Масса-&gt;Движение массы.</li>
    <li id="J5LF">Steering - Позволяет задавать параметры, управляющие поведением рулевого, такие как время реакции, порог скорости и время ожидания выбора цели движения.</li>
    <li id="oLYL">Smooth Orientation - Позволяет задать направление движения с помощью весов, определяющих, как быстро он должен поворачивать и насколько сильно он хочет сохранять направление при движении.</li>
    <li id="bBlf">Avoidance - Позволяет агентам избегать препятствий. Параметры, связанные с этим, включают расстояние для обнаружения препятствий, величину просвета для обхода препятствий и время, в течение которого нужно смотреть вперед для обхода.</li>
  </ul>
  <p id="20ab">Внутри трейта Movement  добавьте стиль Default movement в массив Movement Styles. Остальные черты используют значения по умолчанию. Для Avoidance требуется добавить фрагмент Agent Radius Fragment с помощью трейта Assorted Fragments.</p>
  <p id="fCpH">Помимо возможности передвигаться, сущности должны перемещаться по уровню с помощью ZoneGraph. Для этого добавьте признаки ZoneGraph Navigation и Navigation Obstacle. ZoneGraph Navigation позволяет сущности перемещаться и запрашивать данные ZoneGraph для интеллектуального перемещения по уровню. Навигационное препятствие устанавливает сущность как препятствие, которое нужно обойти, чтобы сущности не столкнулись друг с другом во время движения.</p>
  <p id="81JD">Раскройте все поля для признака ZoneGraph Navigation. В Lane Filter добавьте тег Default  в поле Any Tags. Установите для параметра Радиус запроса значение 5000,0 см. У Navigation Obstacle нет полей, заданных в конфигурации сущности.</p>
  <figure id="7kTt" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/KtvtAG6BNrw2C-9L3jfVOcvPRs43Jhn5P8oc_gZhu6Y/filename:EntityConfigWithMovement.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZDljMWI4YTMtNTJmNS00N2Q1LTk0NjQtNGExNTEyODQ4MThhL2VudGl0eWNvbmZpZ3dpdGhtb3ZlbWVudC5wbmc" width="1289" />
    <figcaption>EntityConfig with the movement related traits added</figcaption>
  </figure>
  <h2 id="givingtheentityabrainwithstatetree">Наделите сущность мозгами с помощью StateTree</h2>
  <p id="zddA">Далее сущность должна иметь возможность найти место для перемещения. Это делается с помощью трейта StateTree , который позволяет назначать сущностям дерево StateTree, сконфигурированное со схемой Mass Behavior. Добавьте трейт StateTree  в конфигурацию сущности.</p>
  <p id="kNls">Создайте новый актив StateTree либо в браузере содержимого, либо в выпадающем списке для трейта StateTree. Выберите схему Mass Behavior и назовите StateTree ST_MassNPC. В активе нажмите Add State  и назовите его Wander. Добавьте еще одно состояние и назовите его Idle.</p>
  <p id="TgVm">Для состояния Wander  добавьте задачу ZG Find Wander Target и установите для раздела Allowed Annotation Tags значение Default  для раздела Any Tags. Добавьте задачу ZG Path Follow в состояние Wander . Для ZG Path Follow привяжите Target Location к Wander Target Location задачи ZG Find Wander Target. Установите Стиль перемещения на По умолчанию. Добавьте переход, который по завершении состояния будет переходить в состояние Idle .</p>
  <figure id="cc2y" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/ahA4GFrytHgmk1mD0OE1mHTg4aczgslgunVkZXeI-as/filename:MassGuideSTWanderConfig.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMzY1MTk2ZWEtYWVjYy00OWRjLTk3ODctMGI1MDliOGQzNzdjL21hc3NndWlkZXN0d2FuZGVyY29uZmlnLnBuZw" width="765" />
    <figcaption>Wander state&#x27;s configured tasks and transitions</figcaption>
  </figure>
  <p id="Xzps">В состоянии Idle  добавьте задачу ZG Stand. Установите Длительность  для задачи равной 1,5. Добавьте переход к состоянию, который переходит к корню, когда состояние завершается. Это очень базовое дерево StateTree для перемещения, а более продвинутые, функциональные и полные примеры можно найти в проекте City Sample.</p>
  <figure id="hZhh" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/Aa8X_cDZ1RdoR578rBGNRAYrM7BD56_1HXTwpw7rLio/filename:image5.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMjkxYzJjOTktZDQ2Yi00Y2QxLWJkMjItZGRlMmM3NjM0YmI2L2ltYWdlNS5wbmc" width="484" />
    <figcaption>Простое дерево состояний, которое бродит по ZoneGraph</figcaption>
  </figure>
  <p id="opkR">В конфигурации сущности установите StateTree trait на использование ST_MassNPC asset. Проверьте и сохраните конфигурацию сущности.</p>
  <h2 id="creatingananimationblueprintformass">Создание анимационного блупринта для Mass</h2>
  <p id="epjm">Для анимации актеров, связанных с массой, создайте Animation Blueprint на основе скелета SK_Mannequin под названием ABP_Mass. Откройте блупринт и перетащите анимацию MF_Walk_Fwd  из правого нижнего Asset Browser. Подключите выход анимации к выходной позе. Установите анимацию на цикл. Скомпилируйте и сохраните актив. Откройте BP персонажа, используемого для High Res Actor в Mass. Установите Anim Class для использования ABP_Mass. Это просто для того, чтобы в данном руководстве была анимация. Правильные чертежи анимации очень сложны и выходят за рамки данного руководства. Примеры полных чертежей анимации для Mass можно найти в проекте CitySample.</p>
  <h2 id="updatingthemassactorbp">Обновление BP актера Mass</h2>
  <p id="AqFX">Внутри чертежа High Res Actor Blueprint добавьте к актеру компонент MassAgent . Чтобы актер мог правильно двигаться, информация о нем должна быть синхронизирована с Mass. Для этого необходимо создать новый конфиг сущности. Создайте новый конфиг сущности Mass и назовите его MassPuppetEntityConfig. В конфигурацию добавьте трейты для Agent Movement Sync и Agent Feet Location Sync. Установите Направление синхронизации для Agent Movement Sync на Mass to Actor, так как Mass будет обеспечивать движение сущности. Для Agent Feet Location Sync установите Sync Direction в Actor to Mass. Использование направления синхронизации Actor to Mass позволяет Mass реагировать на окружающий мир, влияющий на местоположение агента. В качестве примера можно привести столкновение агента с другими агентами или его перемещение под действием физики, например, на платформе лифта.</p>
  <figure id="OxBh" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/LJ-pl9l05EC1kpOYi2ImM58TQf4OkCaPHf6s7Q4Xtk8/filename:image10.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvYzRlZjVkYzMtMzQwMy00Nzc5LTk0ZDktZjc3ZDc1YzNjZDczL2ltYWdlMTAucG5n" width="1290" />
    <figcaption>Mass puppet Entity Config</figcaption>
  </figure>
  <p id="F3jC">Признаки синхронизации поддерживают сущности Mass и их акторов в синхронизации и позволяют задавать направления синхронизации, чтобы любая из систем могла быть контролирующей. По умолчанию каждая система синхронизируется с другой, и ни одна из них не рассматривается как единственный источник истины. К другим признакам синхронизации относятся столкновение и ориентация капсулы. Все эти признаки являются частью секции MassActor плагина MassGameplay.</p>
  <p id="XDNo">В панели Details  компонента Mass Agent установите конфиг сущности на MassPuppetEntityConfig. Это позволит свойствам Sync работать с сущностью, порожденной для Mass.</p>
  <h2 id="updatethemassentityvisualization">Обновление визуализации массовой сущности</h2>
  <p id="oG4U">В конфигурации сущности разверните признак Visualization  и установите Low Res Template Actor, чтобы теперь он использовал тот же BP, что и High Res Template Actor. Это необходимо, потому что признак Agent Movement Sync ожидает фрагмент обертки Character Movement Component. Сохраните конфиг сущности. запустите PIE, и сущности будут бродить по ZoneGraph с воспроизведением анимации.</p>
  <figure id="Sw8d" class="m_custom">
    <img src="https://ue-cdn.artstation.com/imgproxy/P-vWWzEzySghfEdGbTpzsxRVqhk9lRBINNqeiQvAIVY/filename:image13.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvZTA0YTFmNjktMTAxZS00NDMwLThmZTItOWNjNDI4NGM5OWEzL2ltYWdlMTMucG5n" width="1265" />
    <figcaption>Окончательный вид MassNPCEntityConfig с его признаками</figcaption>
  </figure>
  <h1 id="makingmassawareoftheplayer">Сделать массу осведомленной об игроке</h1>
  <h2 id="creatingtheplayerentityconfig">Создание конфигурации сущности игрока</h2>
  <p id="CD0i">Создайте новый ассет Mass Entity Config Asset и назовите его MassPlayerEntityConfig. В конфигурацию добавьте следующие свойства: Navigation Obstacle  и Agent Capsule Collision Sync. Поскольку игрок будет управлять актором, установите Направление синхронизации в Actor to Mass для признака Agent Capsule Collision Sync. Проверьте и сохраните конфигурацию сущности.</p>
  <figure id="foVA" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/Rdq2ZOIDj6v2LjYI5ZZ3RiGMBLaXCFQ57324J36Yz24/filename:image12.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMWFkOGUyMTEtZDEzZC00ODE1LWE5YjItNzMyYzlmZDQxYzVjL2ltYWdlMTIucG5n" width="1286" />
    <figcaption>The player MassEntityConfig</figcaption>
  </figure>
  <h2 id="configuringplayercharacterforusewithmass">Настройка персонажа игрока для использования с массой</h2>
  <p id="ccRZ">Чтобы Mass работал с игроками и актерами, не порожденными MassRepresentation, к актерам должен быть добавлен компонент Mass Agent. Откройте блупринт, используемый для игрока по умолчанию. Добавьте к персонажу компонент Mass Agent. Установите Entity Config компонента Mass Agent на использование MassPlayerEntityConfig. Скомпилируйте и сохраните БП.</p>
  <p id="ilC6">PIE и обратите внимание, что сущности будут пытаться обойти игрока, если он встанет на их пути. Это легче заметить, если включить отладчик игрового процесса, так как он покажет трансформацию, силу управления и направление ориентации сущностей во время PIE.</p>
  <figure id="ndvf" class="m_original">
    <img src="https://ue-cdn.artstation.com/imgproxy/bueVVE0zlW-G_7fy0vMoLsI39melDjShRxUQCvdXtpI/filename:image3.png/resizing_type:fit/width:1920/height:1080/aHR0cHM6Ly9kMWl2N2RiNDR5aGd4bi5jbG91ZGZyb250Lm5ldC9pbWFnZXMvMjVkNDRmYmEtOTU4Ny00MjIzLWFhMzUtNTVjZTk0ZDVjY2U4L2ltYWdlMy5wbmc" width="1090" />
    <figcaption>The NPCs wandering around the level with GameplayDebugger active</figcaption>
  </figure>

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