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

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

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

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

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