<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - kofeek</title>
		<link>https://www.cyberforum.ru/blogs/1534913/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Wed, 09 Sep 2026 13:17:04 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - kofeek</title>
			<link>https://www.cyberforum.ru/blogs/1534913/</link>
		</image>
		<item>
			<title>Движение объекта по кругу в зависимости от положения джойстика</title>
			<link>https://www.cyberforum.ru/blogs/1534913/8093.html</link>
			<pubDate>Thu, 11 May 2023 12:41:50 GMT</pubDate>
			<description>Здравствуйте, форумчане! Я часто сталкиваюсь с некоторыми проблемами, гтовое решение которых в...</description>
			<content:encoded><![CDATA[<div>Здравствуйте, форумчане! Я часто сталкиваюсь с некоторыми проблемами, гтовое решение которых в интернете не найти, а после прихожу к решению сам. Допускаю, что и другие люди могут сталкиваться с похожими проблемами, а потому решил публиковать свои решения, чтобы кому-то это облегчило жизнь, а также для получение критики от более опытных программистов. <br />
<br />
Ближе к делу: я работаю над проектом на Юнити. Это что-типа Fall Guys, только с некоторыми отличиями в плане миниигр, плюс только локальный мультиплеер (несколько игроков на одном ПК могут играть с 4 джойтиков). Для одной из миниигр мне нужно было реализовать движение по окружности в зависимости от положения левого стика джойстика. <br />
<br />
Для начала про сам джойстик в логике Юнити. Позиция стика в нем представляет значение Vector2, где значения x и y могут изменяться в пределах [-1,1]. Самым простым решением в этом случае было перемножить позицию джойстика на радиус окружности, по которой двигается объект. Но это решение мне не нравилось тем, что нельза задать скорость движения объекта, а также, что объект не двигается по окружности, а как бы &quot;телепортируется&quot; из одной точки окружности на другую. К примеру, если объект находился снизу объекта, а джойстик  оказывался в позиции (0,1) (север), то объект не двигался в нужном направлении по окружности, а телепортировался в точку (0,R), где R - радиус окружности. <br />
<br />
Потому у меня возникла другая идея. Обе позиции объекта в игре и джойтика мы можем представить в виде векторов, направленных из центра их окружностей. Мы можем замерять угол между ними и двигать объект к позиции джойстикка, пока угол между векторами не будет  равен нулю, тобиж направления векторов будут совпадать. Звучит уже лучше, чем первый вариант, но я столкнулся с новой пробелмой, описанной в моем вопросе на этом форуме <a href="https://www.cyberforum.ru/unity/thread3104160.html">здесь</a>. В кратце: объект всегда двигался в одном направлении. Условно говоря, даже если между объектами была дуга в 30 градусов, объект все равно двигался по дуге в 330 градусов, просто не понимая, как двигаться иначе. <br />
<br />
В конце концов, перебирая в голове и в интернете все, что я помню о векторах, я вспомнил (наткнулся <a href="https://www.cyberforum.ru/delphi-beginners/thread652199.html">тут</a>) следующую формулу:<br />
<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="278482756"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="278482756" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1">&nbsp;<span class="kw1">private</span> <span class="kw4">float</span> isOnARightSide <span class="br0">&#40;</span>Vector2 A, Vector2 B, Vector2 C<span class="br0">&#41;</span> &nbsp;<span class="co1">// AB - вектор с началом в точке А, C - рандомная точка на плоскости</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> D <span class="sy0">=</span> <span class="br0">&#40;</span>C<span class="sy0">.</span><span class="me1">x</span> <span class="sy0">-</span> A<span class="sy0">.</span><span class="me1">x</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="br0">&#40;</span>B<span class="sy0">.</span><span class="me1">y</span> <span class="sy0">-</span> A<span class="sy0">.</span><span class="me1">y</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="br0">&#40;</span>C<span class="sy0">.</span><span class="me1">y</span> <span class="sy0">-</span> A<span class="sy0">.</span><span class="me1">y</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="br0">&#40;</span>B<span class="sy0">.</span><span class="me1">x</span> <span class="sy0">-</span> A<span class="sy0">.</span><span class="me1">x</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Debug<span class="sy0">.</span><span class="me1">Log</span><span class="br0">&#40;</span>D<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> D<span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Если коэффициент D&gt;0, то точка лежит справа от вектора, если D&lt;0 - слева, если D=0 лежит на плоскости. <br />
<br />
Соответсвенно получаем следующий алгоритм:<br />
<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="232253607"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="232253607" style="height: 190px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="de1"><pre class="de1"><span class="kw1">private</span> <span class="kw4">void</span> Movement<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> rotationSpeed <span class="sy0">=</span> rotationAngle<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Vector2 pos2 <span class="sy0">=</span> <span class="kw3">new</span> Vector2<span class="br0">&#40;</span>transform<span class="sy0">.</span><span class="me1">position</span><span class="sy0">.</span><span class="me1">x</span>, transform<span class="sy0">.</span><span class="me1">position</span><span class="sy0">.</span><span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Vector2 positionVector <span class="sy0">=</span> FindVectorFromCentreToPos<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">float</span> playerToInputAngle <span class="sy0">=</span> Vector3<span class="sy0">.</span><span class="me1">Angle</span><span class="br0">&#40;</span>positionVector, InputDirection<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>playerToInputAngle <span class="sy0">&lt;</span> rotationAngle<span class="br0">&#41;</span> rotationSpeed <span class="sy0">=</span> playerToInputAngle<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>isOnARightSide<span class="br0">&#40;</span>centreDot, pos2, InputDirection<span class="br0">&#41;</span> <span class="sy0">&lt;=</span> <span class="nu0">0</span><span class="br0">&#41;</span> rotationSpeed <span class="sy0">*=</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; transform<span class="sy0">.</span><span class="me1">RotateAround</span><span class="br0">&#40;</span>centreOfMap, Vector3<span class="sy0">.</span><span class="me1">up</span>, rotationSpeed <span class="sy0">*</span> Time<span class="sy0">.</span><span class="me1">deltaTime</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Здесь мы берем позицию джойстика как точку на плоскости, и то же самое делаем с центром окружности и позицией объекта. Если объект в противоположном направлении от объекта, то меняем знак у угловой скорости. <br />
<br />
Также для крастоты я добавил затухание скорости у объекта, когда он уже достаточно близко к необходимой позиции.<br />
<br />
Всем спасибо за внимание и хорошего дня! :)</div>

]]></content:encoded>
			<dc:creator>kofeek</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1534913/8093.html</guid>
		</item>
	</channel>
</rss>
