Генерация уровня из 3D тайлов: часть 1
HTML-код
- Опубликовано: 23 сен 2024
- Существует много идей и алгоритмов для процедурной генерации различных уровней и миров, в этом видео я начну разбирать алгоритмы связанные с созданием мира из воксельных тайлов. Особенность этого генератора будет в том что для создания уровня не нужно будет настраивать никаких правил, только нарисовать в воксельном стиле 3D модели тайлов, из которых будет автоматически генерироваться уровень. В этой первой части мы разбираемся с основной системой для генератора - автоматическим определением можно ли поставить тайлы рядом друг с другом по цветам вокселей края каждого тайла
Плейлист про генерацию из тайлов: • Генерация мира из тайлов
Следующее видео: • Генерация мира из 3D т...
Patreon канала - / emeraldpowder (там уже есть проект из этого видео)
Наш Discord - / discord
Готовый проект из всех пяти видео: github.com/eme...
На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь. Подписывайся!
Остались какие-то вопросы, пожелания, или идеи для других видео? Смело пиши в комментарии под видео
Чуть мозг не бомбанул) Обязательно посмотрю продолжение. На уровне Sebastian Lague канал, только по русски. Даёшь ликбез в массы! Процветания каналу.
Это как минимум, контент Бомба :)
ТРЕБУЮ ЗАКРЕПИТЬ КОМЕНТ!!!
Я: кто такой Sebastian Lague?
* вбиваю в поиск *
Мне показывает канал с надписью: вы подписаны.
Если что, я мало на какие каналы подписан.
pro tip: watch series on Flixzone. Me and my gf have been using it for watching a lot of movies lately.
@Jamie Aryan Yea, have been watching on Flixzone for years myself :D
Наконец-то! Годный и качественный канал по Unity. Где разбираются интересные задачи. А не миллионный раз создают платформер.
В юнити совсем не бум-бум, но каждый твой ролик помогает мне узнать что-то новое. Спасибо
Огромное спасибо, сегодня сделал свои моделки в воксели и настроил генерацию с помощью вашего канала и проекта! Теперь хочется строить города)
Блин, прям в точности то, что меня интересует последние время, словно мысли прочитали.) Будем смотреть.)
Кстати генерация майна наверно такая же
@@maldok4087, нет
@@maldok4087 нет, там не заготовленые тайлы, а рандомная генерация
@@maldok4087 Там шум Перлина используется
Очень интересная и актуальная для меня тема. Спасибо за подробную информацию!
прекрасный канал с интересными задачами и таким же интересным решением
Спасибо тебе за такие полезные видео! Продолжай снимать, многим этим помогаешь) Удачи в развитии канала!
Какой шустрый
Очень крутое видео, ты лучший разработчик на юнити на всем ютубе)))
Спасибо что продолжаешь выпускать классные видео)
Парень ты вывел меня на другой уровень представления)) Спасибо, что ты есть)
Мне эта генерация даже не нужна была, но видео прям затянуло. Мало ли, поможет когда-то, спасибо большое.
Если чесно,то ничего в программировании не смыслю но коммент пишу для продвижения в масы) лайк тоже поставил
Пожалуйста, сделай больше шрифт кода!
Генератор уникального контента!
Это конечно интересно все(без иронии), но как сделать облака в HDRP как динамический skybox -это да-это та тема видоса которую я хочу увидеть. И вообще хочу и жду видосы с HDRP
Отдельное спасибо за шорткаты в райдере :)
Коллапс волновой функции! Буквально пару недель назад про него статью писал!)
Спасибо за видос, как всегда информативно)
Что за статью? Я что-то про эту тему уже статьи четыре на хабре прочитал, вот и решил что точно нужно самому разобраться и другим рассказать)
@@EmeraldPowder я вконтакте пишу, отдельный мелкий паблик завёл, "Процедурный Вестник".
Статья называется "Не так страшен, как звучит: Коллапс волновой функции"
В основном там сверхпростым языком объясняются какие-то вещи из процедурной генерации. Поскольку я продаю софт тем людям, которые не сильно понимают, как это всё вообще работает, нужно как-то повышать образованность населения, так сказать)
На самом деле я собирался даже сделать видос про коллапс волновой функции, ибо видео про город зашло на ура вопреки низкому качеству, но раз уж ты(вы?) всё равно сделаешь видео на эту тему, и оно гарантированно будет лучше моего, то я выберу что-нибудь другое:D
@@EmeraldPowder upd:
только что проверил, паблик по поиску не бьётся, ибо мелкий, нужно смотреть по адресу /procedural_herald
Вдруг попалось твоё видео. Алилуйя! Я тут пытаюсь по словарю (grammaly template rnd gen) что то-то приемлемое построить, пока получается только полная дичь или примитивизмЪ.
Но просто посмотрев твой ролик, где ты очень ясно излагаешь свои мысли, я придумал еще один вариант. Код - ничто. Идея - всё! Но идея без понимания, как это реализовать - тоже ничто! Рабочий код - это всё! Но рабочий код без понимания почему и как он работает - это опять ничто. Спасибо тебе за отличный ролик! Тут и идея и реализация.
Очень интересно увидеть вторую часть
Спасбио, в следующее воскресенье выйдет
бро, извини, что лезу в твою песочницу, но не мог бы ты объединять видео по этой теме в один плейлист пожалуйста и в описании под видео оставлять ссылку на плейлист. я знаю, что их пока всего 2 на данный момент, но мне кажется зрителям так было бы удобней.
это очень скромная просьба, я не настаиваю
Сейчас они все в одном большом плейлисте про процедурную генерацию, наверное чуть позже сделаю отдельный для этой серии про тайлы и оставлю ссылку, спасибо за совет
@@EmeraldPowder На каком языке писал игру?
@@BlackWhite-gp8oz на Юнити только c#
@@zandkcsgo1040 мог сказать "на c#", я бы понял, а так у тебя не правильно сформулированное предложение
@@BlackWhite-gp8oz я бы так не сказал. Автор работает в юнити, а юнити поддерживает только язык с#
круто, но ведь соседние тайлы не обязательно могут быть одинаковые чтобы похходить друг другу.
Для поиска совпадения можно же использовать нижний (невидимый) слой тайла, так же тоже можно)
Все впитал, спасибо за контент !
Зачем я твои видео смотрю все до конца аааа, я ведь даже на юните ничего дельного не сделпю
Спасибо большое автору !!!
просто лучший спасибо за туториал
Получаю базовые знания о программировании из этих видео, языки прийдется учить самому но зато механики узнаю
Ну лайк!
Спасибо большое!
Привет, смотрю с интересом, и дальше буду смотреть части. Но есть пару моментов.
1) Не кажется ли тебе, что многовато хардкода с UV координатами? То что там не более 256 пикселей, то что смотрим только на x?
2) У тебя функция с рейкастом возвращает номер пикселя, и если не находит, вернет 0. Мне кажется, это не очень хорошо, ведь если точки на uv координате будет стоять в самом центре первого пикселя, то при усножении на 256 все равно даст 0. И тогда можно возникнуть путаница. Можно конечно сделать возвращать -1, если ничего не нашлось, но ещё лучше возвращать null(для этого нужно преобразовать тип возвращаемого значения в нулебл тайп, private !int...)
3) не очень хорошая идея сравнивать вектора. Дело в том, что они состоят из float, а сравнивать их опасно. Под сравнеием Я имею ввиду только операции == и != . Это из-за того, что float может в люой момент скакнуть с 1 на 0.99999 или 1.00001, и тогда == выдаст false. Так что, Я бы тут лучше сделал enum
4) Это уже мелочь совсем, но все же. Не думаю, что эта экономия на спичках с байтами, даст хоть какой-то прирост в производительности. А вот проблемы потенциально создать может.
Привет. Спасибо за замечания! Все по существу
Хардкода немало, да, но если модельки из MagicaVoxel то эти вещи не будут меняться. А если какие-то другие - то в принципе несложно зайти и поменять. Хардкода в видосах вообще получается больше чем в обычном коде, чтобы не тратить время видео на вынос всех переменных
Про 0 - да, наверное стоило об этом в видео сказать. Я нулевой цвет не использую, но можно поменять на int и сделать -1 для пустого цвета, если нужны все 256 из палитры. Nullable тоже можно, но он потяжелее будет. byte vs int - на 10 тайлов будет 2.5KB vs 10KB, в любом случае совсем не страшно
С векторами тоже сделал бы enum, но в видосе торопился и сделал так. Работать будет, они скачат только если с ними математические операции выполнять, если просто записать (0,1,0) то там всегда (0,1,0) и будет. Но если вот разделить на 2 и потом умножить то скакнёт, или вычесть и прибавить одно и то же число
@@EmeraldPowder Я понимаю, что эти замечания актуальны скорее для реального кода, чем для туториала. А про флоат - это просто личная боль, и Я уже просто боюсь его сравнивать напрямую) Кстати, в MagicaVoxel нельзя выставить, чтобы она экспортировала не 1*256, а 16*16?
float дает погрешность непредсказуемо. Даже не на очень то больших или маленьких числах. Поэтому... Кстати причина такого поведения флоата кроется в его реализации, а не в "размерности", это никак не связано с переполнением битового пространства отведенного под хранение.
Несколько замечаний.
2) В целом верно, но вместо возврата null лучше использовать Try Pattern
3) float сам по себе не может скакнуть с 1 на соседнее число. Енам тут, очевидно, стоит делать, но ваше утверждение насчёт float не совсем верно, просто есть числа, которые невозможно представить типом float, соответственно там может возникнуть погрешность, но само по себе это не происходит)
Ничего не понял, но очень интересно :)
Спасибо огромное! Продолжай!
0:00 похоже на настольную игру "Каркасон". Что-то типа домино, но с дорогами, стенами, полями и т.п.
Как здесь 0:01 короче.
Да, есть небольшое сходство. Настолка кстати неплохая, играл)
Я спустился в комменты только чтобы найти комментарий о каркассоне
@@Какое-тосущество-г4ц Копец)
хорошее видео, толково говорите
Спасибо!)
Лайк, это интересно
На порядок сложнее лабиринтов и чанков из прошлых видео.) Убил часа 3, наверное, но разобрался что в этих 20 минутах творится.)
Супер!!! Только шрифт мелковат.
Лучший
Спасибо ты гений
Why was this recommended to me? Video looks cool though even if a can't understand it.
i think this is that algorithm where world tiles have certain rules, like a beach tile has to be between sea and land, not 100% sure tho
Однозначно лайк
Во время видео.
- 8? Б** откуда 8? А это площадь стороны!
- 0.5 откуда? ААА Это размер вокса на 2 деленое.
- Тайл? Что за тайл такой? ААА я все забыл. А это квадратик в моделе.)
Спасибо. С отречества так мозг не напрягал. Удачи, и не останавливайся )
Ну ты крутой блин блинский!!
Лайк не глядя))
оч круто🙂
я афигел спасибо
Круть!
Как сделать процедурную генерацию леревьев на этих обьектах??
ого, всего лишь 8к подписчиков, я нашёл тебя
А как сделать большую разницу в высотах??
Привет, будут видосики "Все о DOTS" ?
А зачем тебе DOTS? ПишЫ мне на почту, я тебе курс скину.
Отличные уроки, отличный контент! Я правильно понял, что после сбора цветовой информации по сторонам, ты хочешь вставить этот рассчитаный массив уже в префаб? Чтобы каждый раз не вычислять цвета?
Спасибо!
Да, можно этот массив сохранить в префаб чтобы потом не считать, думаю в одном из следующих видео добавлю это. Но вообще эти вычисления не такие сложные, можно оставить в процессе загрузки сцены, то есть в Start'e, если конечно тайлов не под сотню и оно не тормозит
разве не лучше получать самые крайние точки меша чем пускать кучу рейкастов? да и оно будет странно работать если тайлы вплотную будут стоять друг к другу.
а так спасибо за урок) очень понятно и доступно объясняешь материал
Про крайним точкам меша цвет средних вокселей не определишь так просто, а если тайл 8*8 то они важны. Если вплотную то да, но я их тут расставляю сам, и потом скорее всего этот код будет вызываться только в редакторе, а массив цветов сохраняться где-нибудь в тайле
@@EmeraldPowder а как сделать рзменение высоты???
а почему ты используешь старую версию блендера? Ведь уже есть 2.83 версия
меджикт воксель где ее лучше скачать?
Привет!
Не замерял, насколько требователен такой подход к генерации уровня к системе?
Почему для генерации ты выбрал рейкасты для определения цветов и соответствий тайлов вместо преднастроенной матрицы соответствия + правила размещения?
По хорошему надо отдельным кодом, который выполняется при разработке игры, а не уже при запуске, посчитать и сохранить это всё куда-то чтобы потом использовалось. Но я до оптимизации уже не дошёл, и так было много всего. Точно не замерял, рейкасты не такие дорогие, но их там довольно много так что всё таки в готовой игре я бы не стал оставлять так
Привет, помоги мне пожалуйста, как экспортировать анимацию в unity , а я делал в MagicalVoxel
Мудрота.
Офтопный вопрос, что за текстовой редактор? Никак не привыкну к VS, оч хотелось бы что-то еще попробовать адекватное, с поддержкой Юнити-подсказок.
Jetbrains Rider
Вопрос, а можно это делать с не воксельными элементами
Чувак, где и как обучится программированию, я сколько не пытаюсь, не понимаю структуру
почему 8*8 а не 10 * 10 , чтобы в юнити был размером 1*1 ?
Мне вот интересно как это синхронизировать в мультиплеерной игре
Если набор тайлов один, то не так сложно. Сервер или хост генерирует карту, и рассылает всем двумерный массив из номеров тайлов. В реальной игре конечно сложнее будет, со всякими поворотами и дополнительными параметрами для тайлов, но в целом идея такая
Hi emerald, great tutorial again! I am wondering why the raycasthit's tetuxreCoord.x gives the colorIndex.
Hi, thanks! You can see the texture used on my meshes around 7:37, that's the way MagicaVoxel exports all textures. basically it's 256px*1px line, where each pixel is one color from palette. As the X coordinate in UV changes from 0 to 1, if we multiply it by 256, then values from 0 to 1 means it is first pixel, and hence first color from palette. 1 to 2 is second pixel-color, and so on
@@EmeraldPowder I am also wondering why the ray to get the pixel of the right side is shooting from the left(rayStart: -half on the x axis) to the left side of the tile, doesn't this give the left side pixels?
0:27 - «о коллапсе волновой функции много говорят» Где говорят?) Собственно вопрос что/кого читать чтоб быть в курсе? Посоветуй плиз источники, где всякие такие штуки обсуждают, ну или вообще что-нить интересное.
Я в основном много статей на хабре видел:
habr.com/ru/post/475188/
habr.com/ru/post/437604/
habr.com/ru/post/461323/
habr.com/ru/post/488336/
@@EmeraldPowder Благодарствую
ты можешь сделать материал невидимка который скрывает даже часть модель? Я понятия не имею, как это сделать!
Наверное, странный вопрос, я переписывал код по видео, у меня появлялись ошибки с названием переменных. Решил скопировать код скрипта. Но теперь почему-то не видно лучей
Привет, карта будет генерироваться безконесно?
Привет, в моем проекте только заданного размера, но можно его расширить, и когда игрок двигается к краю генерировать следующий кусок
Как сделать сетку? Чтобы объекты магнитились на центр каждой клетки?
Если при установке скриптом магнитились - делить координаты на размер клетки, округлять к целому, и обратно умножать. Если в редакторе - удерживать ctrl при перемещении, в Edit->Snap Settings настраивается размер сетки
@@EmeraldPowder Хорошо, спасибо!
Классная идея ) но есть же textureCoord у хита ruclips.net/video/iG_n23W952Y/видео.html , зачем так все усложнять ))
Хм, а ведь и правда. Я когда искал как получить координаты как-то эту фичу проглядел)
А как по нагрузке?
Столько циклов и проверок
256 рейкастов на тайл это совсем не критично, учитывая что это один раз происходит на старте. Главное это не количество циклов в коде, а сколько раз код внутри них в итоге выполняется
Мagic voxtel это конечно крутой конструктор но мне интересно сколько эта карта будет жрать ресурсов устройства на котором все это будет запускаться. А то я про magic voxtel слышал что там куева туча полигонов получается в простой модельке, и это вроде бы подтверждается. Ну если конечно все модельки не импортировать в какой либо редактор и не доводить до ума убрав лишние полигоны.
Получается больше чем если бы знающий человек моделлил тоже самое вручную, но все таки не прям на несколько порядков, так что можно и такие модельки использовать. Тем более в таком воксельном стиле вообще полигонов не так много. Но можно и довести до ума, если критична производительность на слабых телефонах, или каких-то тайлов на сцене тысячи спаунятся
Я не пробовал, но могу предположить, что это дело можно прям в юнити доводить до ума тулзой ProBuilder. Ну то есть открывать на редактирование модель и объединять/удалять полигоны. Раньше от этой же команды была тулза QuickEdit, не знаю, жива ли она сейчас.
Как изменить размер сетки для CTRL? Я искал, нигде не нашел, пишут невозможно
В верхнем меню Edit - Snap settings
А что за коллапс волновой функции?
Очень умно звучащее название алгоритма генерации, который будет в следующих частях видео. Там чуть ниже есть ссылки на статейки про него
можешь исходный код скинуть на диск, а не на сайт, куда платить надо?
Я обычно на GitHub заливаю проекты, там все бесплатно. Когда доделаю оставшиеся видео обязательно выложу!
А нельзя этот цвет как-то без физики определять? Тут же фиксированные размеры и ты знаешь, где каждый воксель находится.
Где находится воксель знаю, но чтобы понять в какой треугольник он экспортировался нужно либо делать рейкаст, либо можно перебрать все треугольники и посмотреть какие лежат на сторонах модели - но по сути это и есть переписать physics.raycast самому. Насчёт производительности эта часть физики не слишком затратная, тем более один раз при инициализации
@@EmeraldPowder если один раз, то можно наверно и в эдитор вообще вынести и сохранять в каком-нибудь поле префаба. Правда, не уверен насчёт физики в эдиторе.
О
что за хоткей в 8:30?
а то не могу так сделать
прийдетсья переписовать?
:(😟
не какой скрипт нормально не могу сделать(
что за хот кей?
Шрифт побольше
Сделай туториал, как сделать мульте плеер в 3D игре ПЖ
я программирую 3 дня я ещё язык не знаю только до циклов дошёл. зачем я это смотрю
Ж*
No entiendo como terminó viendo estas cosas
жду 2 часть. Поэтому сделал свой TileMap - ruclips.net/video/-s_cwjTdibE/видео.html
у меня этот код тупо выдаёт несколько критических ошибок
а как это в 2д реализовать?
Тоже самое, но брать цвет крайних пикселей. Можно облегчить алгоритм, задав для всех возможных типов сторон свое значение, тогда не придется сканировать пиксели.
Д
Е
Р
В
Н
П
Привет, очень крутые видео! Но, очень не хватает толкового урока, как сделать всё "K P A C U B O", то есть, НОРМАЛЬНО настроить пост обработку, освещение, сделать эффекты и т.д.
И
Что за скриптовый редактор юзаеш?
Jetbrains Rider, всем советую
@@EmeraldPowder никак не могу найти крякнутую версию. Раньше стояла, после переустановки винды не могу снова найти и не помню где брал
На каком языке пишешь?
В юнити сейчас все на C# пишут
Видео я слишком глуп для такого, как не пытался всё ровно ничего не понял...
Достаточно проверять три цвета: два угловых и центральный, вместо того, чтобы писать всю строку.
why is this in my recommended
Д
Е