Как сделать игру Worms в Unity ?

Поделиться
HTML-код
  • Опубликовано: 16 окт 2022
  • Бесплатный курс по созданию игры на движке Unity от Яндекс Игр:
    ya.cc/t/c3Tiy3gF3g7rvr
    Проект из урока:
    drive.google.com/file/d/1UwEO...
    В этом видео показываю алгоритм, который я написал чтобы вырезать в земле отверстия разных форм. Рассчитываются точки пересечения и строиться новая линия, полученная вычитанием одной линии из другой. На этой основе можно сделать игру аналогичную Worms. Но такой подход можно применять еще в массе других казуальных механик.

Комментарии • 100

  • @Tumanop
    @Tumanop Год назад +43

    Люди которые оставляют ссылки на исходники под видео, в следующей жизни перераждаються в богатых семьях и с большим агрегатом.

    • @52RK
      @52RK Год назад +7

      В том числе, если родились девочками

    • @iamskoi
      @iamskoi Год назад

      Еще бы эта ссылка была бы на гитхаб - цены бы не было)

    • @SERG__ZV
      @SERG__ZV Год назад +2

      Слушай займи мне 100 тысяч клянусь я тебе миллион в следующей жизни отдам.

  • @darkModeYT
    @darkModeYT Год назад +8

    Идеально! Очень давно ждал!! Спасибо ❤

  • @janiksuper
    @janiksuper Год назад +2

    Как всегда на высоте, очень познавательно и всё по делу, браво!

  • @KESSme
    @KESSme Год назад +9

    Очень интересная реализация интересной механики.
    Также хотел сказать спасибо за бесплатный курс по разработке браузерных игр на Unity (На яндексе), тоже очень интересно и полезно!

  • @legotechnicbuilderua7692
    @legotechnicbuilderua7692 Год назад +1

    Спасибо Огромное! Давно ждал новых видео! Возможности этой механики огромные, обязательно где-то использую!

  • @vladimirkalugin-devstudio9721
    @vladimirkalugin-devstudio9721 Год назад

    Спасибо за туториалы которые делаешь) рад видеть успехи)

  • @neverworld8815
    @neverworld8815 Год назад

    Очень круто, всегда хотелось это сделать но руки не доходили а тут прям как подарочек, спасибо автору !

  • @vernoyakira3611
    @vernoyakira3611 Год назад +1

    Красавчик! Рад что ты стал чуть более медийным)

  • @Roman_SBB
    @Roman_SBB Год назад +1

    Отличная новость про курс. Большое спасибо за труд!

  • @OniGameDev
    @OniGameDev Год назад

    Ого, какой классный новый урок!
    Приятно было снова услышать от тебя полезную и интересную информацию)

  • @KillRealKill
    @KillRealKill Год назад +2

    Люблю тебя за твою уникальную информацию) Спасибо!

  • @einstein6451
    @einstein6451 Год назад +1

    Ох не зря я подписался на этот канал. Просто недавно искал видосы про физику т.к. хотел в 3д порпактиковаться. А тут видос новый.

  • @titanovsky
    @titanovsky Год назад +2

    Большое спасибо, как раз сейчас изучаю Unity для разработки игр, чтобы потом найти работу по данной специальности. Мне формулы внутри метода по поиску пересечения, прям напомнили один момент, где нужно было реализовать нажатие на 2D панель в 3D пространстве, я сначала подумал, может просто локализировать HitPos взгляда игрока относительно 2D панели, но когда увидел реализацию, там всё куда было сложнее, и очень аналогично тому, что в поиске по пересечению. Лайк и подписка :)

  • @SergKoster
    @SergKoster Год назад +1

    Недавно начал смотреть твои видео, а ты в честь этого решил снять видео)

  • @iamskoi
    @iamskoi Год назад +2

    Вот ни разу не разработчик игр, но очень интересно смотреть такие видео, с рассуждениями, алгоритмами. Огромное спасибо автору! Лайк и подписка на канал. Пойду остальные видео смотреть) А, еще: исходники лучше все же кидать на гитхаб:)

    • @EccentricGames
      @EccentricGames  Год назад +1

      Спасибо) А какая разница? так и так скачивать нужно один и тот же объем информации. И столько же кнопок нажимать. Ну т.е. есть некоторый процент людей, которым нужно пояснить как скачивать с гита. А есть те кто умеют и им без разницы как скачать. Вот и выбор для меня очевиден как прикрепить

  • @user-sn5ox5xj2w
    @user-sn5ox5xj2w Год назад +1

    Ох заморочился ты конечно) Хорош 💪

  • @user-vq4tz9dz1n
    @user-vq4tz9dz1n Год назад +2

    Прекрасно! Я уже пробовал подобное написать, но потом уперся в то, что на линии может быть несколько пересечений, полез исправлять, по дороге пооптимизировал производительность, и все вообще перестало работать. А потом на работе начался завал и я забросил идею реанимировать алгоритм :( Я вот кстати не знал, что коллайдер умеет генерировать меш и писал генерацию руками, спасибо, что подсказал! Надо будет сделать вторую попытку написать.
    * и да, лайк/подписка обязательно!

  • @WeslomPo
    @WeslomPo Год назад +2

    Код взятия пути с коллайдера следовало в LineFromCollider пересунуть. Этот код повторяется несколько раз и используется для подготовки данных для этого метода.
    Ну и как бы можно еще пару десятков замечаний сделать, по поводу качества кода и оптимизаций. Но не буду.
    Неплохо разобрал алгоритм, лайк, подписка.

  • @andrewsemenenko8826
    @andrewsemenenko8826 Год назад

    Объяснение просто супер!
    Люблю математические задачи, в часности задачи на графах!
    Прикольно, что ключ к решению этой проблемы - порядок следования по часовой или против часовой стрелки, чесно не подумал об этом.
    Скорее всего тот алгоритм, который ты нашел широко известен и используется в таких программах, как тот же фотошоп🤔
    В общем огромное спасибо!

  • @joblik
    @joblik Год назад +2

    Приятно видеть интересные видео)

  • @heavyCO33
    @heavyCO33 Год назад

    Интересный проект и реализация 👍👍👍

  • @JuggernautWare
    @JuggernautWare Год назад +2

    Спасибо за курс!

  • @VirtexR
    @VirtexR Год назад +1

    Очень жду каких-нибуть еще уроков)

  • @4uvak133
    @4uvak133 Год назад +1

    За курс больше спасибо

  • @Krol_one
    @Krol_one Год назад

    5 точка ! лучший ! ;) спасибо за видосы ! Продолжай радовать нас своими шуткосами ;)

  • @Milash001
    @Milash001 Год назад +1

    Лайк и коммент в поддержку канала!😊

  • @seregaplay1770
    @seregaplay1770 Год назад +1

    Ура! Снова видео начали выходить

  • @shmadzilla
    @shmadzilla Год назад +1

    Классные ролики. Очень интересно. Развивай тему! Что-то типа "игра за полчаса"

  • @dopehype
    @dopehype Год назад +1

    очень круто это же надо в уме было всё обработать и придумать как всё будет взаимодействовать

  • @user-zd4yn3zd8n
    @user-zd4yn3zd8n Год назад +1

    крутое видео, спасибо за старания

  • @Agranam
    @Agranam Год назад +2

    Это мегоофигенно!)

  • @namen6535
    @namen6535 Год назад +1

    круто, как всегда)

  • @moreokean
    @moreokean Год назад +3

    Почему перестает работать, если подвинуть объект Land, изменив его Position в Transform? Если позиция Land не (0,0,0) - не работает. Например, если нужно добавить второй объект Land рядом с другими координатами. Как их учитывать?

    • @moreokean
      @moreokean Год назад

      Всё стало работать, если в компоненте Land.cs после _colliderRenderer.CreateMesh(); обнулять позицию коллайдера _collider.transform.position = new Vector3(0f,0f,0f);
      Интересно, почему так?

  • @Domino0s0
    @Domino0s0 Год назад +2

    Привет ,классный ролик!

  • @lautarocabral8710
    @lautarocabral8710 11 месяцев назад

    Amazing! Thanks for this content!

  • @LexaSt86
    @LexaSt86 Год назад +1

    Очень круто!

  • @Kirvun
    @Kirvun Год назад +2

    Илья выпускает новый ролик.
    Синоптики объявляют неделю игр про червячков, игры с похожей механикой будут выходит в два раза чаще ))

  • @borisvaschenko7585
    @borisvaschenko7585 Год назад +1

    Спасибо большое!!

  • @kirillen0tik350
    @kirillen0tik350 Год назад

    Классно было бы посмотреть продолжение, как ты делал б из техно-демки в рабочую игру

  • @TorisNik
    @TorisNik Год назад

    Круто, даже курс, ну все) мир, жди моих игр)

  • @ProninART89
    @ProninART89 Год назад +1

    Круто конечно)))

  • @romantroshkov4854
    @romantroshkov4854 Год назад

    Красавчик!

  • @Martin-bh6uq
    @Martin-bh6uq Год назад

    Чувак ты крутой!

  • @_mirai
    @_mirai Год назад +2

    хотел лечь пораньше, но видно не судьба

  • @Darksanderst
    @Darksanderst Год назад +1

    Неожиданно)

  • @BockJlucuii
    @BockJlucuii Год назад

    Круто!

  • @gecreator412
    @gecreator412 Год назад

    Ну это конечно простой вариант алгоритма. Здесь будет очень много ошибок(которых на первый взгляд не видно), что будет приводить к полному исчезновению формы из-за ошибок триангуляции и соответственно ошибок декомпозинга для concave форм физики. Будет не очень весело если в релизной версии игры при стрельбе из гранатамёта у пользователя исчезнет пол карты. Также нет реализации отверстий внутри форм(для этого нужно будет нарезать форму на де части или более). Там очень много подводных камней из-за ошибок округления положения вершин(сохраняете в файл все вершины(всё работает), загружаете уже нет(welcome to float hell)). Вообщем что-бы сделать игру с подобным движком поверхностей, нужно не пару дней. Пол года минимум жесткой разработки и тестов.

  • @bezinteresa6806
    @bezinteresa6806 Год назад +1

    Илья лучший

  • @gm_Maker
    @gm_Maker Год назад +1

    Офигеть... Спасть отменяется :)

  • @jcdentonalexmelyon3664
    @jcdentonalexmelyon3664 Год назад

    Оч круто

  • @La89095168648
    @La89095168648 Год назад

    Очень круто! Ты молодец! 🔥

  • @iOzz
    @iOzz Год назад +1

    Прочти полностью)
    Гениально). Я искал похожий материал год назад). Я всеми 5ю руками за вторую часть ролика с оптимизацией кода. Могу тут скинуть пару вариантов. Но я не могу сам допилить и не могу избавится от бага, когда ломается меш.
    * Вот полу-осмысленные наброски в теории
    Объединить два цикла, которые перебирают сегменты landLine и CircleLine. Это сократит количество итераций вдвое.
    А вместо использования списка для хранения точек использовать набор хэшей. Это позволит проверить, существует ли уже точка в наборе, за постоянное время, а не за линейное время, как в случае со списком.
    Вместо того, чтобы перебирать точки на линиях и проверять, являются ли они пересечениями, можно создать отдельный список точек пересечения. Это позволит перебирать только пересечения, а не все точки на линиях.
    Можно рассмотреть возможность использования более эффективного алгоритма обнаружения пересечений, например алгоритма Бентли-Оттмана. Этот алгоритм имеет временную сложность O(n log n) для n сегментов, что может быть быстрее, чем текущий алгоритм для большого количества сегментов.
    Возможно использование структуры данных пространственного индексирования, такой как дерево квадрантов или дерево k-d, для хранения сегментов и быстрого поиска пересечений. Это может значительно сократить количество итераций и повысить производительность алгоритма

    • @iOzz
      @iOzz Год назад

      public List Substraction(Line landLine, Line circleLine)
      {
      // Create a list of intersection points
      List intersections = new List();
      // Combine the two loops that iterate over the segments of the landLine and circleLine
      for (int l = 0; l < landLine.Segments.Count; l++)
      {
      Segment landSegment = landLine.Segments[l];
      Vector2 al = landSegment.A.Position;
      Vector2 bl = landSegment.B.Position;
      for (int c = 0; c < circleLine.Segments.Count; c++)
      {
      Segment circleSegment = circleLine.Segments[c];
      Vector2 ac = circleLine.Segments[c].A.Position;
      Vector2 bc = circleLine.Segments[c].B.Position;
      if (Intersection.IsIntersecting(al, bl, ac, bc))
      {
      Vector2 position = Intersection.GetIntersection(al, bl, ac, bc);
      Point crossPoint = new Point();
      crossPoint.Position = position;
      crossPoint.LandSegment = landSegment;
      crossPoint.CircleSegment = circleSegment;
      crossPoint.IsCross = true;
      intersections.Add(crossPoint);
      }
      }
      }
      // Use a hash set to store the points
      HashSet allPoints = new HashSet(landLine.Points);
      bool onLand = true;
      Point startPoint = allPoints.First();
      while (allPoints.Count > 0)
      {
      Point thePoint = allPoints.First();
      // Check if the point is outside the circle
      if (_circleCollider.ClosestPoint(thePoint.Position) == thePoint.Position || thePoint.IsCross)
      {
      allPoints.Remove(thePoint);
      continue;
      }
      // Collect points in a chain and assign NextPoint to them
      for (int i = 0; i < _testIterations; i++)
      {
      Line currentLine;
      // ccw -- counterclockwise
      bool ccw;
      if (onLand)
      {
      currentLine = landLine;
      ccw = true;
      }
      else
      {
      currentLine = circleLine;
      ccw = false;
      }
      int currentIndex = currentLine.Points.IndexOf(thePoint);
      int nextIndex = GetNext(currentIndex, currentLine.Points.Count, ccw);
      Point nextPoint = currentLine.Points[nextIndex];
      // Check if the next point is an intersection
      if (nextPoint.IsCross)
      {
      onLand = !onLand;
      nextPoint = onLand ? nextPoint.LandSegment.OtherCrossPoint(nextPoint) : nextPoint.CircleSegment.OtherCrossPoint(nextPoint);
      }
      thePoint.NextPoint = nextPoint;
      allPoints.Remove(thePoint);
      thePoint = nextPoint;
      }
      }
      // Recalculate the lines with the updated points and intersections

    • @Scriberrot
      @Scriberrot 2 месяца назад +1

      друг, я весь твой коммент заскринил и в рамочку сейчас вставлю, xD

    • @iOzz
      @iOzz 2 месяца назад

      😅 жесть я тут расписал)) не помню уже@@Scriberrot

  • @Driftmaniak_UA
    @Driftmaniak_UA Год назад

    А смог бы сделать гонки с физикой как в F-Zero?)

  • @andrzejhubski3629
    @andrzejhubski3629 Год назад

    Блин где же ты год назад был…

  • @sanosanbaby
    @sanosanbaby Год назад

    скорей всего будет некорректно работать при реберных пересечениях, почему не использовать Clipper Library, которая специально создана для выполнения булевых операций над полигонами (объединение, пересечение, вычитание, исключающее ИЛИ) и смещения контуров полигонов на основе алгоритма Вейлера-Азертона

  • @ko-games7768
    @ko-games7768 Год назад +2

    Давай Worms в 3D.

  • @SPORTCHEER
    @SPORTCHEER Год назад

    о круто с яндексом калаба)

  • @jil635
    @jil635 Год назад

    Можно реализовать достаточно быстрый метод с пикселями, нужно только знать как пользоваться вычислительными шейдерами)

  • @java198626
    @java198626 Год назад

    Огромное спасибо за пример пример проекта. Если нажимать ПКМ, то да мэш перестраивается и все отлично работает, но лишь при однократном нажатии, если же сделать изменение каждый кадр, т.е. пока кнопка зажата, чтобы как бы рисовать дыры в мэше кистью, то Юнити крашится. а алгоритм начинает неверно рассчитывать Мэш. Не решали ли Вы или кто здесь эту проблему, поделитесь пожалуйста, если удалось у кого решит ее. Заранее Спасибо.

  • @dclxviclan
    @dclxviclan Год назад

    All my childhood in one video

  • @Kitsikoo
    @Kitsikoo Год назад +1

    Изобрёл Boolean)

  • @qdnr
    @qdnr Год назад

    Шо делать если на виеде 7 не работает вс2019, точнее он вообще нехочет скачиватся

  • @wofogames1139
    @wofogames1139 Год назад +1

    Хм, интересно а насколько производительно будет в трехмерном пространстве

    • @user-wq2cl7hl1o
      @user-wq2cl7hl1o Год назад

      смотря сколько точек у вырезающей фигуры)

  • @insoaryt
    @insoaryt 11 месяцев назад

    А нет ли какого-то другого способа создавать/редактировать 2д меши, кроме как тащить их из коллайдера? Имхо меш в данном деле - первичен. И по-хорошему коллайдер при создании должен откуда-то его получать, а не раздавать.

  • @igorshlyakov9321
    @igorshlyakov9321 Год назад +1

    Очень сложно... я мозг взорвал..., но оторваться не могу

  • @DimokFa
    @DimokFa Год назад +3

    Теперь чмыри Сакутина, как он чмырит Хауди Хо.

    • @Tumanop
      @Tumanop Год назад +2

      Благородный человек не смеётся над юродивами.
      Так говорил Конфуций

    • @gm_Maker
      @gm_Maker Год назад

      😂

    • @igorshlyakov9321
      @igorshlyakov9321 Год назад

      Они друзья, на сколько я помню)

    • @igorshlyakov9321
      @igorshlyakov9321 Год назад

      @Вин Ты назвал его глупцом, но сделал это без уважения)))

  • @alekseyn7866
    @alekseyn7866 Год назад +1

    Коллеги, кто знает: в стим можно выпустить бесплатную игру со встроенной рекламой или там это запрещено?

  • @gamebit3762
    @gamebit3762 Год назад +2

    почему всё на гениальном языке?

  • @igort1642
    @igort1642 Год назад +1

    Отсыпьте лукасов, да побольше!))

  • @4rtochka
    @4rtochka Год назад +2

    Интересно , как они это на sega сделали

    • @user-xk7vy9bv9h
      @user-xk7vy9bv9h Год назад

      там подмена спрайта с помощью маски, как я себе это представляю

  • @user-wg9pz4fw3i
    @user-wg9pz4fw3i Год назад +1

    Привет

  • @Xtonior
    @Xtonior Год назад +1

    Блин, наверное прошу много, но было бы лучше ссылку на гитхаб, что бы не качать проект)

  • @vitaly6838
    @vitaly6838 Год назад +2

    Создал булевы операции с нуля

  • @Obelardos2
    @Obelardos2 Год назад

    Интересная задача и хорошее объяснение. Но в бою (не в туториале) такой код с объектами на каждый шаг, листами, linq и тд не годится, еще нужно оптимизировать теперь все это по памяти.
    А так супер!

  • @EmeraldForestCat
    @EmeraldForestCat 8 месяцев назад

    Возможно в оригинальных червяках используется что то вроде текстуры части которой исчезают с помощью альфа канала. То есть взрыв по своей сути похож на кисточку в фотошопе. Наверно этот вариант и сейчас должен работать очень стабильно.

  • @modjaid3907
    @modjaid3907 Год назад

    Вормс с нуля за два дня?! Это точно туториал? Или просто психологическое уничтожение средненьких разработчиков?

  • @KrutaMan
    @KrutaMan Год назад

    как то сложно ты решил сделать, должно быть все гораздо проще

  • @DeadFaceMan
    @DeadFaceMan Год назад

    прошел б курс но изза яндекса не буду

  • @PavelNebo
    @PavelNebo Год назад +1

    Круто, алгоритм отличный, было интересно помсмотреть. Даже захотелось в Юнити вернуться)) ты мотивируешь !