<?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>Dim</title><generator>teletype.in</generator><description><![CDATA[Dim]]></description><link>https://teletype.in/@stanfox?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/stanfox?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/stanfox?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 04 Jun 2026 14:00:44 GMT</pubDate><lastBuildDate>Thu, 04 Jun 2026 14:00:44 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@stanfox/7B3nZZSmmyK</guid><link>https://teletype.in/@stanfox/7B3nZZSmmyK?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox</link><comments>https://teletype.in/@stanfox/7B3nZZSmmyK?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox#comments</comments><dc:creator>stanfox</dc:creator><title>Raycast лучи как ими пользоваться зачем и вводные данные перед основной статьей</title><pubDate>Thu, 31 Oct 2024 18:16:38 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d3/d6/d3d6cc78-12e0-452a-832b-b80d9e8ec097.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/fc/66/fc666914-c1ea-4be9-9c3a-7edc1944ea82.png"></img>перед тем как выпустить основую статью про создание шутера bloodtide когда я разрабатывал оружие и мне нужно было использовать Raycast я задумался над тем что легче сначало изложить эту тему в отдельной статье а потом уже вам будет более понятно о чем вообще идет речь в основе:]]></description><content:encoded><![CDATA[
  <p id="yyfW">перед тем как выпустить основую статью про создание шутера bloodtide когда я разрабатывал оружие и мне нужно было использовать Raycast я задумался над тем что легче сначало изложить эту тему в отдельной статье а потом уже вам будет более понятно о чем вообще идет речь в основе:</p>
  <p id="uNNk"></p>
  <p id="WZ9W"></p>
  <p id="eXhX"><strong>Raycast</strong> в <strong>Roblox Studio</strong> — это метод, который позволяет выявить объекты в игровом мире, используя луч (ray). Луч излучается из определенной точки и направляется в заданном направлении, проверяя столкновение с объектами, которые находятся на его пути. Этот процесс часто используется для реализации различных механик, таких как стрельба, взаимодействие с объектами, проверки расстояния или определения того, попадает ли объект в линию видимости.</p>
  <h3 id="l9hT">Основные моменты:</h3>
  <ol id="qkc1">
    <li id="ywXk"><strong>Происхождение</strong>: Луч начинается в заданной точке в пространстве, которая может быть позиционирована вручную или определена программно.</li>
    <li id="W6na"><strong>Направление</strong>: Луч имеет направление, обычно заданное векторами, которые могут определять движение вперед, назад, вверх и т. д.</li>
    <li id="LPQJ"><strong>Длина</strong>: Луч может иметь определенную длину, которая ограничивает его радиус действия.</li>
    <li id="3a72"><strong>Коллизия</strong>: Raycast проверяет столкновение с объектами, которые находятся в пути луча. Это может включать как игровые объекты, так и элементы, установленные в мире (например, стены или другие преграды).</li>
  </ol>
  <p id="6j3t"></p>
  <figure id="wiHS" class="m_original">
    <img src="https://img4.teletype.in/files/fc/66/fc666914-c1ea-4be9-9c3a-7edc1944ea82.png" width="1046" />
  </figure>
  <p id="xmSF"></p>
  <p id="68UU">вот собственно сам луч мы задали место из которого он исходит и его направление и в будущем ну точнее уже в следующей статье с помощью этой технологии мы с вами сделаем пули </p>
  <p id="e1bd"></p>
  <p id="w6KU"></p>
  <p id="Y26h">а теперь к скриптингу</p>
  <p id="Xx6A"></p>
  <p id="SXLO"></p>
  <p id="GJmL">сейчас посмотрим как задать луч:</p>
  <p id="3J7h"></p>
  <p id="kAEX"></p>
  <figure id="v1EL" class="m_original">
    <img src="https://img4.teletype.in/files/b7/c3/b7c30ec6-a838-448b-977f-6c0fe383ba1a.png" width="1183" />
  </figure>
  <p id="A4lu"></p>
  <p id="4rlm">вот собственно такой синтаксис задание луча  и также нам необходимо внутри нашем методе обьекта workspace по имени RayCast задать опеределенные параметры посмотрите внимательно на первый блок где для удобства написана подсказка от роблокса</p>
  <p id="x6Ei"></p>
  <p id="t8so"></p>
  <p id="B9Fx">origin - это откуда собственно исходит луч</p>
  <p id="DhP4"></p>
  <p id="sWtn"></p>
  <p id="WVqs">direction - это направление,цель в которую движется луч</p>
  <p id="UCtV"></p>
  <p id="1FBa"></p>
  <p id="yiCt">RayCastParams - это определенные характеристики луча туда можно записать какие предметы игнорить и прочие модификации</p>
  <p id="kTXd"></p>
  <p id="P68u"></p>
  <p id="0L7P">также кто то кто не знаком с другими языками программирования спросит почему Raycast это метод а не функция и почему Workspace это обьект</p>
  <p id="uroy"></p>
  <p id="xk8D">Обьект это структура данных которая вмещает себя сразу и функции и переменные и многое другое и функции внутри  обьекта являются методами это является частью одной из главных концепий с которой вы много столкнетесь </p>
  <p id="CnLI"></p>
  <p id="jUN3">ООП- обьектно ориентированное программирование и это подход к программированию где данные и функции обьединяются в обьекты</p>
  <p id="c0bi"></p>
  <p id="U7Ne">мы не будем особо давать этому большее определение просто если когда нибудь в какой нибудь беседе кто то скажет что в Lua нету ООП то смело сможете заткнуть невежество</p>
  <p id="0CPZ"></p>
  <p id="4TbS"></p>
  <p id="Ia9E"></p>
  <p id="pCuV">теперь вернемся к лучам</p>
  <figure id="BN4D" class="m_original">
    <img src="https://img2.teletype.in/files/dd/e5/dde52f17-93c0-4fd3-8c68-a3cb915ef691.png" width="1847" />
  </figure>
  <p id="BLv2"></p>
  <p id="Htap">теперь сделаем два парта  </p>
  <p id="cUIj">а теперь зададим origin</p>
  <p id="l9aH"></p>
  <p id="EydM">origin - это откуда собственно исходит луч</p>
  <p id="oX5x"></p>
  <p id="qmZL"></p>
  <figure id="SaYi" class="m_original">
    <img src="https://img3.teletype.in/files/20/f7/20f70fa9-a1d1-4f20-962c-fdde98ff05a7.png" width="907" />
  </figure>
  <p id="SJJI"></p>
  <p id="KUmg"></p>
  <p id="Rq76">в общем мы указали стартовую позицию луча  origin</p>
  <p id="VrbX"></p>
  <p id="KUFC"></p>
  <p id="MxZT">дальше осталось указать направления луча</p>
  <p id="HPeB"></p>
  <figure id="sil1" class="m_original">
    <img src="https://img4.teletype.in/files/bd/68/bd68ba08-2939-4a0c-b0f6-07fab6da8cff.png" width="1511" />
  </figure>
  <p id="MPrV"></p>
  <p id="3hBW">дальше вопрос к вам</p>
  <p id="oncG">что нужно вот здесь в переменной direction?</p>
  <p id="zwil">пожалуйста не читайте дальше подумайте и напишите ответ в коментариях будет очень интересно посмотреть догадался ли кто то или нет</p>
  <p id="IfOM"></p>
  <p id="xwxo">после того как написали и посмотрите дальше ответ скорее всего вас удивит!</p>
  <p id="vVMP"></p>
  <p id="kLWf"></p>
  <p id="SDqj"></p>
  <figure id="hcfh" class="m_original">
    <img src="https://img1.teletype.in/files/40/dd/40dd5612-3239-405c-8300-75e81033b590.png" width="1684" />
  </figure>
  <p id="PAQ2"></p>
  <p id="BTtb"></p>
  <p id="DVLK">90% процентов кто читает подумали что в direction надо записать part2.Position </p>
  <p id="AKwf"></p>
  <figure id="W6dM" class="m_original">
    <img src="https://img4.teletype.in/files/32/e7/32e7095c-4390-441d-9380-7350327cf702.png" width="1354" />
  </figure>
  <h3 id="BZWY">вот яркий пример что будет если использовать вот нашу запись</h3>
  <p id="kmOR">Почему это неверно?</p>
  <p id="34cs">В методе <code>Raycast()</code> второй аргумент — это <strong>вектор направления</strong> луча, который указывает, в какую сторону и на какое расстояние должен двигаться луч от начальной точки (origin). <strong><code>part2.Position</code></strong> — это просто координаты целевой точки, а не вектор, который определяет путь луча.</p>
  <p id="aIms">Когда вы передаете координаты точки (<code>part2.Position</code>) вместо вектора направления, результат будет неверным. Roblox интерпретирует <code>part2.Position</code> как вектор направления, и это не то, что вам нужно.</p>
  <p id="h9iM"></p>
  <p id="YnCo"></p>
  <p id="9AIN"></p>
  <h3 id="DWhm">Как правильно указать направление?</h3>
  <p id="BAsY">Чтобы правильно задать вектор направления, вам нужно вычислить разницу между координатами начальной точки и целевой точки. Разница между двумя точками дает вам <strong>вектор</strong>, который указывает точное направление, по которому будет двигаться луч.</p>
  <p id="jjtg"></p>
  <p id="KviP"></p>
  <p id="hNaM"></p>
  <p id="wvq2">local part1 = workspace.Part1<br />local part2 = workspace.Part2</p>
  <p id="zJnN">— Параметры для Raycast<br />local origin = part1.Position<br />local direction = part2.Position - part1.Position  — Здесь мы вычисляем разницу между точками<br />local ray = workspace:Raycast(origin, direction)<br /></p>
  <p id="ohi8">Вектор, вычисленный как разница между <code>part2.Position</code> и <code>part1.Position</code>:</p>
  <p id="xsMV"></p>
  <figure id="A7GR" class="m_original">
    <img src="https://img2.teletype.in/files/94/42/9442a281-ef84-4aa4-b01d-372e28670591.png" width="823" />
  </figure>
  <p id="Npa1"></p>
  <p id="GUd2">определяет точное направление луча. Это означает, что луч будет двигаться <strong>от точки <code>part1.Position</code> в направлении <code>part2.Position</code></strong>.</p>
  <p id="Qf11"></p>
  <p id="3iTU"></p>
  <p id="Ve1J">Например, если <code>part1.Position = (2, 3, 4)</code> и <code>part2.Position = (8, 6, 4)</code>, то разница между этими точками будет:</p>
  <p id="qSCl"></p>
  <p id="3KjX"></p>
  <figure id="ugG9" class="m_original">
    <img src="https://img1.teletype.in/files/06/cd/06cdac8f-63ad-4595-9cd2-8cb1aa57bf7f.png" width="860" />
  </figure>
  <p id="Eth4">Таким образом, луч будет двигаться на 6 единиц по оси X и на 3 единицы по оси Y.</p>
  <figure id="ksOh" class="m_original">
    <img src="https://img2.teletype.in/files/9f/24/9f246183-4422-4636-ac42-165a97a74a52.png" width="919" />
  </figure>
  <h3 id="pWLR">Заключение</h3>
  <p id="YEF5"><strong>Необходимо помнить</strong>: передача координат целевой точки (например, <code>part2.Position</code>) в качестве вектора направления — это ошибка. Это не задает направление луча, а просто указывает координаты точки в пространстве. Для корректной работы луча необходимо вычислить разницу между начальной и конечной точкой, которая и будет вектором направления луча.</p>
  <p id="BbX2"></p>
  <p id="L41F">также стоит помнить что</p>
  <p id="gHr3"></p>
  <p id="ndTB"></p>
  <p id="LmRF"></p>
  <p id="bcEe">### Оси в 3D-пространстве:<br />1. X — это горизонтальная ось, которая идет влево и вправо.<br />   - Положительное значение (X &gt; 0): движение вправо.<br />   - Отрицательное значение (X &lt; 0): движение влево.<br />   <br />2Y — это вертикальная ось, которая идет вверх и вниз.<br />   - Положительное значение (Y &gt; 0): движение вверх.<br />   - Отрицательное значение (Y &lt; 0): движение вниз.</p>
  <p id="aBdm">3. Z — это ось глубины, которая идет вперед и назад.<br />   - Положительное значение (Z &gt; 0): движение вперед (к экрану).<br />   - Отрицательное значение (Z &lt; 0): движение назад (от экрана).</p>
  <p id="0wUD">### Пример:<br />Вектор, например, &#x60;Vector3.new(10, 5, -3)&#x60;:<br />-X = 10— движение вправо на 10 единиц.<br />- Y = 5 — движение вверх на 5 единиц.<br />- Z = -3 — движение назад (от камеры) на 3 единицы.</p>
  <p id="3AG1">Таким образом:<br />- X — это влево/вправ.<br />-Y — это вверх/вниз.<br />- Z — это вперед/назад.</p>
  <p id="Fbj7"></p>
  <p id="hLUd"></p>
  <p id="Y4z7"></p>
  <figure id="veq8" class="m_original">
    <img src="https://img2.teletype.in/files/5f/75/5f75afeb-8505-4f93-a794-bd82234ef8c3.png" width="689" />
  </figure>
  <p id="LWb3"></p>
  <p id="jXh3">теперь настало время погооврить о 3 параметре э</p>
  <figure id="pULr" class="m_original">
    <img src="https://img2.teletype.in/files/98/0b/980b51f0-d9fa-4ef1-b84b-68c673abadea.png" width="956" />
  </figure>
  <p id="BCNt">теперь осталось поговорить о 3 параметре это  raycastparams собственно это параметры нашего луча</p>
  <p id="5YFg"></p>
  <figure id="LS9D" class="m_original">
    <img src="https://img1.teletype.in/files/82/d7/82d7614a-dde3-4cc3-a4f8-2fbaf40fd9f5.png" width="562" />
  </figure>
  <p id="7ILP">теперь обьявляем вот такую вот переменную</p>
  <p id="uajM">собственно она и будет олицетворять набор параметров и характеристик для данного луча</p>
  <p id="Zemf"></p>
  <p id="VXGz">начнем с основного</p>
  <p id="8AMa"></p>
  <figure id="cYCX" class="m_original">
    <img src="https://img4.teletype.in/files/bf/d1/bfd1b6f1-c56a-40cf-aaeb-a804c132d8b0.png" width="868" />
  </figure>
  <p id="G5Av"></p>
  <p id="7Qx5">мы обьявляем таблицу которая содержит элементы которые будут фильтроваться по определенному признаку</p>
  <p id="ivqH">таблица это просто список каких либо обьектов или элементов просто линейный набор данных который можно представить как полку на которой лежат ящики</p>
  <p id="UHJF">теперь собственно укажем тип фильтра</p>
  <p id="oq3M"></p>
  <figure id="8ScC" class="m_original">
    <img src="https://img2.teletype.in/files/1b/ac/1bac49c0-4e02-4abb-b356-a89e86931bfb.png" width="1381" />
  </figure>
  <p id="SgDk"></p>
  <p id="EJpD"></p>
  <p id="lbq4">собственно Exclude это обьекты которые луч будет игнорировать </p>
  <p id="u6Kj"></p>
  <p id="Gvla">Когда говорят, что **&quot;луч будет игнорировать&quot;** какой-либо объект, это означает, что объект не будет участвовать в процессе столкновения или взаимодействия с лучом. В результате луч не остановится или не взаимодействует с этим объектом, а продолжит двигаться в своем направлении.</p>
  <p id="q2Yr">### Как это работает в Roblox:</p>
  <p id="vgi9">1. **Raycast** — это механизм, который позволяет проверять, сталкивается ли луч с объектами в игровом мире. Когда луч сталкивается с объектом, он может вернуться с результатом, содержащим информацию о пересечении, такую как:<br />   - Имя объекта, с которым произошло пересечение.<br />   - Позиция пересечения.<br />   - Точка на объекте, с которой луч взаимодействует.</p>
  <p id="FFqT">2. **Игнорировать объект** — это значит, что если объект находится в **списке исключений** (например, через &#x60;FilterDescendantsInstances&#x60; и &#x60;RaycastParams&#x60;), то луч **не будет учитывать** этот объект при поиске пересечений. То есть, если луч встретит объект, который был добавлен в список игнорируемых, он его проигнорирует и продолжит движение, не прерываясь.</p>
  <p id="QdxC">### Пример:</p>
  <p id="VZvc">Если у нас есть несколько объектов (например, &#x60;part1&#x60;, &#x60;part2&#x60;, и &#x60;part3&#x60;) и мы хотим, чтобы луч **игнорировал &#x60;part2&#x60;**, это может быть сделано с использованием &#x60;RaycastParams&#x60; с параметром **&#x60;FilterType&#x60;**:</p>
  <p id="lejJ">&#x60;&#x60;&#x60;lua<br />local part1 = workspace.Part1<br />local part2 = workspace.Part2<br />local part3 = workspace.Part3</p>
  <p id="IUr8">-- Настроим параметры для Raycast<br />local raycastParams = RaycastParams.new()</p>
  <p id="Axv7">-- Указываем объекты, которые нужно игнорировать (в данном случае part2)<br />raycastParams.FilterDescendantsInstances = {part3}<br />raycastParams.FilterType = Enum.RaycastFilterType.Exclude  -- Исключаем часть из пересечения лучом</p>
  <p id="0qhj">-- Выполняем Raycast<br />local origin = part1.Position<br />local direction = part2.Position - part1.Position<br />local rayResult = workspace:Raycast(origin, direction, raycastParams)</p>
  <p id="jZC8">if rayResult then<br />    print(&quot;Луч пересек объект: &quot; .. rayResult.Instance.Name)<br />else<br />    print(&quot;Луч не пересек ни одного объекта&quot;)<br />end<br />&#x60;&#x60;&#x60;</p>
  <p id="pmBS">### В этом примере:<br />- **Луч** будет двигаться от &#x60;part1&#x60; к &#x60;part2&#x60;.<br />- **&#x60;part3&#x60;** будет **игнорироваться** лучом, благодаря установке фильтрации с &#x60;FilterType = Enum.RaycastFilterType.Exclude&#x60;.<br />  - Это значит, что даже если луч пересекает &#x60;part3&#x60;, он не &quot;заметит&quot; его и не остановится. Луч продолжит движение и, возможно, пересечет другие объекты.</p>
  <p id="HxRz">### Что происходит при игнорировании:<br />- **Игнорирование** объекта приводит к тому, что луч не будет &quot;замечать&quot; этот объект, и:<br />  - Луч не остановится при его пересечении.<br />  - Результат **Raycast** не будет включать информацию о пересечении с этим объектом.<br />  - Луч будет двигаться дальше, как если бы этого объекта не существовало на его пути.</p>
  <p id="H0wi">Таким образом, игнорирование объекта позволяет исключить его из взаимодействия с лучом и продолжить работу с другими объектами, с которыми луч может взаимодействовать.</p>
  <p id="SGYC"></p>
  <p id="XIMQ">Если использовать **&#x60;Enum.RaycastFilterType.Whitelist&#x60;** (включить объекты, или &quot;Whitelist&quot;), то луч будет **взаимодействовать только с теми объектами, которые находятся в списке &#x60;FilterDescendantsInstances&#x60;**.</p>
  <p id="59Ix">Это означает, что **луч будет взаимодействовать только с указанными объектами**, а все остальные объекты будут **игнорироваться**.</p>
  <p id="urHE">### Пример с **Whitelist** (включение объектов):</p>
  <p id="ji35">&#x60;&#x60;&#x60;lua<br />local part1 = workspace.Part1<br />local part2 = workspace.Part2<br />local part3 = workspace.Part3</p>
  <p id="kFHi">-- Настроим параметры для Raycast<br />local raycastParams = RaycastParams.new()</p>
  <p id="wYiT">-- Указываем объекты, с которыми луч будет взаимодействовать (в данном случае part1 и part2)<br />raycastParams.FilterDescendantsInstances = {part1, part2}<br />raycastParams.FilterType = Enum.RaycastFilterType.Whitelist  -- Включаем объекты из списка</p>
  <p id="lSI1">-- Выполняем Raycast<br />local origin = part1.Position<br />local direction = part3.Position - part1.Position<br />local rayResult = workspace:Raycast(origin, direction, raycastParams)</p>
  <p id="HBIc">if rayResult then<br />    print(&quot;Луч пересек объект: &quot; .. rayResult.Instance.Name)<br />else<br />    print(&quot;Луч не пересек ни одного объекта&quot;)<br />end<br />&#x60;&#x60;&#x60;</p>
  <p id="7CLd">### В этом примере:<br />- **Луч** будет двигаться от &#x60;part1&#x60; в направлении &#x60;part3&#x60;.<br />- **&#x60;part1&#x60; и &#x60;part2&#x60;** находятся в **Whitelist**, это значит, что луч будет взаимодействовать **только с этими частями**.<br />- Если луч столкнется с &#x60;part3&#x60; или любыми другими объектами, которые не входят в белый список, он **будет их игнорировать** и продолжит движение.<br />- **&#x60;part1&#x60; и &#x60;part2&#x60;** — это те объекты, с которыми луч будет &quot;взаимодействовать&quot; (пересекаться).</p>
  <p id="gMH9">### Что происходит при использовании **Whitelist**:<br />1. Луч **взаимодействует только с теми объектами, которые находятся в списке** &#x60;FilterDescendantsInstances&#x60;.<br />2. Все другие объекты, которые **не находятся в этом списке**, **игнорируются** и не будут приниматься во внимание при расчетах столкновений.<br />3. **Raycast** возвращает результат только если луч пересекает объекты из белого списка. Если луч пересекает что-то, что не входит в этот список, результат не будет найден (возвращается &#x60;nil&#x60;).</p>
  <p id="G0fS">### Важные моменты:<br />- **Whitelist** полезен, когда нужно работать с определенными объектами (например, только с игроками, определенными частями или каким-то конкретным набором объектов).<br />- Все объекты, не входящие в этот список, будут проигнорированы.</p>
  <p id="L9Bh"></p>
  <figure id="Jp7U" class="m_original">
    <img src="https://img1.teletype.in/files/c8/52/c852e253-5913-40af-a5a9-ddeea03482dc.png" width="1180" />
  </figure>
  <p id="3SVA">также вы увидите еще последние две надписи WhiteList и BlackList </p>
  <p id="W5SY">поясню что WhiteList и Include это одно и тоже как и BlackList  и Exclude просто в одном из обновлений добавили новые функции и использования старых теперь не рекомендуется но их по прежнемум можно использовать</p>
  <p id="sfcV">давайте укажем include</p>
  <p id="K9ts"></p>
  <figure id="VDXS" class="m_original">
    <img src="https://img1.teletype.in/files/43/88/43889327-2a1b-4371-aab8-b454a3a62555.png" width="947" />
  </figure>
  <p id="lDwD"></p>
  <figure id="L5JM" class="m_original">
    <img src="https://img4.teletype.in/files/7e/31/7e31033b-ac17-4125-9901-419dc24688b4.png" width="1132" />
  </figure>
  <p id="AFB5"></p>
  <p id="cf0w"></p>
  <p id="sCpB">также если что part3 это кирпич по середине</p>
  <figure id="IuXH" class="m_original">
    <img src="https://img1.teletype.in/files/02/7e/027ea1a9-7e2d-42bf-a292-93c837c9ff93.png" width="901" />
  </figure>
  <figure id="kzI2" class="m_original">
    <img src="https://img2.teletype.in/files/51/11/5111dbab-7b84-43c7-b255-29514eb31df8.png" width="1240" />
  </figure>
  <p id="YgMt"></p>
  <p id="RirF">видите луч игнорируют все парты кроме 3 так как мы добавили фильтр игнорировать все предметы кроме тех что в таблице а в таблице у нас парт3</p>
  <p id="c8Lq"></p>
  <p id="1dAn">давайте теперь наоборот</p>
  <p id="ZBR0"></p>
  <p id="bxA3"></p>
  <p id="xJ12"></p>
  <figure id="ETbB" class="m_original">
    <img src="https://img4.teletype.in/files/3f/b8/3fb8c2c9-635c-46c8-a6d2-20b86443845b.png" width="917" />
  </figure>
  <p id="S2v4"></p>
  <p id="wGpl">давайте теперь наоборот теперь он будет игнорировать все предметы которые в таблице</p>
  <p id="UWMu"></p>
  <p id="TYwW"></p>
  <figure id="5pOU" class="m_original">
    <img src="https://img2.teletype.in/files/17/bf/17bf516f-e89f-443f-872e-ac1526bb17c3.png" width="1095" />
  </figure>
  <p id="pkid"></p>
  <p id="a6pK"></p>
  <p id="uP73"></p>
  <p id="Kr6U">теперь он в сообщение игнорирует part3</p>
  <p id="cfa6"></p>
  <p id="CUW7"></p>
  <p id="TjY8"></p>
  <p id="GUEv">Зачем это нужно?</p>
  <p id="wURq">1. Оптимизация производительности</p>
  <p id="NtK6">Использование include и exclude позволяет уменьшить количество объектов, с которыми raycast будет взаимодействовать. Это важно, так как проверка на пересечения с большим количеством объектов может негативно сказаться на производительности игры. Ограничивая выбор объектов, вы можете сделать raycast более эффективным.</p>
  <p id="BjRX">2. Точность взаимодействий</p>
  <p id="JML6">Часто в играх есть объекты, которые не должны реагировать на raycast. Например, вы можете не хотеть, чтобы луч взаимодействовал с декоративными объектами или определенными частями игрового мира, такими как стены или пол. Используя exclude, вы можете избежать неожиданных взаимодействий.</p>
  <p id="GHtc">3. Создание уникального игрового опыта</p>
  <p id="cY3Y">В некоторых случаях вам может понадобиться, чтобы raycast реагировал только на определенные объекты. Например, в игре вы можете создать систему, где игроки могут стрелять по врагам, но не должны зацеплять свои собственные объекты или союзников. В этом случае вы можете использовать include для указания, что луч должен взаимодействовать только с вражескими объектами.</p>
  <p id="BvvV">Примеры использования</p>
  <p id="CGwB">1. Стрельба из оружия:<br />Если в вашей игре есть оружие, которое стреляет, вы можете использовать raycast для определения, попал ли игрок в противника. Вы можете использовать include, чтобы указать, что луч должен взаимодействовать только с объектами, имеющими тег &quot;Враг&quot;. В то же время, используя exclude, вы можете игнорировать объекты с тегом &quot;Игрок&quot;, чтобы предотвратить случайные попадания в союзников.</p>
  <p id="sFT5"><br /></p>
  <p id="wriZ">2. Проверка линии видимости:<br />Вы можете использовать raycast, чтобы проверить, видит ли игрок определенный объект. Используя exclude, вы можете игнорировать объекты, которые блокируют линию видимости, например, стены или другие преграды.</p>
  <p id="2PRW"><br /></p>
  <p id="PZ5R">3. Система квестов:<br />В играх с квестами вы можете использовать raycast для определения, взаимодействует ли игрок с объектом квеста. С помощью include вы можете указать, что луч должен реагировать только на объекты с тегом &quot;Квест&quot;.</p>
  <p id="GVeM"><br /></p>
  <p id="7gDh">теперь поговорим про вывод состояние луча и работы с обьектом которого он коснулся</p>
  <p id="htNv"></p>
  <p id="lUOd"></p>
  <figure id="s3Re" class="m_original">
    <img src="https://img4.teletype.in/files/b7/a7/b7a79e32-898d-45f6-b718-179130497b09.png" width="780" />
  </figure>
  <p id="b64x"></p>
  <p id="5HBu">если rayResult равен true тогда </p>
  <p id="ceBD"></p>
  <p id="nLmk"><strong>Доступ к свойствам объекта</strong>: Как только вы получили объект через <code>raycastResult.Instance</code>, вы можете получить доступ ко всем его свойствам и методам. Например, вы можете изменять свойства, взаимодействовать с объектом или проверять его характеристики.</p>
  <p id="JVXi"></p>
  <p id="fk63">в данном случае мы выводим его имя</p>
  <p id="xzZP"></p>
  <p id="YlqM">а во втором принте мы выводим позицию луча </p>
  <p id="rPRz"></p>
  <h3 id="AnQG">Зачем используется <code>tostring()</code>?</h3>
  <p id="f245">В данном случае, <code>tostring()</code> используется для преобразования значения <code>rayResult.Position</code> в строку. Это важно по нескольким причинам:</p>
  <ol id="SoYm">
    <li id="vV74"><strong>Тип данных</strong>:</li>
    <ul id="Rizh">
      <li id="8BS8"><code>rayResult.Position</code> является вектором (объектом типа <code>Vector3</code>), который представляет координаты в 3D пространстве. Когда вы пытаетесь конкатенировать (<code>..</code>) этот вектор с строкой, Lua требует, чтобы оба элемента были строками.</li>
      <li id="ngvz">Если вы попытаетесь просто использовать <code>rayResult.Position</code> без <code>tostring()</code>, возникнет ошибка, так как вы не можете объединить строку и объект типа <code>Vector3</code> напрямую.</li>
    </ul>
    <li id="W9cl"><strong>Форматирование вывода</strong>:</li>
    <ul id="r4Nd">
      <li id="v3OP">Используя <code>tostring()</code>, вы можете получить строковое представление вектора, которое будет выглядеть как <code>Vector3(1, 2, 3)</code> (где 1, 2 и 3 — это значения по осям X, Y и Z соответственно). Это делает вывод более понятным и удобным для чтения.</li>
    </ul>
    <li id="ImF6">конкатенирование значит сложение или соеденение двух строк</li>
  </ol>
  <p id="mM2x">в данном случае чтобы вектор не является строкой следовательно мы не можем выполнить конкатенацию следовательно мы вызываем функцию tostring() для превращения вектора в строку а потом в следующее очередь их уже сконкатенировать</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@stanfox/xjdKB-oVcoM</guid><link>https://teletype.in/@stanfox/xjdKB-oVcoM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox</link><comments>https://teletype.in/@stanfox/xjdKB-oVcoM?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox#comments</comments><dc:creator>stanfox</dc:creator><title>Делаем систему крови или возможность персонажа &quot;красиво&quot; умирать</title><pubDate>Tue, 27 Aug 2024 18:23:24 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/39/c3/39c32067-87a2-4e6f-9b3a-5a728fb05a78.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/15/be/15bee0aa-ff07-4355-991a-1b80d997b213.png"></img>в прошлом уроке мы сделали ловушки и также улучшили немного нашу систему это последней урок в нашей серии , в следущей серии мы сделаем с вами игру Doors]]></description><content:encoded><![CDATA[
  <p id="tong">в прошлом уроке мы сделали ловушки и также улучшили немного нашу систему это последней урок в нашей серии , в следущей серии мы сделаем с вами игру Doors</p>
  <p id="DAG6"></p>
  <p id="32tz">теперь перейдем к главному как сделать чтобы при стрельбе в игрока из оружия у него появлялась кровь?</p>
  <p id="LDLl"></p>
  <figure id="IkzK" class="m_original">
    <img src="https://img2.teletype.in/files/15/be/15bee0aa-ff07-4355-991a-1b80d997b213.png" width="1876" />
  </figure>
  <p id="Eugu"></p>
  <p id="1TnY">на этот раз я тоже буду использовать модельку из тулбокса про создание моделей и билдинг я сделаю отдельный урок вы если хотите может использовать свой автомат</p>
  <p id="jRA5"></p>
  <p id="R1n9">но сначала мы с вами сделаем кнопку + меню выбора оружия </p>
  <p id="muvQ"></p>
  <p id="oBV4"></p>
  <figure id="E2jm" class="m_original">
    <img src="https://img2.teletype.in/files/9b/79/9b79e3ad-8abc-49ef-ae0a-0f69de22c0c6.png" width="1876" />
  </figure>
  <p id="nLU9">в папке StarterGui мы добавляем screengui </p>
  <p id="iwqF"></p>
  <p id="kh01">Screengui - </p>
  <p id="ZSzE">В Roblox Studio <code>ScreenGui</code> (сокращение от &quot;Screen Graphical User Interface&quot;) — это элемент интерфейса, который отображает графические элементы на экране игрока. <code>ScreenGui</code> используется для создания различных интерфейсов, таких как кнопки, текстовые поля, шкалы здоровья, карты и другие визуальные элементы, которые игроки видят во время игры.</p>
  <h3 id="nKSp">Основные характеристики <code>ScreenGui</code></h3>
  <ol id="tJvJ">
    <li id="ZA9o"><strong>Расположение на экране</strong>: <code>ScreenGui</code> всегда отображается поверх игры и фиксируется к экрану игрока. Это означает, что элементы внутри <code>ScreenGui</code> не будут изменять своё положение относительно экрана, даже если камера или игрок будут двигаться.</li>
    <li id="AMov"><strong>Родительский объект для GUI-элементов</strong>: Внутри <code>ScreenGui</code> можно добавлять различные элементы интерфейса, такие как:Все эти элементы должны быть вложены в <code>ScreenGui</code> для того, чтобы быть видимыми на экране.</li>
    <ul id="yIhv">
      <li id="CqBS"><code>TextLabel</code>: Текстовые метки.</li>
      <li id="ZvNI"><code>TextButton</code>: Кнопки с текстом.</li>
      <li id="67AW"><code>ImageLabel</code>: Изображения.</li>
      <li id="2Rmd"><code>Frame</code>: Прямоугольные области, используемые для группировки других элементов.</li>
      <li id="74a1">И другие GUI-объекты.</li>
    </ul>
    <li id="uaqW"><strong>Область отображения</strong>: <code>ScreenGui</code> всегда отображается в пределах области экрана игрока. Это означает, что он &quot;привязан&quot; к экрану и не будет изменяться в зависимости от игрового мира. Например, элементы интерфейса, такие как панели управления, инвентари, карты и другие элементы HUD (Head-Up Display), всегда остаются на экране, независимо от позиции игрока в игровом мире.</li>
  </ol>
  <p id="Rm52"></p>
  <figure id="Hq3k" class="m_original">
    <img src="https://img3.teletype.in/files/ac/f1/acf1d0ae-cbad-44c5-81c6-bec809aa2c80.png" width="1842" />
  </figure>
  <p id="qoPc"></p>
  <p id="vzwf">Выбираем TextButton</p>
  <p id="uGgL"></p>
  <figure id="VleL" class="m_original">
    <img src="https://img4.teletype.in/files/bb/a5/bba5acb3-c674-4ec2-b541-5ff8891b8db6.png" width="1762" />
  </figure>
  <figure id="7yjS" class="m_original">
    <img src="https://img3.teletype.in/files/2c/43/2c433419-adba-4078-a4db-5dfdd568bc99.png" width="1201" />
  </figure>
  <p id="K3Mb">Дизайн кнопки вы можете выбрать сами в Properties для тех кто не знает как я покажу как сделать такую же кнопку или как настроить ее внешний вид</p>
  <p id="7DGe"></p>
  <figure id="Jyc2" class="m_original">
    <img src="https://img2.teletype.in/files/d6/aa/d6aa8696-907b-4542-a04c-7040a10ebb14.png" width="1737" />
  </figure>
  <p id="yLZb"></p>
  <p id="8eyR">для тех у кого также как у меня нету Properties </p>
  <figure id="dLvv" class="m_original">
    <img src="https://img4.teletype.in/files/33/3a/333aa381-5b54-4d1c-9549-b939dee58480.png" width="1621" />
  </figure>
  <p id="qnVp"></p>
  <p id="9wRs">Мы заходим во View и выбираем properties</p>
  <p id="xfZV"></p>
  <figure id="tnUJ" class="m_original">
    <img src="https://img4.teletype.in/files/74/d2/74d2d4b3-f3e2-4fea-9aaf-d525626d2dd9.png" width="1792" />
  </figure>
  <p id="39y2"></p>
  <p id="hhL4"></p>
  <p id="j4r0">делаю черный цвет нашего бэкграунда</p>
  <p id="DlkD"></p>
  <p id="fFTL"></p>
  <figure id="yfBm" class="m_original">
    <img src="https://img1.teletype.in/files/0d/21/0d216e7a-8ed4-4109-9aa0-0931b4f70ab6.png" width="1730" />
  </figure>
  <p id="2Iyy"></p>
  <p id="6HnK">дальше меняю цвет текста</p>
  <p id="oAR7"></p>
  <figure id="stHb" class="m_original">
    <img src="https://img1.teletype.in/files/8f/b4/8fb44e8b-0353-4fc2-9c57-24e89f4b9b87.png" width="1717" />
  </figure>
  <p id="WOYw"></p>
  <p id="813l">и увеличиваем размер текста в пункте TextScale</p>
  <p id="T1Lx"></p>
  <figure id="hPNs" class="m_original">
    <img src="https://img2.teletype.in/files/9a/28/9a2860df-b09a-411d-ad5f-f831d5a67326.png" width="1910" />
  </figure>
  <p id="xhHQ"></p>
  <p id="Uzb4">Также еще в нашу папку Screengui добавляем обьект с именем  Frame</p>
  <p id="H0DQ">(я также если что поменял имя нашего Textbutton на MenuButton для удобства)</p>
  <p id="i5t3">Также добавляем внутрь нашего ScreenGui cкрипт</p>
  <p id="gzIY">Только поправку не Script а Localscript щас обьясню почему</p>
  <p id="BygG"></p>
  <p id="HqTZ">В Roblox Studio существуют два основных типа скриптов для работы с Lua-кодом: <strong>Script</strong> и <strong>LocalScript</strong>. Они отличаются главным образом тем, где и как они выполняются, а также какие функции и данные им доступны. Вот основные различия:</p>
  <h3 id="HIFI">1. <strong>Script (Скрипт)</strong></h3>
  <ul id="YAv3">
    <li id="ICtS"><strong>Место выполнения:</strong> Скрипты выполняются на стороне сервера. Это означает, что код внутри Script запускается и работает на сервере Roblox.</li>
    <li id="wp27"><strong>Область видимости:</strong> Скрипты имеют доступ к серверным функциям и объектам. Они могут изменять состояние игры, доступное для всех игроков.</li>
    <li id="cOBj"><strong>Примеры использования:</strong></li>
    <ul id="9Jhi">
      <li id="0P9E">Управление серверной логикой игры (например, изменение состояния игры, управление спавном объектов).</li>
      <li id="bfqi">Взаимодействие с DataStore для хранения и загрузки данных игроков.</li>
      <li id="TO8E">Создание и управление общедоступными объектами (например, расположение деталей, управление монстрами).</li>
    </ul>
  </ul>
  <h3 id="2EPo">2. <strong>LocalScript (Локальный скрипт)</strong></h3>
  <ul id="c95G">
    <li id="2z7g"><strong>Место выполнения:</strong> Локальные скрипты выполняются на стороне клиента, то есть непосредственно на устройстве игрока.</li>
    <li id="jNMd"><strong>Область видимости:</strong> Локальные скрипты имеют доступ к объектам и функциям, которые доступны только клиенту, например, графический интерфейс пользователя (GUI) или управление камерой.</li>
    <li id="EhRv"><strong>Примеры использования:</strong></li>
    <ul id="beoj">
      <li id="OIwG">Управление интерфейсом пользователя (например, отображение HUD или диалогов).</li>
      <li id="TGut">Управление камерой, анимацией или другими визуальными эффектами, которые специфичны для каждого игрока.</li>
      <li id="TL1v">Обработка ввода пользователя (например, нажатия клавиш, движения мыши).</li>
    </ul>
  </ul>
  <h3 id="gkOX">3. <strong>Особенности взаимодействия</strong></h3>
  <ul id="LO2g">
    <li id="U3td"><strong>LocalScript не может напрямую изменять объекты на сервере</strong>, для этого ему нужно использовать <strong>RemoteEvent</strong> или <strong>RemoteFunction</strong> для отправки запроса на сервер, чтобы серверный Script мог выполнить необходимую работу.</li>
    <li id="UY9s"><strong>Script не может напрямую взаимодействовать с клиентскими объектами</strong>, такими как интерфейс пользователя, и тоже должен использовать удаленные вызовы для взаимодействия с клиентом.</li>
  </ul>
  <h3 id="IITO">4. <strong>Где они могут быть размещены:</strong></h3>
  <ul id="5Y01">
    <li id="ydAv"><strong>Script</strong> можно размещать в ServerScriptService, Workspace и других местах, которые доступны серверу.</li>
    <li id="NTVs"><strong>LocalScript</strong> должен быть размещен в объектах, которые доступны клиенту, таких как StarterPlayerScripts, StarterCharacterScripts, StarterGui и некоторых других.</li>
  </ul>
  <p id="Hice">Таким образом, основное различие между Script и LocalScript в Roblox Studio заключается в том, где они выполняются (на сервере или на клиенте) и какие функции они могут использовать.</p>
  <p id="Gehw"></p>
  <p id="fCMq">также LocalScript гораздо легче взломать  поэтому все важные манипуляции и данные размещяем в script чтобы читеры не могли получить существенное превосходство</p>
  <p id="MKfD"></p>
  <p id="0WSg">так а теперь к главному</p>
  <p id="0qhY"></p>
  <figure id="hbap" class="m_original">
    <img src="https://img2.teletype.in/files/9f/e0/9fe0ff36-17c3-4ccd-85a8-ce73d73f5a0a.png" width="1841" />
  </figure>
  <p id="WN1i"></p>
  <p id="uGN6">в нашей переменной мы обращаемся к родителю нашего скрипта (родитель это папка а ребенок материал который расположен в папке в нашем же случае Frame является ребенком StarterGui</p>
  <p id="xbQD"></p>
  <figure id="fYOd" class="m_original">
    <img src="https://img4.teletype.in/files/b4/f3/b4f35e20-c887-4169-83ac-35b22eeed529.png" width="1579" />
  </figure>
  <p id="w13g"></p>
  <p id="YmXd"><strong><code>menuButton</code></strong>:</p>
  <ul id="WntO">
    <li id="f51a">Это переменная, которая ссылается на объект типа <code>TextButton</code> (кнопку), которую мы создали в <code>ScreenGui</code>. Эта кнопка отображается на экране игрока и может быть нажата игроком.</li>
    <li id="vnKz">у нас есть кнопка с именем <code>MenuButton</code>,  переменная <code>menuButton</code> содержит ссылку на этот объект.</li>
  </ul>
  <p id="asrs"><strong><code>MouseButton1Click</code></strong>:</p>
  <ul id="s1uJ">
    <li id="ilTl">Это <strong>событие</strong>, которое срабатывает, когда пользователь нажимает на кнопку с левой кнопкой мыши.</li>
    <li id="D9zP">В Roblox все GUI-элементы могут иметь события, которые запускаются при определённых действиях, таких как нажатие кнопки или перемещение мыши. В данном случае событие <code>MouseButton1Click</code> связано с левым щелчком мыши по кнопке.</li>
  </ul>
  <p id="HOrC"><strong><code>Connect(OnOff)</code></strong>:</p>
  <ul id="FxPB">
    <li id="Sw2i">Метод <code>Connect</code> используется для <strong>подключения</strong> функции к событию. Когда событие происходит (в данном случае, когда пользователь нажимает на кнопку), вызывается подключенная функция.</li>
    <li id="MK7k"><code>OnOff</code> — это имя  нашей функции, котораячс будет выполнена, когда событие <code>MouseButton1Click</code> сработает. Например, функция <code>OnOff</code> может управлять видимостью меню, показывая или скрывая его.</li>
  </ul>
  <p id="b5FM"></p>
  <figure id="rWsr" class="m_original">
    <img src="https://img2.teletype.in/files/19/9e/199e4960-0fd6-4eb6-80ae-7dfdf6e8786c.png" width="1882" />
  </figure>
  <p id="Vgjr"></p>
  <p id="wOny">я немного поменял наш Frame</p>
  <p id="ZbuR"></p>
  <figure id="Lc58" class="m_original">
    <img src="https://img3.teletype.in/files/20/70/2070e6d3-ba6f-4b8b-9f12-c59adf82bbd0.png" width="1901" />
  </figure>
  <p id="xo5E"></p>
  <p id="LCVS">теперь я добавил 3 ImageButton  это кнопка с картинкой я на каждой кнопке размещу картинку оружия которую получит персонаж при нажатии а также переименую каждую кнопку в названия оружия</p>
  <p id="5A8r">name button</p>
  <p id="lSxm"></p>
  <p id="fGyj">**Example**</p>
  <p id="pGIb"> AK-47 BUTTON</p>
  <p id="KcoF"></p>
  <figure id="aKM5" class="m_original">
    <img src="https://img3.teletype.in/files/af/1c/af1c0cad-13c8-4a64-8d6f-1cc3b67a3132.png" width="1324" />
  </figure>
  <p id="csYJ"></p>
  <p id="jrwy">Теперь после того как я пронумеровал их, мы в Properties поставим саму картинку</p>
  <p id="sRVJ"></p>
  <figure id="jL6b" class="m_original">
    <img src="https://img1.teletype.in/files/cb/d7/cbd7b20d-0c96-4d46-86c9-1b427def7f01.png" width="1357" />
  </figure>
  <p id="Xy2s"></p>
  <p id="pXZi">теперья на скорую руку подробал изображения вы можете поставить свои так как эти далеко не самые лучшие </p>
  <p id="dDi9">про дизайн gui будет отдельная статья + в конце статьи будет ссылка на полезный плагин</p>
  <p id="Y8VQ"></p>
  <p id="4CWR"></p>
  <figure id="hClT" class="m_original">
    <img src="https://img3.teletype.in/files/2e/5c/2e5c8664-5a6c-497d-a1a2-de4b0cee7ae7.png" width="1013" />
  </figure>
  <p id="reCS"></p>
  <p id="f6KB">теперь нужно найти модельки наших оружий причем которые работают и могут стрелять</p>
  <p id="iPil"></p>
  <figure id="HU0l" class="m_original">
    <img src="https://img1.teletype.in/files/c3/7a/c37af7f6-c6b1-4ef9-858a-64da61c215aa.png" width="1761" />
  </figure>
  <p id="q0zi"></p>
  <p id="lk4T">после того как нашли наши модельки переносим их в ServerStorage (это наше хранилище где можно хранить предметы карты и прочее) </p>
  <p id="bgxq"></p>
  <figure id="5lNU" class="m_original">
    <img src="https://img4.teletype.in/files/34/67/3467759d-16f0-49b6-8953-7e66b06cee3e.png" width="1735" />
  </figure>
  <p id="WvaN"></p>
  <p id="0d3R">добавляем еще один скрипт </p>
  <p id="51RZ"></p>
  <p id="aWeP">и теперь добавляем в ReplicatedStorage Remove event</p>
  <p id="a65W"></p>
  <figure id="hX0k" class="m_original">
    <img src="https://img4.teletype.in/files/b9/07/b907548b-ed22-40e6-bb4e-18dcddb5aa63.png" width="272" />
  </figure>
  <p id="0pQy"></p>
  <p id="y2fa"></p>
  <p id="tShl"></p>
  <p id="dt8d">Remote Event в Roblox Studio — это один из ключевых механизмов, позволяющих взаимодействовать между клиентом и сервером в игре. Давайте разберёмся, что это такое, зачем он нужен и как его использовать.</p>
  <h3 id="V7pK">Что такое Remote Event?</h3>
  <p id="OO75"><strong>Remote Event</strong> — это объект, который используется для передачи сообщений между клиентом (игроком) и сервером (серверной частью игры). В Roblox, игры работают по принципу клиент-серверной архитектуры, где клиент и сервер — это два разных &quot;мира&quot;:</p>
  <ul id="la93">
    <li id="7Fed"><strong>Клиент</strong> — это устройство игрока (например, его компьютер или телефон), которое отображает игру, позволяет управлять персонажем и так далее.</li>
    <li id="rclz"><strong>Сервер</strong> — это основная часть игры, которая управляет всей логикой, например, где находятся объекты, как они взаимодействуют, и так далее.</li>
  </ul>
  <p id="H7b9">Из-за этой разделённости клиент и сервер не могут напрямую &quot;видеть&quot; или управлять друг другом, поэтому нужен способ передавать данные между ними. И вот тут на сцену выходит Remote Event.</p>
  <h3 id="tXbb">Зачем нужен Remote Event?</h3>
  <ol id="h7IJ">
    <li id="Eluc"><strong>Безопасность</strong>: Сервер управляет важной логикой игры, такой как проверка правил, обработка игровых данных, и так далее. Если бы клиент мог сам всё это контролировать, то игроки могли бы читерить, меняя данные у себя на устройстве. Поэтому клиент не может напрямую изменять важные данные на сервере — ему нужно отправлять запросы с помощью Remote Event, а сервер уже решает, что с этими данными делать.</li>
    <li id="AFKQ"><strong>Синхронизация</strong>: В игре могут быть действия, которые нужно синхронизировать между разными игроками. Например, если один игрок нажал кнопку, то у всех остальных игроков должно что-то произойти. Для этого клиент отправляет событие на сервер, а сервер уже рассылает это событие всем клиентам.</li>
  </ol>
  <h3 id="GWR7">Как работает Remote Event?</h3>
  <p id="gplp">Работа с Remote Event основана на двух основных методах:</p>
  <ol id="ASfr">
    <li id="uXkm"><strong>FireServer</strong> — используется клиентом для отправки сообщения на сервер.</li>
    <li id="ontz"><strong>FireClient</strong> — используется сервером для отправки сообщения на конкретный клиент.</li>
    <li id="DeF7"><strong>FireAllClients</strong> — используется сервером для отправки сообщения всем клиентам.</li>
  </ol>
  <h3 id="4Q1D">Пример использования Remote Event</h3>
  <p id="JreA">Представим, что у вас в игре есть кнопка, которую игрок нажимает, и это должно привести к каким-то изменениям на сервере, например, выдаче очков.</p>
  <ol id="MAL3">
    <li id="FKCB"><strong>На стороне клиента</strong>:</li>
    <ul id="11Gw">
      <li id="prK6">Игрок нажимает кнопку.</li>
      <li id="JYOD">Скрипт на клиенте (местный скрипт) вызывает <code>RemoteEvent:FireServer()</code>, передавая какие-то данные на сервер, например, количество очков.</li>
    </ul>
    <li id="lJUl"><strong>На стороне сервера</strong>:</li>
    <ul id="dkgl">
      <li id="8hiX">Сервер получает сообщение от клиента с помощью <code>RemoteEvent.OnServerEvent:Connect(function(player, data) ... end)</code>.</li>
      <li id="7xoh">Обрабатывает это сообщение, например, добавляет очки игроку.</li>
      <li id="uvYR">Если нужно, сервер может отправить обратно информацию клиенту с помощью <code>RemoteEvent:FireClient()</code>.</li>
    </ul>
  </ol>
  <p id="GzFc"></p>
  <p id="sjvO">и сегодня мы как раз таки будем выдывать предмет нашему игру с помощью данной конструкции</p>
  <p id="NEvO"></p>
  <p id="uhia"></p>
  <p id="dClo">так а теперь переходим к скрипту</p>
  <p id="IygS"></p>
  <p id="vM0Z"></p>
  <figure id="JqmL" class="m_original">
    <img src="https://img4.teletype.in/files/f2/c6/f2c64e25-4250-4db8-94f6-b2b23a6f223e.png" width="320" />
  </figure>
  <p id="OQmH"></p>
  <p id="Lwvj"></p>
  <p id="Wkmf"></p>
  <p id="aBpR">напомню что надо localsript так как мы будем использовать клиент → серверную архитектуру мы будем обращаться из клиента (компьютера игрока) на серверную функцию  мы с вами уже делали такой трюк в этой статье </p>
  <p id="EeXG"><a href="https://teletype.in/@antichrist_squid/x4AvHZLlEeQ" target="_blank">https://teletype.in/@antichrist_squid/x4AvHZLlEeQ</a></p>
  <p id="k6tq"></p>
  <figure id="ZVwX" class="m_original">
    <img src="https://img4.teletype.in/files/f0/fc/f0fc5bb5-8164-4b0a-93fe-e048d4516e17.png" width="1919" />
  </figure>
  <h3 id="kdP6">Переменные</h3>
  <pre id="wNkT">luaCopy codelocal ak47 = script.Parent:WaitForChild(&quot;AK-47 BUTTON&quot;)
local m12button = script.Parent:WaitForChild(&quot;m12 button&quot;)
local awpbutton = script.Parent:WaitForChild(&quot;AWP Button&quot;)
</pre>
  <ul id="Rfye">
    <li id="LAR7"><strong><code>ak47</code>, <code>m12button</code>, <code>awpbutton</code></strong>: Здесь создаются три переменные, которые будут ссылаться на кнопки которые мы с вами создали. Они используются для того, чтобы привязать к ним функционал. Каждая переменная ссылается на кнопку с соответствующим названием (&quot;AK-47 BUTTON&quot;, &quot;m12 button&quot;, &quot;AWP Button&quot;). Эти кнопки находятся в родительском объекте <code>script.Parent</code>, который указывает на родительский элемент скрипта (обычно это GUI объект).</li>
  </ul>
  <h3 id="MWDF">Функция для выдачи оружия</h3>
  <pre id="lOII">luaCopy codelocal givingweapon = game.ReplicatedStorage.RemoteEvent
</pre>
  <ul id="UWC8">
    <li id="nfY3"><strong><code>givingweapon</code></strong>: Создаётся переменная <code>givingweapon</code>, которая ссылается на событие типа <code>RemoteEvent</code>, находящееся в <code>ReplicatedStorage</code>. Это событие будет использовано для отправки сигнала с клиента на сервер (что-то вроде межсессионного сообщения между клиентом и сервером).</li>
  </ul>
  <h3 id="pipZ">Подключение кнопки к функции</h3>
  <pre id="hUIC">luaCopy codeak47.MouseButton1Click:Connect(function(plr)
	givingweapon:FireServer(plr)
end)
</pre>
  <ul id="kbgB">
    <li id="dgyJ"><strong><code>ak47.MouseButton1Click:Connect(function(plr) ... end)</code></strong>: Эта строка кода говорит, что когда игрок нажимает на кнопку <code>ak47</code>, выполняется функция, переданная в <code>Connect</code>.</li>
    <li id="Na8t"><strong><code>givingweapon:FireServer(plr)</code></strong>: Внутри функции вызывается метод <code>FireServer</code>, который отправляет сигнал на сервер с параметром <code>plr</code> (в данном случае, это, вероятно, ссылка на объект игрока).</li>
  </ul>
  <h3 id="VLzC">Что это всё значит?</h3>
  <ul id="8Jd2">
    <li id="lf3y"><strong>Переменные <code>ak47</code>, <code>m12button</code>, и <code>awpbutton</code></strong>: Эти переменные позволяют вам работать с конкретными кнопками на пользовательском интерфейсе (UI).</li>
    <li id="D2k0"><strong>Событие <code>RemoteEvent</code> (<code>givingweapon</code>)</strong>: Оно используется для того, чтобы сигнализировать серверу о необходимости выдать игроку оружие. Это нужно, поскольку в Roblox действия, связанные с изменением данных игры, часто должны быть выполнены на сервере.</li>
    <li id="4GSF"><strong>Обработка нажатия кнопки</strong>: Когда игрок кликает по кнопке <code>ak47</code>, клиент отправляет запрос на сервер через <code>givingweapon:FireServer(plr)</code>. Сервер, получив этот сигнал, может выполнить выдачу оружия.</li>
  </ul>
  <p id="jcb0"></p>
  <p id="k3Uq">грубо говоря при нажатии наш скрипт говорит серверу &quot;Эй, босс, этому игроку нужен АК-47!&quot; И сервер мгновенно достаёт оружие и вручает его</p>
  <p id="Wq84"></p>
  <p id="KyHz"></p>
  <p id="itLi"></p>
  <p id="23u0">хорошо а теперь пришло время к реализации серверного скрипта</p>
  <p id="r6tf"></p>
  <figure id="cqRu" class="m_original">
    <img src="https://img4.teletype.in/files/f5/bc/f5bc7e87-513a-4585-a1fe-6071b3cb47f0.png" width="208" />
  </figure>
  <p id="jUwq"></p>
  <p id="299M"></p>
  <p id="u4Nl"></p>
  <p id="idi2">добавляем на сервер скрипт </p>
  <h3 id="C63s">Что такое ServerScriptService?</h3>
  <p id="Dzde">Когда вы создаёте игру в Roblox, существует два основных типа скриптов: <strong>серверные</strong> и <strong>клиентские</strong>. Серверные скрипты работают на сервере и обычно используются для выполнения задач, которые должны быть одинаковыми для всех игроков в игре, например:</p>
  <ul id="vsai">
    <li id="tlIh">Управление игровыми объектами и их состояниями (например, позиция или видимость объектов).</li>
    <li id="x6YC">Обработка действий, связанных с несколькими игроками (например, синхронизация состояния игры).</li>
    <li id="y9g6">Управление экономикой игры (например, выдача внутриигровой валюты или предметов).</li>
  </ul>
  <h3 id="tnb3">Почему важно использовать ServerScriptService?</h3>
  <ol id="sxGC">
    <li id="iQXf"><strong>Безопасность</strong>: Скрипты, размещенные в ServerScriptService, не видны и недоступны для игроков. Это важно, потому что игроки не могут их изменить или взломать. Например, если вы хотите сохранить логику выдачи наград или обработку покупок, лучше разместить этот код в ServerScriptService.</li>
    <li id="GG7Q"><strong>Организация</strong>: ServerScriptService помогает структурировать ваш проект. Вы можете хранить все серверные скрипты в одном месте, что упрощает их управление и редактирование.</li>
    <li id="YLHA"><strong>Серверная логика</strong>: В ServerScriptService можно размещать скрипты, которые управляют тем, что происходит на сервере. Например, когда игрок собирает предмет, серверный скрипт может обрабатывать этот процесс, обеспечивая правильное взаимодействие между всеми игроками.</li>
  </ol>
  <figure id="dRfy" class="m_original">
    <img src="https://img3.teletype.in/files/68/21/6821d77c-caeb-4fd9-a97a-f737b55df85f.png" width="919" />
  </figure>
  <p id="S6nB"></p>
  <p id="WC5Y"></p>
  <p id="irwk"></p>
  <h3 id="FqTZ">1. Подключение к удалённому событию (RemoteEvent)</h3>
  <pre id="WrN2">local givingweapon = game.ReplicatedStorage.RemoteEvent
</pre>
  <ul id="h8g6">
    <li id="OpCF">Эта строка находит и сохраняет ссылку на объект <code>RemoteEvent</code>, который находится в <code>ReplicatedStorage</code>.</li>
    <li id="vw2g"><strong><code>RemoteEvent</code></strong> — это специальный объект в Roblox, который позволяет клиенту (игроку) и серверу обмениваться сообщениями. В данном случае, это объект, который сервер будет слушать, чтобы понять, когда игрок запросил оружие.</li>
  </ul>
  <h3 id="NUH8">2. Обработка события на сервере</h3>
  <pre id="XG13">degivingweapon.OnServeшщEvent:Connect(function(plr)
</pre>
  <ul id="4S5E">
    <li id="Kpjv">Этот код прослушивает событие <code>OnServerEvent</code>, которое срабатывает, когда клиент отправляет сигнал на сервер, используя <code>RemoteEvent</code>.</li>
    <li id="lY32">Когда происходит это событие, вызывается функция, которая получает параметр <code>plr</code> (это игрок, который отправил запрос).</li>
  </ul>
  <h3 id="cYn2">3. Клонирование и выдача оружия</h3>
  <pre id="ij39">game.ServerStorage[&quot;ak47&quot;]:Clone().Parent = plr:WaitForChild(&quot;Backpack&quot;)
game.ServerStorage[&quot;ak47&quot;]:Clone().Parent = plr:WaitForChild(&quot;StarterGear&quot;)
</pre>
  <ul id="c3Sp">
    <li id="E4iE"><strong><code>game.ServerStorage[&quot;ak47&quot;]</code></strong> — этот код обращается к объекту <code>ak47</code>, который хранится в <code>ServerStorage</code>.</li>
    <ul id="0dqJ">
      <li id="9eev"><strong><code>ServerStorage</code></strong> — это хранилище, в котором хранятся объекты, доступные только серверу. Игроки не могут получить к ним доступ напрямую.</li>
    </ul>
    <li id="LRI7"><strong><code>Clone()</code></strong> — эта команда создаёт копию объекта <code>ak47</code>.</li>
    <li id="UZQk"><strong><code>Parent = plr:WaitForChild(&quot;Backpack&quot;)</code></strong> — эта часть кода перемещает клонированный объект в рюкзак игрока (<code>Backpack</code>). Таким образом, оружие появляется у игрока и он может его использовать.</li>
    <li id="QggB"><strong><code>Parent = plr:WaitForChild(&quot;StarterGear&quot;)</code></strong> — эта строка по вашему желанию она отвечает за то что даже после смерти нашего персонажа во время респпуана у него всероно останется </li>
  </ul>
  <p id="k54a"></p>
  <p id="YrY0">также в качестве практики реализуете красную кнопку при нажатии на которую у нас пропадает наша меню</p>
  <p id="1e2V"></p>
  <p id="Jp4r">теперь к основе</p>
  <p id="cjiq"></p>
  <figure id="QHuL" class="m_original">
    <img src="https://img3.teletype.in/files/65/3e/653eca31-caca-4234-90ac-03dd3993741f.png" width="361" />
  </figure>
  <p id="OgpG"></p>
  <p id="Jyqe">добавляете в это место скрипт и копируете туда наш код от капкана</p>
  <p id="wZSh"></p>
  <p id="OU3k">теперь добавим несколько изменений</p>
  <p id="W8kU"></p>
  <p id="b3Is"></p>
  <figure id="pRgs" class="m_original">
    <img src="https://img2.teletype.in/files/12/f8/12f8e7da-548e-47f7-8d8c-6b1387f60019.png" width="756" />
  </figure>
  <figure id="mOhX" class="m_original">
    <img src="https://img3.teletype.in/files/ee/9f/ee9fd7e5-21e2-4ecb-9cd1-58133464a1ff.png" width="1244" />
  </figure>
  <figure id="8DQY" class="m_original">
    <img src="https://img1.teletype.in/files/0d/e7/0de73420-a2fd-4ca2-839d-b715ec969cf3.png" width="1324" />
  </figure>
  <p id="lPvW"></p>
  <p id="TnIc"></p>
  <p id="uAL8"></p>
  <p id="HuJV">нашу основую функцию не меняем единственное что мы поменяем это условие ее вызова</p>
  <p id="SlYn"></p>
  <p id="ECgK"></p>
  <figure id="GB1e" class="m_original">
    <img src="https://img1.teletype.in/files/86/17/86177e2e-ccf0-4870-8a54-c88a236d9116.png" width="599" />
  </figure>
  <p id="4nNf"></p>
  <p id="ALs8">тут нужно немного поменять:</p>
  <p id="xJpw"></p>
  <figure id="aHSa" class="m_original">
    <img src="https://img4.teletype.in/files/7e/db/7edbe7d9-aaa7-4f7f-9569-544427680f94.png" width="792" />
  </figure>
  <p id="y9Nc"></p>
  <p id="CH8N">для начала в функции stopBleeding убираем редактирование кирпича</p>
  <p id="RuUr"></p>
  <figure id="tPeB" class="m_original">
    <img src="https://img4.teletype.in/files/b2/b3/b2b306a3-6e12-4dce-bac0-64158fd500d0.png" width="523" />
  </figure>
  <p id="bOqA"></p>
  <p id="kD6N">теперь просто удаляем функцию onTouch она нам не нужна:</p>
  <p id="dbdG"></p>
  <figure id="3HaD" class="m_original">
    <img src="https://img4.teletype.in/files/32/3d/323d864f-4049-48e1-8240-565f2a3ceb5a.png" width="1725" />
  </figure>
  <figure id="JU81" class="m_original">
    <img src="https://img1.teletype.in/files/ca/ad/caad390a-04ae-4715-b562-ee9ba689bb5c.png" width="1876" />
  </figure>
  <p id="jItF"></p>
  <p id="wQzO">теперь пишем новую функцию onHealthChanged</p>
  <p id="nTO1"></p>
  <figure id="2g85" class="m_original">
    <img src="https://img3.teletype.in/files/22/fd/22fdd104-8d22-498e-a245-2ac13c5b7d57.png" width="973" />
  </figure>
  <p id="mkTf">также для вашего удобства я специально расставил коментарии чтобы было визуально удобно смотреть чтобы даже только смотря картинки было все понятно и ясно.</p>
  <p id="yrzo"></p>
  <p id="QjbX"></p>
  <p id="AGbh"></p>
  <pre id="GQdZ">local function onHealthChanged(health)
	-- Если здоровье уменьшилось и персонаж не кровоточит, запускаем кровотечение
	if health &lt; humanoid.MaxHealth and not isBleeding then
		startBleeding(humanoid.Parent)
	end
end
</pre>
  <ol id="wJX7">
    <li id="pSKE"><strong>Определение функции:</strong></li>
    <ul id="kQ1u">
      <li id="MZiu"><code>local function onHealthChanged(health)</code> — Эта строка объявляет локальную функцию с именем <code>onHealthChanged</code>. Функция принимает один параметр — <code>health</code>, который представляет текущее значение здоровья персонажа.</li>
    </ul>
    <li id="C9i3"><strong>Проверка состояния:</strong></li>
    <ul id="OgwP">
      <li id="Z53T"><code>if health &lt; humanoid.MaxHealth and not isBleeding then</code> — Эта строка проверяет два условия:</li>
      <ul id="PJ3g">
        <li id="xxpl"><code>health &lt; humanoid.MaxHealth</code> — Проверяет, уменьшилось ли текущее здоровье (<code>health</code>) по сравнению с максимальным здоровьем (<code>humanoid.MaxHealth</code>). Это значит, что персонаж получил урон.</li>
        <li id="pW1S"><code>not isBleeding</code> — Проверяет, не кровоточит ли уже персонаж (<code>isBleeding</code> должно быть переменной, которая указывает, кровоточит ли персонаж в данный момент).</li>
      </ul>
    </ul>
    <li id="MO4G"><strong>Запуск эффекта кровотечения:</strong></li>
    <ul id="T1Ul">
      <li id="CMWL"><code>startBleeding(humanoid.Parent)</code> — Если оба условия истинны (здоровье уменьшилось и персонаж не кровоточит), вызывается функция <code>startBleeding</code>, передавая ей родительский объект персонажа (<code>humanoid.Parent</code>). Эта функция отвечает за запуск эффекта кровотечения для персонажа.</li>
    </ul>
  </ol>
  <p id="cBDS"><strong>Что делает этот код:</strong> Этот код следит за изменением здоровья персонажа. Когда здоровье персонажа уменьшается (то есть, когда он получает урон) и при этом он не кровоточит, код запускает функцию, которая инициирует эффект кровотечения.</p>
  <p id="y9cJ"></p>
  <p id="dQHi"></p>
  <p id="voD7"></p>
  <p id="ohpi">теперь пишем следующую функцию которая будет отслеживать нашего игрока </p>
  <p id="pdyH"></p>
  <p id="dW8Z"></p>
  <p id="wTov"></p>
  <figure id="gzE0" class="m_original">
    <img src="https://img4.teletype.in/files/f8/b4/f8b4db9b-495b-4e23-a49c-d8bf615966ed.png" width="809" />
  </figure>
  <p id="fOuj"></p>
  <ol id="SpOh">
    <li id="rMl9"><strong>Функция <code>onCharacterAdded</code></strong>:</li>
    <ul id="1Bb7">
      <li id="gUp3">Эта функция вызывается каждый раз, когда к игроку добавляется новый персонаж в игру (например, когда игрок респавнится).</li>
      <li id="yc6a">Функция получает параметр <code>character</code>, который представляет собой объект персонажа игрока.</li>
      <li id="ZvBv">Внутри функции она пытается найти объект <code>Humanoid</code> в персонаже. <code>Humanoid</code> — это компонент, который управляет здоровьем, анимациями и другими аспектами персонажа.</li>
      <li id="A00D">Если <code>Humanoid</code> найден (то есть, если он существует), функция подключает две обработки событий:</li>
      <ul id="rX0Z">
        <li id="BTF5"><code>HealthChanged</code>: Событие, которое срабатывает каждый раз, когда изменяется здоровье персонажа. Для этого события подключается функция <code>onHealthChanged</code>, которая будет вызвана при изменении здоровья.</li>
        <li id="JNVN"><code>Died</code>: Событие, которое срабатывает, когда персонаж умирает. Для этого события подключается функция <code>stopBleeding</code>, которая остановит кровотечение (или выполнит другую соответствующую логику).</li>
      </ul>
    </ul>
    <li id="QOtY"><strong>Подключение к событию <code>CharacterAdded</code></strong>:</li>
    <ul id="tZfx">
      <li id="q4cZ"><code>player.CharacterAdded:Connect(onCharacterAdded)</code> — эта строка подключает функцию <code>onCharacterAdded</code> к событию, которое срабатывает каждый раз, когда у игрока добавляется новый персонаж.</li>
      <li id="zm6S">Это означает, что каждый раз, когда персонаж игрока появляется или респавнится, функция <code>onCharacterAdded</code> будет вызвана, чтобы установить необходимые обработчики событий.</li>
    </ul>
    <li id="ZE7K"><strong>Проверка существующего персонажа</strong>:</li>
    <ul id="1Wlz">
      <li id="EilP"><code>if player.Character then onCharacterAdded(player.Character)</code> — это условие проверяет, существует ли персонаж игрока в момент выполнения скрипта. Если персонаж уже существует, функция <code>onCharacterAdded</code> вызывается сразу, чтобы установить обработчики событий, не дожидаясь следующего появления персонажа.</li>
    </ul>
  </ol>
  <p id="8xVN"><strong>Общий смысл</strong>: Этот код обеспечивает автоматическое подключение функций для обработки изменений здоровья и смерти персонажа игрока. Он делает это как при создании нового персонажа, так и при наличии персонажа в момент выполнения скрипта.</p>
  <p id="KxDK"></p>
  <p id="hiPw"></p>
  <p id="q7AL">теперь можете тестировать все должно работать </p>
  <p id="CyXh"></p>
  <p id="bqvN">я думаю уже после серии про Doors я выдвину пару улучшений который мы сможем добавить</p>
  <p id="OojI"></p>
  <p id="SlvW">(то куда летит пуля то место и отлетает) тоесть если мы целимя в руку то урон приходится в эту часть тела игрока и эта часть отлетает мы уже сделали с капканом похожее ну а теперь к практике</p>
  <p id="XV9Y"></p>
  <p id="aDGG">1 Реализуете  кнопку закрывания меню выбора оружия(Легко)</p>
  <p id="OvVa">2.Попробуйте сделать то что я написал выше(сложно)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@stanfox/WMSug6y5d-u</guid><link>https://teletype.in/@stanfox/WMSug6y5d-u?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox</link><comments>https://teletype.in/@stanfox/WMSug6y5d-u?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox#comments</comments><dc:creator>stanfox</dc:creator><title>Делаем систему крови возможность персонажа &quot;красиво&quot; умирать</title><pubDate>Mon, 19 Aug 2024 10:56:37 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c9/ee/c9eea866-af02-4475-b9f1-dacd72fb7cec.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a3/d0/a3d023cb-6ced-4f78-91b0-a08b207c6c5b.png"></img>На прошлом уроке мы уже сделали основу и в конце урока как бонус я посоветовал добавить одну строчку кода которая будет убирать ногу у нашего персонажа local character = hit.Parent local humanoid = character:FindFirstChild(&quot;Humanoid&quot;) if humanoid then — Попробуем найти левую и правую ногу local leftLeg = character:FindFirstChild(&quot;Left Leg&quot;) or character:FindFirstChild(&quot;LeftLowerLeg&quot;) or character:FindFirstChild(&quot;LeftFoot&quot;) local rightLeg = character:FindFirstChild(&quot;Right Leg&quot;) or character:FindFirstChild(&quot;RightLowerLeg&quot;) or character:FindFirstChild(&quot;RightFoot&quot;) — Удаляем левую ногу, если она найдена if leftLeg then leftLeg:Destroy() end чтобы при заходе на наш кирпич и персонажа убиралась левая нога и он истекал кровью постепенно...]]></description><content:encoded><![CDATA[
  <p id="o8Gu">На прошлом уроке мы уже сделали основу и в конце урока как бонус я посоветовал добавить одну строчку кода которая будет убирать ногу  у нашего персонажа local character = hit.Parent local humanoid = character:FindFirstChild(&quot;Humanoid&quot;) if humanoid then — Попробуем найти левую и правую ногу local leftLeg = character:FindFirstChild(&quot;Left Leg&quot;) or character:FindFirstChild(&quot;LeftLowerLeg&quot;) or character:FindFirstChild(&quot;LeftFoot&quot;) local rightLeg = character:FindFirstChild(&quot;Right Leg&quot;) or character:FindFirstChild(&quot;RightLowerLeg&quot;) or character:FindFirstChild(&quot;RightFoot&quot;) — Удаляем левую ногу, если она найдена if leftLeg then leftLeg:Destroy() end чтобы при заходе на наш кирпич и персонажа убиралась левая нога и он истекал кровью постепенно начнем урока с того что вспомним как пользоваться рандомом </p>
  <figure id="vI7C" class="m_original">
    <img src="https://img3.teletype.in/files/a3/d0/a3d023cb-6ced-4f78-91b0-a08b207c6c5b.png" width="1422" />
  </figure>
  <p id="CiQJ">достаточно предельно все просто пользуемся библеотечной функцией библеотеки math   - random,  тут просто если нам выпадает единица из функции тогда удаляем левую ногу если 2 то правую</p>
  <p id="Ybji">если из фукнции выпадает число один то переменной legToRemove присваиваем значение переменной leftleg который в свою очередь ссылается уже на обьект класса Humanoid left leg</p>
  <p id="vbxS">c двойкой все тоже самое</p>
  <p id="sMbV"></p>
  <p id="01Zd">зачем же мы сделали весь этот скрипт в кирпиче наверное если мы будем делать свой боевик или шутер то нужно скрипт размещать в другом месте да это правда но из кирпича мы в будущем сделаем капкан и мину в этом уроке мы добавим текстуру нашему кирпичу</p>
  <p id="7HC8"></p>
  <figure id="2PIJ" class="m_original">
    <img src="https://img1.teletype.in/files/06/eb/06ebe512-fa07-41e9-91ff-66a51bab07b6.png" width="1848" />
  </figure>
  <p id="Fp9Q">берем какой нибудь меш из тулбокса</p>
  <p id="3Vcl"></p>
  <figure id="GryY" class="m_original">
    <img src="https://img2.teletype.in/files/9e/57/9e57f80f-f354-4800-9405-bef9a29eb6b7.png" width="1896" />
  </figure>
  <p id="KvJN"></p>
  <p id="xoPt"></p>
  <figure id="rRR5" class="m_original">
    <img src="https://img2.teletype.in/files/99/1e/991e06ca-79f4-41b0-a062-dce4f9679a48.png" />
  </figure>
  <p id="7E05"></p>
  <p id="va81">в свойствах нашего Mesh копируем такой параметр как Meshid</p>
  <p id="PHXf"></p>
  <figure id="f26L" class="m_original">
    <img src="https://img1.teletype.in/files/4c/44/4c44ef75-3b15-4c80-842e-fbdd0d14137f.png" width="1872" />
  </figure>
  <figure id="q7IL" class="m_original">
    <img src="https://img3.teletype.in/files/e2/ad/e2ad5401-eeaf-49f1-acd8-7c68ddcdd812.png" width="1782" />
  </figure>
  <p id="rbX7"></p>
  <p id="ni5U">добавляем вот такую вот новую строчку кода в код:</p>
  <p id="RHXa">local mesh = Instance.new(&quot;SpecialMesh&quot;) mesh.MeshId = &quot;rbxassetid://ВАШ_ID_МЕША&quot; — Укажите ID меша капкана&quot;rbxassetid://</p>
  <p id="jOK6">mesh.Scale = Vector3.new(1, 1, 1)  — Масштабирование меша, можно изменить под размер детали<br />mesh.Parent = part  — Применяем меш к Part</p>
  <p id="qClE"></p>
  <p id="XFCA"></p>
  <p id="ze7y"><strong>Что тут происходит</strong></p>
  <p id="W6Bn"></p>
  <p id="eDfz"></p>
  <h3 id="eGCc">Шаг 1: Создание объекта <code>SpecialMesh</code></h3>
  <pre id="f9uP">local mesh = Instance.new(&quot;SpecialMesh&quot;)
</pre>
  <ul id="r2Eb">
    <li id="n4j8"><strong>Что происходит?</strong></li>
    <ul id="2a7C">
      <li id="cSNb">Этот код создает новый объект <code>SpecialMesh</code>, который представляет собой специальный 3D-меш, используемый для изменения формы и текстуры базовой части (Part).</li>
      <li id="zkKP"><strong>Instance.new</strong> — это функция, которая создает новый объект определенного типа. В данном случае это <code>SpecialMesh</code>.</li>
    </ul>
    <li id="ZryH"><strong>Зачем это нужно?</strong></li>
    <ul id="5oqY">
      <li id="Xsth">Обычные части (Part) в Roblox имеют простую геометрическую форму (куб, шар и т.д.). Меш позволяет использовать более сложные 3D-модели, такие как капкан или другой объект.</li>
    </ul>
  </ul>
  <h3 id="vw4T">Шаг 2: Присваивание MeshId</h3>
  <pre id="JBrW">MeshId = &quot;rbxassetid://ВАШ_ID_МЕША&quot;
</pre>
  <ul id="qQaU">
    <li id="hE3n"><strong>Что происходит?</strong></li>
    <ul id="vKai">
      <li id="6RMA">Здесь <code>MeshId</code> устанавливается на конкретный идентификатор меша. Этот ID указывает Roblox, какой именно 3D-меш должен быть применен.</li>
      <li id="aU1d">ID меша можно найти в Roblox библиотеке, где хранятся различные модели. Он обычно выглядит как числовой код (например, <code>&quot;rbxassetid://1234567890&quot;</code>).</li>
    </ul>
    <li id="SpeQ"><strong>Зачем это нужно?</strong></li>
    <ul id="1UNV">
      <li id="xHui">Этот ID связывает созданный меш с конкретной моделью, например, моделью капкана, которая загружается и накладывается на вашу часть.</li>
    </ul>
  </ul>
  <h3 id="2cGx"></h3>
  <ul id="QEmf">
    <ul id="Zt4O"></ul>
  </ul>
  <h3 id="P65E">Шаг 3: Настройка масштаба</h3>
  <pre id="CJjn">mesh.Scale = Vector3.new(1, 1, 1)
</pre>
  <ul id="j1my">
    <li id="La1F"><strong>Что происходит?</strong></li>
    <ul id="BE8m">
      <li id="ekYk">Эта строка устанавливает размер меша, используя векторные координаты (X, Y, Z). В данном случае масштаб меша задан как <code>1, 1, 1</code>, что означает его исходный размер.</li>
    </ul>
    <li id="d9XZ"><strong>Зачем это нужно?</strong></li>
    <ul id="idpp">
      <li id="eWQk">Масштабирование меша позволяет сделать модель больше или меньше по трем осям (X, Y, Z). Например, если модель капкана слишком большая для части, вы можете уменьшить ее до нужных пропорций.</li>
    </ul>
  </ul>
  <h3 id="soVw">Шаг 5: Привязка меша к части</h3>
  <pre id="GpCO">luaCopy codemesh.Parent = part
</pre>
  <ul id="d7bi">
    <li id="pYKh"><strong>Что происходит?</strong></li>
    <ul id="4Oxj">
      <li id="0JdV">Этот код привязывает созданный меш к объекту <code>part</code>, который должен уже существовать в игре.</li>
    </ul>
    <li id="d0ZE"><strong>Зачем это нужно?</strong></li>
    <ul id="4HAi">
      <li id="krde">Привязка меша к части (например, вашему кирпичу или капкану) позволяет изменить форму и текстуру этой части. Меш становится визуальной частью объекта, и игроки видят не обычный куб или сферу, а сложную 3D модель.</li>
    </ul>
  </ul>
  <h3 id="xOZZ">Итог:</h3>
  <p id="aByT">Этот код создает 3D-модель (меш) капкана, текстурирует её, масштабирует до нужного размера и привязывает к вашему объекту в игре. Благодаря этому, вместо обычной базовой формы части (Part) вы получите более сложный и детализированный объект.</p>
  <p id="ke1r"></p>
  <p id="CLHU"></p>
  <p id="JPQO"></p>
  <p id="j1Ie">итог теперь мы имеем капкан при контакте с ним у персонажа пропадает нога начинается кровотечение и уменьшается здоровье теперь осталось сделать эффект схлопывания капкана</p>
  <p id="Vurj"></p>
  <p id="qUOJ"></p>
  <figure id="Bax2" class="m_original">
    <img src="https://img4.teletype.in/files/f6/be/f6be2229-8c71-4f0e-a25b-47cf33b2e31b.png" width="1880" />
  </figure>
  <p id="FlIk"></p>
  <p id="MXKy">находим в тулбоксе модельку уже закрытого капкана и пихаем ее также как и прошлый меш внутрь нашего парта(*part)</p>
  <p id="Ns5T"></p>
  <p id="7PDF">теперь придумываем одну хитрость которая позволит нам в этом уроке миновать работу с анимациями</p>
  <p id="4xfC"></p>
  <figure id="bX8P" class="m_original">
    <img src="https://img4.teletype.in/files/70/de/70de22ff-3903-4e1d-9775-33840b981776.png" width="1890" />
  </figure>
  <p id="zeJG"></p>
  <figure id="G8LE" class="m_original">
    <img src="https://img2.teletype.in/files/94/af/94afeffc-364f-4661-8193-c152d5aacd54.png" width="1860" />
  </figure>
  <p id="A9Kb"></p>
  <p id="o203">в начале мы установили наш меш и установили его айди теперь после переноса меша &quot;закрытого капкана&quot; добавляем следующий код</p>
  <p id="PH53"></p>
  <p id="CpAv"></p>
  <figure id="SXmG" class="m_original">
    <img src="https://img1.teletype.in/files/49/e6/49e6a7f4-01c0-4e33-9a49-01b24ba255eb.png" width="1285" />
  </figure>
  <p id="J5FC"></p>
  <p id="1E6Q"></p>
  <p id="2Gz0"></p>
  <p id="IUlo"><strong>Что тут происходит</strong></p>
  <p id="vl2m"></p>
  <p id="oy8k"></p>
  <p id="DPHp">в нашей функции которая проверяет касался ли игрок нашего капкана(,брика,парта)</p>
  <p id="JkV1">когда она активируется</p>
  <p id="YERg"></p>
  <p id="Lx4q">мы делаем наш капкан невидимым </p>
  <p id="zCjr">part.Transparency = 1 мы обратились к свойствам нашего кирпича с помощью переменной которая на него ссылается</p>
  <p id="5NiO"><strong>local part = script.Parent</strong></p>
  <p id="ALsG"></p>
  <p id="ofYi">мы делаем наш первый капкан невидимым но в тоже время наш второй меш который закрытый капкан делаем видимым(я изначально сделал его невидимым он будет видимым только при касании игроком капкана тем самым создавая эффект &quot;схлопывания или закрывания&quot; нашего капкана)</p>
  <p id="wMBa"></p>
  <p id="Pf9x">теперь в функции которая вызывается когда наш Гуманоид,(персонаж,игрок</p>
  <p id="vz37"></p>
  <p id="lZEe">мы делаем точно такие же действия только наоборот</p>
  <p id="3wUD">наш второй капкан который закрытый делаем невидимым а второй снова видимым</p>
  <p id="e0c1"></p>
  <p id="12hN"></p>
  <p id="LemA"><strong>Смотрим на результат</strong></p>
  <p id="6EuS"></p>
  <p id="F7oj"></p>
  <figure id="TskM" class="m_original">
    <img src="https://img1.teletype.in/files/8a/ab/8aab691f-8898-49c5-9969-845f6eea97e5.png" width="1726" />
  </figure>
  <p id="3wXN"></p>
  <p id="TbBy"></p>
  <p id="CthU"></p>
  <p id="roN0">хорошо теперь в качестве практики</p>
  <p id="QVvg"></p>
  <p id="BR6k">1.*Cделайте чтобы персонаж не мог выбраться из капкана(он был заморожен,застрял и тд)*</p>
  <p id="sLFo"></p>
  <p id="WLEY">2.*Сделайте мину,бомбу, чтобы при взрыве у персонажа появлась кровь и тд*</p>
  <p id="Ogxk"></p>
  <p id="43l9">3.*Придумайте свой вариант ловушки и свой вариант реализации*</p>
  <p id="eT81"></p>
  <p id="Rlc6">На этом все можете свои решения,реализации,</p>
  <p id="c1bL"></p>
  <p id="fyB3"></p>
  <p id="PWSU">скидывать в коментарии под уроком.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@stanfox/xxoOBl3WRiS</guid><link>https://teletype.in/@stanfox/xxoOBl3WRiS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox</link><comments>https://teletype.in/@stanfox/xxoOBl3WRiS?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=stanfox#comments</comments><dc:creator>stanfox</dc:creator><title>Делаю систему крови или же возможность персонажа &quot;красиво&quot; умирать</title><pubDate>Sat, 17 Aug 2024 09:50:25 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1f/3b/1f3b9414-f43a-447e-9172-80c329bdc161.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f8/19/f8196b8f-fc03-49fa-b4c8-9e2729cdb51a.jpeg"></img>В роблоксе есть такая игра которая называется bloodtide мне кажется это идеал кровавого боевика там система крови сделано идеально сегодня мы попробуем сделать что то похожее ,серия будет состоять из 3 уроков где ха 3 урока мы во первых улучшим свои навыки скриптинга и создания анимаций и также навыки создания графики]]></description><content:encoded><![CDATA[
  <p id="2BNf">В роблоксе есть такая игра которая называется bloodtide мне кажется это идеал кровавого боевика там система крови сделано идеально сегодня мы попробуем сделать что то похожее ,серия будет состоять из 3 уроков где ха 3 урока мы во первых улучшим свои навыки скриптинга и создания анимаций и также навыки создания графики</p>
  <p id="nnYl"></p>
  <p id="sEr5">Заходим в Roblox studio и создаём Baseplate </p>
  <p id="NDei">Для начала мы просто создаём part кирпич</p>
  <figure id="eEjG" class="m_original">
    <img src="https://img4.teletype.in/files/f8/19/f8196b8f-fc03-49fa-b4c8-9e2729cdb51a.jpeg" width="4000" />
  </figure>
  <p id="pHhl">С этого начинаются почти все уроки)</p>
  <p id="KOXR"></p>
  <p id="oE4F">Теперь как всегда добавляем скрипт в наш part </p>
  <figure id="d4kh" class="m_original">
    <img src="https://img1.teletype.in/files/04/09/0409af67-a12d-41bb-bdf1-a17f4a0fc638.jpeg" width="3000" />
  </figure>
  <p id="b5BM"></p>
  <figure id="Aevt" class="m_original">
    <img src="https://img4.teletype.in/files/78/f7/78f7cbfa-db68-409c-b7c7-e890f765d6c1.jpeg" width="3000" />
  </figure>
  <figure id="PVyO" class="m_original">
    <img src="https://img1.teletype.in/files/0b/bf/0bbf1fa1-3ff1-4ebf-8dd7-3a9d83b3f62e.jpeg" width="4000" />
  </figure>
  <p id="PJld">На первой строке мы присваиваем переменной part ссылку на объект (кирпич),к которому прикреплён этот скрипт.Это важно для отслеживания касания </p>
  <p id="FNbV"></p>
  <p id="0Mde">На второй строке это переменная флаг</p>
  <p id="yxoT">Представьте что переменная флаг это как переключатель который может находится в двух состояниях: &quot;включено или &quot;выключено&quot;. В компьютере как правило в операционной системе переменной флаг присваиваивают либо 1 &quot;включено&quot; либо 0. &quot;выключено&quot; в микроконтроллерах испозует первый вариант но мы с вами сегодня будем пользоваться true и false переменная будет показывать идёт ли кровотечение true или нет false</p>
  <p id="eGbb"></p>
  <figure id="syNh" class="m_original">
    <img src="https://img4.teletype.in/files/74/50/745007d1-ea09-4a25-930e-da1bf0b8580a.jpeg" width="4000" />
  </figure>
  <p id="qWrW">На 4 строке  Это функция которая отвечает за запуск кровотечения у персонажа.В качестве аргумента она принимает &#x27;character&#x27;,что является ссылкой на объект персонажа</p>
  <p id="VJIz"></p>
  <p id="GaAl">На 5 строке: Проверяется,не идёт ли уже кровотечение.Если нет,продолжаем выполнение функции</p>
  <p id="bSPz"></p>
  <p id="dwBZ">На 6 строке: Устанавливаем флаг &#x27;isBleeding в &#x27;true&#x27;,указывая что персонажа начал кровоточить</p>
  <p id="jrI4"></p>
  <p id="Je9A">Переходим уже к более интересному</p>
  <p id="fBEZ"></p>
  <p id="NrR4">С помощью функции Instance new мы создаём объект класса ParticleEmitter но вы наверняка спросите почему именно этот тип объекта, почему не Part не Mesh или какой нибудь WedgePart а я скажу </p>
  <p id="BrIq"><code>ParticleEmitter</code> — это особый объект в Roblox, который используется для создания и управления системами частиц. Он значительно отличается от других объектов, которые можно создать с помощью <code>Instance.new</code>, благодаря своей специфической роли в создании динамических визуальных эффектов.</p>
  <h3 id="3RtG">Чем <code>ParticleEmitter</code> отличается от других объектов?</h3>
  <ol id="QlCe">
    <li id="bLsS"><strong>Динамические эффекты:</strong></li>
    <ul id="OQkh">
      <li id="NuzO"><strong><code>ParticleEmitter</code></strong> создается для генерации частиц, которые могут двигаться, изменять цвет, форму, размер, скорость и т. д. Это делает его идеальным для создания таких эффектов, как дым, огонь, искры, вода, кровь, магия и другие динамические визуальные эффекты.</li>
      <li id="6UeZ">Другие объекты, такие как <code>Part</code>, <code>Decal</code> или <code>Mesh</code>, обычно статичны или малоизменяемы. Например, <code>Part</code> — это базовый строительный блок, представляющий собой 3D-объект, который обычно используется для создания физической геометрии, тогда как <code>Decal</code> используется для наложения изображений на поверхность <code>Part</code>.</li>
    </ul>
    <li id="bp10"><strong>Создание множества объектов за секунды:</strong></li>
    <ul id="ltuE">
      <li id="9AjA"><strong><code>ParticleEmitter</code></strong> способен создавать сотни или даже тысячи частиц в секунду, что позволяет создавать эффекты с большим количеством мелких объектов (например, капли дождя или искры). Он оптимизирован для того, чтобы создавать и управлять большим количеством объектов одновременно.</li>
      <li id="Vj9U">Если бы мы пытались создать аналогичный эффект с помощью множества отдельных <code>Part</code> объектов, это быстро бы стало неэффективным и привело к снижению производительности игры, так как Roblox плохо справляется с обработкой большого количества физических объектов.</li>
    </ul>
    <li id="4ESc"><strong>Анимация и настройки:</strong></li>
    <ul id="7Y1x">
      <li id="GWPJ"><strong><code>ParticleEmitter</code></strong> предоставляет множество настроек для анимации частиц, таких как скорость, вращение, жизненный цикл, размеры и цвета частиц. Это позволяет создать очень гибкие и разнообразные эффекты.</li>
      <li id="w0uo">В других объектах, таких как <code>Part</code> или <code>Mesh</code>, такие настройки гораздо более ограничены или отсутствуют. Например, вы можете изменить размер и цвет <code>Part</code>, но вам придется вручную программировать анимации, перемещение и изменение этих параметров, что намного сложнее и менее эффективно, чем использование системы частиц.</li>
    </ul>
    <li id="LMKH"><strong>Эффективность и оптимизация:</strong></li>
    <ul id="3lv3">
      <li id="OPEW"><strong><code>ParticleEmitter</code></strong> оптимизирован для работы с большими объемами данных, касающихся частиц, и для создания визуальных эффектов без чрезмерной нагрузки на систему. Он включает встроенные функции для автоматического удаления частиц по окончании их жизненного цикла.</li>
      <li id="WnWM">Другие объекты, такие как <code>Part</code>, могут увеличивать нагрузку на систему, если их использовать для моделирования большого количества движущихся объектов. Например, если бы вы создавали кровь с помощью отдельных <code>Part</code>, их пришлось бы удалять вручную или через систему <code>Debris</code>, что требует дополнительных вычислительных ресурсов.</li>
    </ul>
  </ol>
  <h3 id="XIKX">Почему используем именно <code>ParticleEmitter</code>?</h3>
  <p id="HBV5">В контексте создания эффекта кровотечения, использование <strong><code>ParticleEmitter</code></strong> — это лучший выбор по нескольким причинам:</p>
  <ol id="E4yf">
    <li id="cgyH"><strong>Реалистичные капли крови:</strong> <code>ParticleEmitter</code> позволяет легко создать эффект капель крови, падающих с персонажа. Эти капли могут двигаться под действием гравитации, изменять направление и исчезать через определенное время. Все эти параметры легко настраиваются с помощью свойств <code>ParticleEmitter</code>, таких как <code>Lifetime</code>, <code>Speed</code>, <code>Rotation</code>, <code>Color</code> и т. д.</li>
    <li id="ZsBJ"><strong>Массовая генерация частиц:</strong> С помощью <code>ParticleEmitter</code> вы можете создавать множество частиц (капель крови) в секунду без значительной нагрузки на производительность игры. Это позволяет сделать эффект кровотечения более интенсивным и реалистичным, чем если бы вы вручную создавали <code>Part</code> объекты для каждой капли.</li>
    <li id="kIxR"><strong>Автоматическое управление частицами:</strong> <code>ParticleEmitter</code> автоматически управляет созданием, анимацией и удалением частиц. Это упрощает код и освобождает вас от необходимости вручную отслеживать каждую каплю крови и удалять ее после окончания анимации.</li>
    <li id="AdjY"><strong>Гибкость в настройке:</strong> Вы можете настроить частички крови так, чтобы они выглядели именно так, как вам нужно. Например, вы можете настроить их размер, скорость появления, время жизни, направление движения и другие параметры. Это дает вам больше контроля над визуальными эффектами.</li>
  </ol>
  <h3 id="FUbi">Заключение:</h3>
  <p id="8PKT">Использование <strong><code>ParticleEmitter</code></strong> позволяет создать сложный визуальный эффект кровотечения с минимальными затратами времени и ресурсов. В отличие от других объектов в Roblox, которые более статичны или сложны в управлении, <code>ParticleEmitter</code> предназначен специально для создания динамических визуальных эффектов, таких как частицы крови, и это делает его идеальным инструментом для реализации такого рода механик в игре.</p>
  <p id="Ij7p"></p>
  <figure id="GhsA" class="m_original">
    <img src="https://img4.teletype.in/files/79/fb/79fb00f7-8332-45cf-a4cb-a6931139ab33.png" width="739" />
  </figure>
  <p id="I0DD">На 9 строке теперь мы делаем <strong><code>Texture</code></strong>: Устанавливаем текстуру частиц крови, используя ID текстуры (в данном случае, это ID текстуры крови) я долго не искал просто взял первую возможную вы же можете добавить свою или использовать мою.<strong><code>Rate</code></strong>: Задает скорость появления частиц (5 частиц в секунду).<strong><code>Lifetime</code></strong>: Устанавливает диапазон времени жизни частиц (от 1 до 2 секунд).<strong><code>Speed</code></strong>: Устанавливает скорость частиц (в данном случае от 2 до 4).<strong><code>Rotation</code> и <code>RotSpeed</code></strong>: Настройки вращения частиц.<strong><code>Color</code></strong>: Устанавливаем цвет частиц в темно-красный цвет.<strong><code>Size</code></strong>: Задает размер частиц (0.5).</p>
  <p id="oX2U"></p>
  <figure id="xYN7" class="m_original">
    <img src="https://img3.teletype.in/files/68/ea/68eac756-e6e2-4b01-91af-9a17f17d77da.png" width="1240" />
  </figure>
  <p id="qO6p"></p>
  <p id="LcXE"></p>
  <p id="X03P"><strong><code>local humanoid = character:FindFirstChild(&quot;Humanoid&quot;)</code></strong>: Эта строка находит объект <code>Humanoid</code> внутри персонажа. <code>Humanoid</code> отвечает за управление жизнью, движением и другими важными аспектами персонажа.<strong>Поиск ноги</strong>: Код пытается найти часть тела персонажа, которая будет использоваться для привязки эмиттера частиц (например, &quot;Left Leg&quot;, &quot;LeftLowerLeg&quot; или &quot;LeftFoot&quot;).<strong>Присоединение эмиттера</strong>: Если нога найдена, <code>bloodEmitter</code> привязывается к этой части тела.</p>
  <p id="sR0m"></p>
  <figure id="cZss" class="m_original">
    <img src="https://img3.teletype.in/files/6d/01/6d01c8f7-fc5b-45ef-85a8-e51b945e731b.png" width="1261" />
  </figure>
  <p id="iUoH"></p>
  <p id="eL9U"><strong><code>local function leaveBloodTrail()</code></strong>: Эта функция отвечает за создание пятен крови на земле. Она работает в цикле <code>while</code>, создавая новые пятна, пока флаг <code>isBleeding</code> равен <code>true</code>.<strong>Создание части (<code>Part</code>)</strong>: Создается новый объект <code>Part</code>, который будет использоваться как пятно крови на земле.</p>
  <ul id="Ha4q">
    <li id="sIMC"><strong>Размер</strong>: Задается размер пятна крови.</li>
    <li id="u04v"><strong><code>Anchored</code></strong>: Делает часть неподвижной.</li>
    <li id="fQfy"><strong><code>CanCollide = false</code></strong>: Отключает возможность столкновения, чтобы другие объекты не сталкивались с пятном.</li>
    <li id="R14f"><strong>Цвет</strong>: Задается цвет пятна в темно-красный.</li>
  </ul>
  <p id="SWWd"><strong>Позиционирование части</strong>: Проверяется, есть ли у персонажа <code>PrimaryPart</code>. Если есть, пятно позиционируется под персонажем, создавая эффект, будто кровь капает на землю.</p>
  <p id="bevb"></p>
  <figure id="mEWq" class="m_original">
    <img src="https://img2.teletype.in/files/9f/d9/9fd9cfbd-aede-4a6a-98bd-277b2d6a89bd.png" width="1356" />
  </figure>
  <p id="EqIp"><strong>Добавление текстуры</strong>: </p>
  <p id="QRo4"><code>Decal</code> в Roblox — это объект, который позволяет накладывать изображения или текстуры на поверхности частей (<code>Part</code>). Это похоже на то, как наклейки наклеиваются на предметы в реальной жизни.</p>
  <h3 id="zMEN">Как работает <code>Decal</code>:</h3>
  <ul id="Ni5v">
    <li id="UcXn"><strong>Размещение</strong>: <code>Decal</code> прикрепляется к части (<code>Part</code>) и отображается на одной из ее поверхностей. Вы можете выбрать, на какую именно поверхность будет нанесена наклейка, используя свойство <code>Face</code> (например, <code>Enum.NormalId.Top</code> для верхней поверхности).</li>
    <li id="Xt8W"><strong>Текстура</strong>: Основное свойство <code>Decal</code> — это его текстура. Это изображение, которое будет отображаться на выбранной поверхности. Текстура указывается через URL или ID ресурса в Roblox. В вашем коде используется ID текстуры крови (<code>rbxassetid://13346855</code>).</li>
  </ul>
  <h3 id="Kr4s">Зачем нужна <code>Decal</code>:</h3>
  <ul id="SaG0">
    <li id="ajKB"><strong>Визуальный эффект</strong>: <code>Decal</code> используется для создания визуальных эффектов. В нашем случае, это кровавые пятна на земле. Вместо того чтобы просто окрашивать части в красный цвет, накладывается детализированная текстура крови, что делает эффект более реалистичным.</li>
    <li id="lMEq"><strong>Добавление деталей</strong>: <code>Decal</code> позволяет добавить мелкие детали, такие как текстуры грязи, царапины, пятна крови и другие элементы, без необходимости вручную моделировать эти детали. Это значительно облегчает создание сложных визуальных эффектов.</li>
  </ul>
  <p id="3YH2"></p>
  <p id="WogU"><strong>Удаление части через некоторое время</strong>: Используется служба <code>Debris</code>, чтобы удалить пятно крови спустя 10 секунд, предотвращая захламление сцены.<strong>Уменьшение здоровья</strong>: Каждые полсекунды мы уменьшаем здоровья персонажа на 1 единицу чтобы создать эффект кровотечения и потерю крови.<strong><code>wait(0.5)</code></strong>: Пауза перед созданием следующего пятна крови.</p>
  <figure id="sG5A" class="m_original">
    <img src="https://img3.teletype.in/files/e9/76/e976ade0-e128-4bc4-aeef-822ffab1232d.png" width="1268" />
  </figure>
  <p id="yyfT"><strong><code>spawn(leaveBloodTrail)</code></strong>: Эта функция запускает процесс создания пятен крови в отдельном потоке, позволяя другим процессам работать параллельно.</p>
  <figure id="efoY" class="m_original">
    <img src="https://img2.teletype.in/files/14/2f/142ffd1f-e492-4036-a0fa-bb1718c7f27c.png" width="1234" />
  </figure>
  <p id="4M5V"><strong><code>local function stopBleeding()</code></strong>: Эта функция останавливает кровотечение, устанавливая флаг <code>isBleeding</code> в <code>false</code>. Это предотвращает дальнейшее создание частиц и пятен крови.</p>
  <p id="S6X5"></p>
  <figure id="l8J5" class="m_original">
    <img src="https://img1.teletype.in/files/4a/31/4a31ed34-e36e-449e-9725-e7f948307225.png" width="1023" />
  </figure>
  <p id="Clow"><strong><code>local function onTouch(hit)</code></strong>: Эта функция вызывается, когда что-то касается объекта (кирпича). Аргумент <code>hit</code> содержит объект, который касается кирпича.<strong>Определение персонажа</strong>: <code>hit.Parent</code> используется для определения персонажа, который коснулся кирпича.<strong>Поиск <code>Humanoid</code></strong>: Если у персонажа есть объект <code>Humanoid</code>, это означает, что это персонаж игрока.<strong>Запуск кровотечения</strong>: Если <code>Humanoid</code> найден, вызывается функция <code>startBleeding</code>, и запускается процесс кровотечения.<strong>Подписка на событие смерти</strong>: Если персонаж умирает, срабатывает функция <code>stopBleeding</code>, которая останавливает кровотечение.</p>
  <p id="qkUA"></p>
  <p id="hsYK"></p>
  <p id="pbH3"></p>
  <pre id="Ffu5">part.Touched:Connect(onTouch)
</pre>
  <ul id="RtfE">
    <li id="pDpz"><strong><code>part.Touched:Connect(onTouch)</code></strong>: Подписка на событие <code>Touched</code>, которое вызывается при касании объекта <code>part</code>. Когда кто-то касается кирпича, вызывается функция <code>onTouch</code>.</li>
  </ul>
  <p id="2X2y"></p>
  <p id="QbD3"></p>
  <h3 id="JWBD">Итог:</h3>
  <ul id="ZZNT">
    <li id="iU0Y">Когда персонаж касается кирпича, запускается кровотечение.</li>
    <li id="61u8">Частицы крови появляются из персонажа, и под ним создаются пятна крови на земле.</li>
    <li id="yBF3">Каждую полсекунды у персонажа уменьшается здоровье.</li>
    <li id="iKbI">Если персонаж умирает, кровотечение останавливается.</li>
  </ul>
  <p id="mSez"></p>
  <p id="nmfP"></p>
  <p id="tiXM">вот и все ребята можете посмотреть результат я считаю вполне неплохо для моего камбэка сегодня мы научились </p>
  <h3 id="i9Qy">1. <strong>Работа с <code>Instance.new</code></strong></h3>
  <p id="zWQy">Мы научились использовать функцию <code>Instance.new</code> для создания различных типов объектов в Roblox. Это основополагающий элемент в Roblox Studio для создания новых объектов в игровом мире, таких как частицы, детали, интерфейсы и многое другое.</p>
  <h3 id="bgL1">2. <strong>Создание и настройка <code>ParticleEmitter</code></strong></h3>
  <ul id="USua">
    <li id="gjGX"><strong>Создание частиц:</strong> Мы использовали <code>ParticleEmitter</code> для создания эффекта частиц, который позволяет добавить динамическое и визуально привлекательное поведение, например, капли крови.</li>
    <li id="egqA"><strong>Настройка свойств частиц:</strong> Мы научились настраивать параметры частиц, такие как <code>Texture</code>, <code>Rate</code>, <code>Lifetime</code>, <code>Speed</code>, <code>Color</code>, и <code>Size</code>, чтобы добиться нужного визуального эффекта. Это помогает сделать эффекты более реалистичными и подходящими для конкретной задачи.</li>
  </ul>
  <h3 id="qXGW">3. <strong>Создание и управление следами крови</strong></h3>
  <ul id="yTCi">
    <li id="W7wm"><strong>Использование <code>Part</code> для создания следов:</strong> Мы научились создавать простые части (<code>Part</code>) для имитации следов крови на земле. Это включает в себя установку размеров, цвета и текстуры пятен.</li>
    <li id="PRSy"><strong>Добавление <code>Decal</code> для текстур:</strong> Мы использовали <code>Decal</code>, чтобы наложить текстуру на части, что делает следы более реалистичными и детализированными.</li>
  </ul>
  <h3 id="xLTB">4. <strong>Работа с событиями касания</strong></h3>
  <ul id="epqk">
    <li id="jjip"><strong>Обработка события <code>Touched</code>:</strong> Мы научились использовать событие <code>Touched</code> для определения, когда персонаж касается объекта (например, кирпича), чтобы инициировать определенные действия, такие как создание эффекта крови.</li>
    <li id="U2M0"><strong>Определение персонажа:</strong> Мы проверяли, является ли объект, который коснулся кирпича, персонажем игрока, используя <code>FindFirstChild(&quot;Humanoid&quot;)</code>.</li>
  </ul>
  <h3 id="aYAf">5. <strong>Создание функций для управления эффектами</strong></h3>
  <ul id="hqLt">
    <li id="RCrD"><strong>Функция <code>startBleeding</code>:</strong> Мы создали функцию, которая запускает эффект кровотечения, создавая и настраивая частицы и следы крови.</li>
    <li id="BCWr"><strong>Функция <code>stopBleeding</code>:</strong> Мы также создали функцию для остановки кровотечения, что может быть полезно при излечении или смерти персонажа.</li>
  </ul>
  <h3 id="EVoy">6. <strong>Оптимизация и управление ресурсами</strong></h3>
  <ul id="WEsj">
    <li id="2nzG"><strong>Использование <code>Debris</code> для удаления объектов:</strong> Мы узнали, как использовать службу <code>Debris</code> для автоматического удаления объектов (например, пятен крови) спустя определенное время, чтобы избежать перегрузки игры лишними объектами.</li>
    <li id="uDHA"><strong>Использование <code>spawn</code>:</strong> Мы использовали <code>spawn</code> для запуска функции создания следов крови в отдельном потоке, что позволяет избежать блокировки основного потока исполнения кода и улучшить производительность.</li>
  </ul>
  <h3 id="rGbJ">7. <strong>Понимание <code>Humanoid</code> и здоровья</strong></h3>
  <ul id="NREa">
    <li id="JQjD"><strong>Работа с <code>Humanoid</code>:</strong> Мы научились взаимодействовать с компонентом <code>Humanoid</code> для проверки состояния персонажа и обработки событий, связанных со здоровьем персонажа.</li>
  </ul>
  <h3 id="SwjE">Заключение</h3>
  <p id="l22H">Этот код дал нам хорошие примеры того, как можно комбинировать различные объекты и функции в Roblox для создания сложных визуальных эффектов и интерактивного поведения. Мы освоили основы работы с <code>Instance.new</code>, настройку частиц и текстур, обработку событий, а также методы для управления ресурсами и оптимизации производительности. Эти знания являются основой для создания более сложных игровых механик и эффектов в Roblox Studio.</p>
  <p id="NCT7"></p>
  <p id="UjG2">на следующих уроках мы улучшим нашу систему крови и сделаем полноценный bloodtide где при стрельбе в игрока он начнет кровоточить и тд и так бонус для тех кто дочитал до конца можно сделать эффект &quot;отрубания&quot; ноги local character = hit.Parent local humanoid = character:FindFirstChild(&quot;Humanoid&quot;) if humanoid then — Попробуем найти левую и правую ногу local leftLeg = character:FindFirstChild(&quot;Left Leg&quot;) or character:FindFirstChild(&quot;LeftLowerLeg&quot;) or character:FindFirstChild(&quot;LeftFoot&quot;) local rightLeg = character:FindFirstChild(&quot;Right Leg&quot;) or character:FindFirstChild(&quot;RightLowerLeg&quot;) or character:FindFirstChild(&quot;RightFoot&quot;) — Удаляем левую ногу, если она найдена if leftLeg then leftLeg:Destroy() end  также при кровотечение у нашего персонажа пропадет нога и он станет &quot;одноногим&quot; всем пока.</p>

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