⛏️Minecraft на Unity3D, шейдер для мира (часть 4)
HTML-код
- Опубликовано: 1 июн 2024
- Четвётрое видео из плейлиста по созданию клона Minecraft в Unity 3D. В этом проекте мы разберёмся с генерацией 3D моделей из кода, шейдерами, оптимизацией, и ещё множеством аспектов разработки игр. В этом видео напишем хитрый шейдер, с помощью которого будем текстурировать мир нашей игры
Следующее видео: • ⛏️Minecraft на Unity3D...
Плейлист со всеми сериями: • ⛏️ Minecraft на Unity
Содержание:
0:00 - Вступление
0:33 - Текстура без шейдера
4:40 - Что за шейдер
5:25 - Начинаем делать шейдер
12:59 - Боковые грани
16:01 - Разные типы блоков
20:25 - Заключение
На этом канале регулярно появляются новые видео, которые позволят тебе научиться создавать игры, или подарят новые идеи и вдохновение, если ты уже умеешь. Подписывайся!
Остались какие-то вопросы, пожелания, или идеи для других видео? Смело пиши в комментарии под видео
Поддержать канал:
btc: bc1q5mycq8x9jr7s0r63xx00xt50tjepflyhlzc09q
eth/usdt(erc20): 0xa30F22fb9898fdc8801703723cd77BE7E678ee13
emeraldpowder.github.io/ru/do...
Комментарий для продвижения канала
Я просто не могу, твои видео настолько интересные, что аж грустно. Они пролетают почти мгновенно. Очень полезные видео!
Очень жду следующую серию.
Спасибо за контент!
Спасибо за отличные видео! Жду с нетерпением новую серию!
Очень познавательно и очень интересно, не останавливайся!
Спасибо за все что ты делаешь. Обожаю смотреть тебя
Привет. Хотелось бы добавить, что для определения позиций блоков лучше пользоваться не относительно разрешения текстуры и пикселей, а относительно сетки. Тогда можно будет легко изменять код, если разрешение текстуры меняется или сетка
Почему бы для типа блока из еnum использовать полноценный объект.
Например
Grass = {upUv: {x: 32, y: 16}, sideUv: {x: 16, y: 16}}
Тогда создатель координат не будет думать о типе координат просто прочтёт из объекта который ему дали.
В остальном спасибо что напомнил про щейдеры :)
Когда то я тоже с ними игрался. Только вот аудитории это очень плохо заходит.
Программирование шейдеров похоже на магию.
Спасибо за интересные ролики по разработке)
Очень круто! Было бы интересно увидеть вашу реализацию дня и ночи и возможно, вид от первого лица
Спасибо! Про смену дня и ночи кстати есть старый видос на канале, как же давно я его снимал ruclips.net/video/5i-XCz_GQT4/видео.html
Каждое видео - праздник в календарь )
Много условий для нахождения blockType, это, конечно, весело, но можно ведь айдишники блоков использовать и их порядок на большой текстуре, чтобы без условий, через остатки от деления (на кол-во блоков в одном ряду текстуры) прибавлять нужный uv в зависимости от id блока и его позиции на текстуре. Так мы обойдёмся одной простенькой функцией, и не нужно будет отдельно проверять каждый вид блока
то же самое хотел написать)
а лучше гибридный вариант, чтобы простые блоки находились по id (умножение uv на id), а у сложных блоков чтобы была возможность брать по кастомным uv в коде этого блока
@@user-tm5hi7xs3i да, но в таком случае, скорее всего, придётся отделить простые текстуры от сложных, чтобы id не сбивался из-за разного количество текстур и самих блоков
@@kir4h_YT да, можно сделать один файл с простыми текстурами по блокам, а остальные файлы под сложные текстуры
У масштаба в таком виде проблема: боковая текстура травы относительно верхушки правильно рисуется только каждые 4 блока. В остальных случаях там рисуется та часть, которая больше похожа на землю. Возможно, могут возникнуть проблемы и с другими блоками, где разные стороны имеют разные текстуры
приятно видеть, что ты не забросил канал. Спасибо😘
Очень подробный разбор игрушки, спасибо
Результат ОЧЕНЬ хороший!
Крутяк!))
больше шейдеров умоляю, однозначно на ютубе ты лучший по ним
Спасибо, очень интересно)
Спасибо, интересно)
Лучшее видео! Я подписался! Уже хочу поиграть в альфу как в манйркафте!😄
Спасибо. Почти всё не понятно, но очень интересно 😁
Очень интересное видео!
Очень круто!
Это реально полезно!
Сделай возможность ставить площадь блоков сразу как в скрепмеханик🥰
Точно, блоки здесь меньше чем в Майнкрафте, поэтому такая функция была бы вполне оправдана
@@tiny_tin либо ещё вариант сделать сразу большие блоки из который уже можно будет выдалбливать какие-то элементы, но мне первый вариант больше нравится
Мне кажется лучше было бы сделать как в моде chisels&bits для того же майнкрафта: руками ставится один большой блок, но с помощью инструмента можно его разбирать на более маленькие (там вроде они в 16 раз меньше стандартных блоков)
@@noelka8134 я это тоже предлогал ниже
Интересная задумка, но проще и красивее по стандарту использовать цельные текстуры для цельных блоков, но просто перерисовать их в соответствии с желаемым масштабом. Например, 4х4 текстура и блоки в 4 раза меньше в коде (хотя проще размер персонажа увеличить в 4 раза). Так и вычислений на видеокарту меньше ложится, и код везде понятнее, и боковая текстура травы адекватнее выглядит, и видеопамяти меньше занято. В идеале вообще наслайсить текстуры в Texture2DArray, чтобы не вычислять uv каждой текстуры, а просто передавать индекс текстуры через uv2. В шейдере благодаря встроенным функциям Unity это требует замены лишь нескольких строк кода, зато удобства привносит - хоть отбавляй.
добавь шум на массив блоков травы, что бы блоки отличались оттенками, да и в данном случае я думаю лишним делать боковую текстуру для травы учитывая размер блоков, лучше оставь как сверху так и сбоку текстуру травы, а уже под этой травой блоки с цельной текстурой земли. можно добавить вкрапление блоков камня, земли на верхнем слое
Потрясающе ❤❤❤❤
Надо бы повторить 😎
Привет, всё очень круто делаешь спасибо за туториалы. У меня есть одна просьба, не мог бы ты прикреплять весь код из туториала к видео(так было бы гораздо удобнее)?
Спасибо за видео.
Можешь добавить USDT в TRC20 или в BEP20 кошелёк в описание, а то очень неприятно платить комиссию в 3.2 USDT.
И немного по поводу блоков - не знаю будешь ли ты менять это потом или нет, но я бы убрал нафиг enum и добавил бы класс блока, в котором лежало бы его название и текстуры на все его стороны, а то сейчас нельзя добавить блок с уникальными сторонами ну и получается, что нам для каждого блока надо прописывать магические цифры отступа в коде (лучше их всё-таки в инспекторе прописывать)
И часть 4, а не 3)
Спасибо, часть поправил, с кошельком разберусь и добавлю)
В 6-й части почти так и сделаю, чтобы можно было добавлять разные типы блоков с разными сторонами. А после этого верну всё обратно к захардкоженым значениям, в частях где оптимизацией будем заниматься
Кстати можно через Scriptable object это реализовать. В целом там тоже придется прописывать значения, но кмк куда проще :)
@@sergio_nikol согласен, 6 эпизод будет про скриптаблы, как раз там эти координаты туда вынесем. Хожу тут по комментариям, разбрасываю спойлеры на следующие части)
@@EmeraldPowder хех :) Я бы кстати еще для оптимизации не делил бы на 256, а умножал на 0,0625 если таймпапа 16*16. Деление все-таки дорого стоит, а умножение проще. И координаты будет проще передавать: 0/15. 5/15 и т.д. :)
Ця гра нагадує мені таку гру, як Scrap Mechanic(За механікою маленьких блоків).
Эта игра напоминает мне такую игру как Scrap Mechanic (За механикой маленьких блоков).
Спасибо за интересные видео ^>^
Насоветовали в комментах уже несколько клонов маинкрафта, надо будет посмотреть, вдруг новых идей найду, дякую)
Очень мощный и плотный урок по изучение шейдеров. Да еще и на реальном примере. Я как то смотрел как именно программируют шейдеры, но там было что то невероятно сложное и непонятное для моего уровня. Тем более когда в шкиле прогуливал геометрию и математику. Да и в институте тоже прогуливал, хотя почему то очень нравилось теория вероятностей. В общем не математического склада ума. После этого опыта шейдеры всегда обходил стороной. Но после этого материала понял, что все же стоит изучить эту тему, и научиться писать шейдеры. Весьма полезно и интересно. Плюс видимо есть много готовых решений для изучения. Еще раз благодарствую и низкий Одзиги.
Рад стараться) Меня тоже пугали когда-то шейдеры, потому что там все в статьях делали какие-то модели освещения, отражения, тени, и прочее. Но в какой-то момент я понял что это конечно всё хорошо, но шейдеры можно использовать чтобы просто делать всякие эффекты, вроде этого, или там плавную заливку, уход в невидимость, сгорание, и сразу стало понятнее зачем и что это
спасибо
Ура новое видео!!!!!!!!!!
Шикарный ролик! Генерация окружения сложная темя, но может получится о ней рассказать в рамках этого цикла.
Спасибо! Следующая часть будет как раз чуть глубже про шумы и генерацию
@@EmeraldPowder а мне интересно, как работает система сохранения мира, надеюсь это тоже будет
@@tatovka5209 наверное можно сохранить массив блоков чанка с помощью json (сначала создать Спомогательный класс который будет хранить значения массива, потом сохранять это значение класса в файл с помощью json utility)
@@gamear8211 можно ещё сохранять только изменения относительно сгенерированного чанка, тогда в больших масштабах это будет легче)
@@gamear8211 json это все же строка, и каждый раз ее парсить не очень эффективно
Очень интересно, но пока что сложно для меня)
Не рекламы ради, а примера для:
Есть игрушка, "Vintage Story", довольно таки хардкорный майнкрафт, где есть это самое разделение блока на мелкие части. Когда ты с одного блока "выпиливаешь" себе вазу, или лейку по слоям из блока глины, чтоб потом ее запечь в костре. Или выпиливаешь из камня наконечник для копья или ножа, чтобы уже пользоваться готовым предметом как надо))
Довольно таки забавно...
ты про
Ну во первых - костыль с мнением, что могут быть только перпендикулярные стороны - медвежья услуга самому себе)
Ну и во вторых - с боковинами травы поторопился) и в целом надо бы на шейдер куда больше времени потратить чтобы сделать скейлы более интелектуальными)
Ну и в третьих - классное видео, лайк в копилку
С боковинами да, но их текстурой можно поправить, в каком-нибудь из следующих видео поправлю) А вот про стороны тут я точно уверен что у меня не перпендикулярных не будет, там если с ними бороться то надо ещё наверное такой же видос на пол часа записывать
Привет!
Смотри, такой вопрос.
Чанк это геймобджект на котором висит атлас текстур, тобишь кубы не являются геймобджектами в отдельности. Но что если я хочу задавать кубам текстуры не из этого атласа, а из отдельных изображений (отдельная картинка с текстурой для камня, земли и т.д).
Привет. Для этого нужно либо генерировать разные меши, один только с блоками земли, один с деревом, и т.д, и каждому задавать свой материал. Либо разные submeshes, чтобы в меш рендерер можно было задать несколько материалов массивом. Хотя в итоге работать это будет примерно одинаково, и соответственно чем больше мешей, тем тяжелее будет сцена, так что с атласами и одним материалом вариант мне больше нравится
@@EmeraldPowder Привет. Да я тоже так подумал, и остановился на атласе. Есть ещё один вопрос, выделение чёрного контура на блоке, на который смотрит персонаж. Я сделал геймобджект куб с аутлайном (сам куб невидимый), который подставляется под координаты блока, на который собственно и смотрит игрок. Такая реализация норм? Или можно как то попроще да поумнее
Жду падающие деревья)
если делаю тру клон майна, в блоки такие же как в майне, то будут ли нормально ложится текстурки на блоки без шейдера?
как в этот шейдер добавить распознование прозрачности(для воды, стекла и подобному)? не особо разбираюсь, чего то там попытался сделать, не получилось
Привет, я буду держать за тебя и эту игру кулочки🤜🤛, не скромный вопрос эта игра на телефон или же ПК?
На пк
Ну кстати учитывая какие маленькие тут блоки, траве не обязательно брать разные текстуры для каждой стороны блока.
У меня не работают хоткеи по типу "ctrl+alt+M" для этого нужно какое-то расширение, или в ручную настраивать?
В Rider в настройках можно в разделе Keymap выбрать раскладку, у меня выбрана Intellij, с неё хоткеи и подписываю
Сюда бы деревьев добавить)) Думаю деревья это интересная задача
не настолько) в том же майнкрафте заранее заготовленные деревья размещаются в рандомных местах. Другое дело сделать рандомную генерацию каждого дерева от корня к веткам, и еще чтобы росли во время игры. Вот это было бы интересно)
Хотілося би таку гру в плей маркет
скоро у моджанг появится конкурент
А как можно сделать траву, цветы, лозу всякую... забор, кнопку... ? (То, что не формы куба)
Видел в каком то клоне маина эффект, что загружаемые чанки не просто появлялись, а как бы выезжпли снизу. Смотрелось интересно.
В самом майне такой мод есть, называется chunk animator. Он кстати даже несколько улучшает загрузку чанков, но тут уже хз за счёт самого ли эффекта, или там "бонусом" ещё патч на оптимизацию
Есть такой мод для оригинального майнкрафта.
пытался добавить прозрачные блоки, вроде получилось, но бывает видно через текстуры кубов другие грани кубов, как наслоение на передний край, хотя объект дальше стоит.
Подскажите, плз, как это решается
Если прозрачные добавлять, то по идее их нужно считать так же как воздух при проверке соседей. То есть если по соседству прозрачный блок - то всё равно генерировать грань
хм, вышла 5 часть, а я оказывается еще 4 не видел
Ну впринципе майнкрафт уже готов, осталось добавить сервак. Спавн пресетов из блоков в виде массива кубиков поверх верхних блоков. И поиграться с процедуркой типо пещер, все это еще снхронизировать через сервер. Крутая работа. Даешь волну майнкрафт проектов по всему русскому геймдеву)
Кстати тут не так уж и сложно было бы добавить онлайн, пока нет всяких печек, айтемов, и пвп. Но я всё же не буду, пока будет больше про процедурную генерацию и оптимизацию)
Оставьте ссылку на это блаженство это очень круто
Насчёт текстурирования блоков: triplanar effect, это не из этой оперы?
Да, этот шейдер очень на него похож. Точнее по сути это оно и есть, но у меня частный случай, где все полигоны параллельны осям координат, так что мне не надо было париться с интерполяцией, чтобы наклонные и изогнутые поверхности хорошо смотрелись. И текстура пиксельная, с ней особо не важно если она повернётся или отразится, так что поэтому там любые x/y/z можно друг на друга менять, всё равно смотреться хорошо будет
20:23 По сути текстура травы сломана так как верх боковой текстуры должен всегда касаться верхней текстуры что происходит не всегда. Ещё интересно как бы выглядела в такой системе текстур установка блоков по типу верстака, он бы тоже был сдвинут куда-то?
Ага, ниже уже писал, там по моему плану надо было боковую текстуру травы нарисовать в 4 строчки, чтобы каждые 4 пикселя по вертикали были как будто свисает трава сверху блока, тогда будет хорошо смотреться. Ну и конечно надо ещё логику как в Майне сделать чтобы только верхний блок был травой, а нижние становились землёй
хехе, встроенные шейдеры для rtx 4090)
А можно обойтись юез кучи условий при определении того, какой блок генерить? Например посчитать в атласе текстуры только первый блок, а потом умножать его на нужный(если я правильно помню то, что енам возвращает число). Ну или как-то так
Можно и так, да, enum это число, так что если в текстуре просто по порядку расположить все блоки, и задать типам такие же id'шники, можно будет брать тайл по номеру. Но пока у меня тут всё в работе и ещё несколько раз переделается эта система, я текстуру хотел по миниму редактировать
Можно будет упростить код переделав его на switch case. Но сделать атлас это нафиг не надо. Не все текстуры могут быть использованы, в одном блоке может быть несколько текстур. Лучше для каждого типа делать все-таки свою проверку.
Тут явно надо как то делать автовыбор тайла. Какой то конфиг для текстуры что ли (в случае с травой и боковушками так придется).
Я так понимаю что всякие печки и верстаки это все таки будут отдельные блоки, а не часть меша? Или таки встраивать в меш, и вешать типа коллайдер для взаимодействия с игроков при нажатии
Зачем нам отдельные блоки, если все блоки хранятся в массиве, просто читаем массив
@@gamear8211 я имею в виду не пихать их в меш. Вкл/выкл коллайдер у ворот/дверей при их открытии и закрытии например
Нужно сделать шаблоны, такими маленькими блоками что-то строит сложно. Например делаешь блок на 5 на 5 на 5 и сохраняешь в шаблоны и пользуешься и за один такой блок с инвентаря отнимается 125 маленьких блоков.
можно назвать предметы по разному, например куб и кубик. Из 125 кубиков можно крафтить кубы и ставить уже их
Это конечно хорошо, но это чудо надо оптимизировать. Генерация мэша заново занимает 300 мс времени, ещё больше если пробовать на мобильном устройстве. Даже нет идей как это оптимизировать, может можно повозиться с compute shaders?
Обязательно будем оптимизировать в следующих эпизодах, но там пока без compute shaders планируется
очень интересный и познавательный видос, но боковые стогны у блока земли с травой выглядят топорно: верхнюю четверть текстуры занимает трава, а остальное земля если у нас блок = 1/4 текстуры, то получается что верхний слой сбоку полностью зеленый, а остальные полностью коричневые. в голову не приходит как это можно исправить.
Возможно, скейлить боковые стороны отлично от верхней.
Видео крутое, но ты в названии написал "(часть 3)", хотя это 4 часть
а игру можно будет скачать?
проблема еще выявилась, на отрицательных координатах в чанке по его локальным позициям x=1 и y=1 блоки не ставятся на самом чанке, а переносятся на какой то другой чанк и даже не на те координаты на которые ставил(Допустим чанк -1;-1 , ставлю блок на координаты 1;~;5 по локальным, и этот блок ставится на чанке -2;-1 на координатах 1;~+1;6, короч сложно всё, попробовал код этот на 2021.3.36f1 и на 2022.3.36f1, код переписывал с четкостью, не думаю что два раза смог бы ошибиться, вообщем вот, не знаю решится ли вообще эта проблема
)
Как теперь сделать генерящийся в реальном времени дистант ленд?
Было б круто еще ссылочку на png текстуры
а что если текстурка травы серая, ее надо как то раскрасить (добавить фильтр) под каждый биом, как это сделать
пока что я сделал костылями так
if (IN.uv_MainTex.x + offset.x = 0.9375)
{
o.Albedo = c.rgb * float3(0, 1, 0);
}
else
{
o.Albedo = c.rgb;
}
подскажите пожалуйста нормальный способ)
какое имя у этого преложения
Потрясающий урок! Спасибо вам!)
P.S. - У меня не получается довести дело из этого видео до финала, а именно трава в конце видео. При передаче в AddUvs типа блока Grass - все чанки генерируются так, будто передали неизвестный тип блока. (искал ошибку, пересматривал видео, но все-равно не могу понять почему не выходит как на видео.... помогите кто-нибудь разобраться, пожалуйста)
возможно у тя фотка другая, как и у меня, вичисляй координати, будут другие
Добавь траву деревья мобов ночь инструменты броню и оружие этого не хватает,и ещё деревни
То чувство, когда взял оригинальную текстуру 4096 на 9472... и пытаешься высчитать пиксели в пейнте линеечкой, а потом тебя, таки, осеняет, что куб 256 на 256...
Тебе так до движка на юнити не далеко)
Самый неоптимизированый движок
Можно будет сделать тень игрока
Жаль что нотч не выкладывал такие видео когда делал кубачь)
У него тоже вроде были девлоги, но формат конечно другой был)
Размер блоков слишком маленький, не удобно будет играть, текстуру поменять травы, слишком насыщенная. Шейдер неба немного мягче сделать
Я понимаю, что ты записал все ролики заранее, но использование .ToArray() 3 раза при генерации меша всё ещё заставляет мои глаза болеть)
Записал заранее, да. Но там дальше будут видосы с оптимизацией, там toarray уберем, и глаза будут болеть только от того что наоборот слишком оптимизированно)
4 часть, а не третья
У кого блоки шакальные, отключите фильтр в импорте
@Emerald Powder - CMDR GIF это ты? Я теперь не могу расслышать очень сильное сходство в голосе.
Не, не я. Возможно какое-то сходство есть)
@@EmeraldPowder включил два видео, твоё и GIFа, ооочень большое сходство) За видос спасибо
В самом конце не все боковые стороны земли правильно выбрались.
Согласен, там из-за того что текстура не рассчитана на такой подход не так красиво смотрится. Я бы её отредактировал, сделал бы не одну линию со свисающей травой сверху, а 4 разных. Возможно в какую-нибудь следующую часть добавлю такую модификацию
Хотелось бы увидеть ввод команд такие как смена игрового режима, сохранения инвентаря и сложность
блин, да это же копатель онлайн получился!
Пока очень интересный проект, хоть за юнити я не шарю смотреть очень интересно. У меня появился вопрос - Будут ли добавляться различные эффекты для атмосферы, я понимаю что рад этим думать ещё рано, но например в том же Teardown очень много различных видов эффектов на подобии дыма, тумана, огня и т.п.
Как быстро оказывается можно натянуть текстуру.
Ты знал что 64 чанка хранятся в регионах? Это для бесконечного мира
Топ проект. Где исходный код?
Будет в конце проекта
Это 4 часть, а не третья.
про коды
ну тут уже не Minecraft, а Teardown
на teardown похоже
а зачем вручную считать пиксели текстурки, почему нельзя это с помощю матрицы сделать ? оно ведь все квадратное
Лол просто сделай деревья и мир будет выглядеть гораздо лучше. Кроме этого можно сделать камни и ветки валяющиеся на земле.
А ета ігра на андройид буде
Нет
Эти текстуры с версии 1.5 даже с 1.7.10
Может быть, я в давние времена играл, как раз когда такие текстуры были)
@@EmeraldPowder Какой ты(вы) старый :)
почему всё такое маленькое . И добавь ДЕРЕВЬЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
Деревья неплохая идея, но пока про них не отснял ещё, так что в ближайших сериях их пока не будет. А маленькое - это про блоки, или про код/юнити на видосе?
@@EmeraldPowderЭто я про блоки.
а де портал?,_,