Несовершенство компьютера
Есть много забавных ошибок, которые возникают из ограничений возможности компьютера в целом. Моих любимых пожалуй две, но суть у них одна :) Важно помнить, как работают простые типы. Поговорим про float. Я не буду говорить про неточности суммирования и строгие условия, это слишком банально и многие IDE сейчас подсвечивают :) Основное что надо помнить, что хранить он может 6-7 знаков. И из этого у новичков возникают забавные ошибки :) Почему в юнити float, а не double — это довольно долгий рассказ, может как-нибудь потом опишу :)
Получать gps координаты в float. Мало того, что gps сам по себе страдает в плане точности. И это конечно не критично, но важно знать, что будет если перегонять точку в float (что делают на удивление часто) Можно ли писать в float? В целом да, особенно при работе с навигацией, так как точность gps достигает 20 метров и зависит от широты и оборудования рядом (https://support.google.com/maps/answer/2839911?hl=ru&co=GENIE.Platform%3DAndroid) В Москве допустим точность около 5-6 метров. И когда вы округляете координаты до 7 знаков у вас получается точность страдает значения от примерно 80 сантиметров до 8 метров (так как долгота бывает трёхзначной) :) Что в целом ок, хотя лучше иметь ввиду, так как вы добавляете ошибку в несколько метров) Но всё же в кейсе навигации это не критично, а вот в расчёте расстояний ещё как важно. Так как обычно для этого хранятся 7 знаков только после запятой :)
Перемещать игрока в бесконечном мире. Ну тут та же забавная проблема. В бесконечных мирах есть много трюков, но если просто перемешать игрока не используя их, то проблема в позиции (1234567, 123467) мне кажется очевидной. У вас просто не будет работать дробная часть, и будет ошибка округления в 1 :) И там можно доводить до абсурда) А допустим 1 в вашем мире — это один метр) Почему же тогда в Unity float, а не double с его 15 знаками? Они что дураки?) Не, там всё довольно логично, но как я и говорил — это длинная история :)
Есть много забавных ошибок, которые возникают из ограничений возможности компьютера в целом. Моих любимых пожалуй две, но суть у них одна :) Важно помнить, как работают простые типы. Поговорим про float. Я не буду говорить про неточности суммирования и строгие условия, это слишком банально и многие IDE сейчас подсвечивают :) Основное что надо помнить, что хранить он может 6-7 знаков. И из этого у новичков возникают забавные ошибки :) Почему в юнити float, а не double — это довольно долгий рассказ, может как-нибудь потом опишу :)
Получать gps координаты в float. Мало того, что gps сам по себе страдает в плане точности. И это конечно не критично, но важно знать, что будет если перегонять точку в float (что делают на удивление часто) Можно ли писать в float? В целом да, особенно при работе с навигацией, так как точность gps достигает 20 метров и зависит от широты и оборудования рядом (https://support.google.com/maps/answer/2839911?hl=ru&co=GENIE.Platform%3DAndroid) В Москве допустим точность около 5-6 метров. И когда вы округляете координаты до 7 знаков у вас получается точность страдает значения от примерно 80 сантиметров до 8 метров (так как долгота бывает трёхзначной) :) Что в целом ок, хотя лучше иметь ввиду, так как вы добавляете ошибку в несколько метров) Но всё же в кейсе навигации это не критично, а вот в расчёте расстояний ещё как важно. Так как обычно для этого хранятся 7 знаков только после запятой :)
Перемещать игрока в бесконечном мире. Ну тут та же забавная проблема. В бесконечных мирах есть много трюков, но если просто перемешать игрока не используя их, то проблема в позиции (1234567, 123467) мне кажется очевидной. У вас просто не будет работать дробная часть, и будет ошибка округления в 1 :) И там можно доводить до абсурда) А допустим 1 в вашем мире — это один метр) Почему же тогда в Unity float, а не double с его 15 знаками? Они что дураки?) Не, там всё довольно логично, но как я и говорил — это длинная история :)
🔥2
Настоящим профессионалам не нужно наводить туман
Как легко отличить настоящего профессионала? Он не пытается запутать вас терминами и может объяснить что угодно на пальцах. Я очень не люблю, когда фразы типа иммутабельности, консистентности и т.п. используют что-то объясняя не профессионалам. Я часто сталкивался одно время с тем, что люди не могут объяснить зачем скажем нужен солид своими словами, а не цитатами из книжки)
Если человек в чём-то разбирается, он всегда это может объяснить это на пальцах. Мне когда-то понравилось в этом плане объяснение старого (уже почти мемного) вопроса с собеседований «Чем интерфейс отличается от абстрактного класса?» Правильный ответ по сути звучит, что интерфейс объединяет поведение и стандартизует апи обращения, а абстрактный класс — это обобщение свойств объектов. Но без примера для меня это когда-то звучало, как просто набор букв. Но в одной статье на хабре был дан просто шикарный пример. У кота, собаки и мыши — есть лапы (свойство объекта), а у ключа, ключ-карты и лома — возможность открывать двери (поведение) :)
Сложная терминология чаще всего просто сокращает объяснение до пары фраз. Как и паттерны. Сделай тут команду, а это сделай декоратором, а тут лучше фабрика подойдёт — упрощает коммуникацию. Но когда вы пытаетесь что-то объяснить, а не поставить задачу другому эксперту, говорить нужно человеческим языком :) Многие из новичков ещё и стесняются говорить, что то что вы им сказали — это белеберда на эльфийском :)
Как легко отличить настоящего профессионала? Он не пытается запутать вас терминами и может объяснить что угодно на пальцах. Я очень не люблю, когда фразы типа иммутабельности, консистентности и т.п. используют что-то объясняя не профессионалам. Я часто сталкивался одно время с тем, что люди не могут объяснить зачем скажем нужен солид своими словами, а не цитатами из книжки)
Если человек в чём-то разбирается, он всегда это может объяснить это на пальцах. Мне когда-то понравилось в этом плане объяснение старого (уже почти мемного) вопроса с собеседований «Чем интерфейс отличается от абстрактного класса?» Правильный ответ по сути звучит, что интерфейс объединяет поведение и стандартизует апи обращения, а абстрактный класс — это обобщение свойств объектов. Но без примера для меня это когда-то звучало, как просто набор букв. Но в одной статье на хабре был дан просто шикарный пример. У кота, собаки и мыши — есть лапы (свойство объекта), а у ключа, ключ-карты и лома — возможность открывать двери (поведение) :)
Сложная терминология чаще всего просто сокращает объяснение до пары фраз. Как и паттерны. Сделай тут команду, а это сделай декоратором, а тут лучше фабрика подойдёт — упрощает коммуникацию. Но когда вы пытаетесь что-то объяснить, а не поставить задачу другому эксперту, говорить нужно человеческим языком :) Многие из новичков ещё и стесняются говорить, что то что вы им сказали — это белеберда на эльфийском :)
Forwarded from Unity Новости
YouTube
Unity: Motion Vector Simulation Shader for Fire/Smoke. (+Blender for textures)
Hello and all that,
Do you like flipbook animations but wish you could make them smoother without rendering a bajillion frames? When then you my friend are in luck, cause that's what this video is all about.
Tutorial uses Amplify Shader Editor but Shadergraph…
Do you like flipbook animations but wish you could make them smoother without rendering a bajillion frames? When then you my friend are in luck, cause that's what this video is all about.
Tutorial uses Amplify Shader Editor but Shadergraph…
👍1
Григорий Дядиченко
Кстати, хотел узнать. Интересны ли были бы кому-нибудь такие темы? И какие наиболее интересны
Паттерн Команда
Чтож, в опросе победили паттерны, давайте посмотрим на один из моих любимых паттернов — команда. Это прикольный поведенческий паттерн, его красивое определение с диаграммой можно почитать тут https://metanit.com/sharp/patterns/3.3.php я же хочу показать пример на Unity и сказать зачем он может быть нужен. Для выразительности пример будет упрощённый, так как архитектурно в целом я бы делал бы немного иначе)
Но сначала предыстория) 3 года назад я работал в одной компании, и мы много времени 3д моделеров тратили на тупую задачу — сделать коробку с окнами. Пробилдера тогда не было, да и в целом хотелось чего-то поудобнее. И тогда я придумал https://github.com/Nox7atra/Apartment_Builder Но так как я не был таким опытным, я не додумался до одной вещи) Собственно до того, что в ядро любого разрабатываемого редактора нужно класть паттерн команда, чтобы поддержать всего лишь один функционал) ctrl+Z :) Если ядро сделано с ним, то это делается тривиально)
Если коротко паттерн команда приколен многими вещами) В зависимости от глубины реализации он позволяет вам делать какие-то действия отложенно, откатывать их, хранить историю действий и т.п. Это очень удобно для всякого рода редакторов, пошаговых игр (можно легко делать проигрыватель геймплея, хранить реплеи если делать так) И т.п. Я люблю его использовать для читов, консольных команд и многого другого. Плюс его удобно логировать и в целом выводить историю. Чтож. Простой пример, как и обещал) Я решил на тему паттерновых историй завести целый репозиторий (потом напишу к нему ридми) https://github.com/Nox7atra/PatternsUnityPlayground
Разберём на простом примере — крестики-нолики. В целом мой любимый пример для обучения новичков чему-либо) Итак, сама по себе команда — это по сути объект умеющий делать две работы. Выполнять работу и откатывать работу, поэтому у нас для неё есть интерфейс ICommand с методами Execute и Undo (всё можно найти в репе). Как и в редакторе действия у нас строго последовательны. И их надо как-то хранить и выполнять. Как и для редакторов я люблю конструкцию со стеком StackCommandInvoker. По сути мы пишем все команды в стек, чтобы потом иметь возможность откатить их строго в той последовательности, в которой мы их выполняли. Чтож осталась игра)
В крестиках-ноликах очевидно, что командой у нас является ход пользователя. Ресивер для упрощения — сама игра. Поэтому остаток реализации можно посмотреть в репозитории выше именно в виде кода в классах CrossGame и PlayerTurnCommand. Ну я тут немного поговорю про идеологию. Вот мы всё это сделали, и теперь что нам это даёт? По сути так как команды отлично в этом паттерне сериализуются, то можно сделать откат на любое число шагов, реплей игры и т.п. Сохранить партию и т.п. И это позволяет просто правильно и вовремя заложенный паттерн команда) Очень рекомендую :)
P.S. Возможно более подробный разбор стоит составить в статью на хабре. С кодом и построчно) Но это так сказать пробный пост из первых рук. Предлагаю устроить простое голосование, кому интересна эта тема. 👍 — значит такой формат "по горячим следам из первых рук" вести тут, 🔥 — значит лучше разбирать подробнее и на хабре :) Со статьями на хабре есть одна проблема, на них прям нужно находить время, так как там требуется соблюдать более строгий формат и больше нюансов по оформлению, так что там я по своей загрузке смогу писать, но только пореже)
Плюсы паттерна команда:
1. Просто делать ctrl+Z если надо
2. Просто делать реплеи
3. Просто делать отложенные действия и непрямой геймплей
4. Просто сериализовать все действия в файлы, чтобы потом это дело вынести на сервер или в сейв
Чтож, в опросе победили паттерны, давайте посмотрим на один из моих любимых паттернов — команда. Это прикольный поведенческий паттерн, его красивое определение с диаграммой можно почитать тут https://metanit.com/sharp/patterns/3.3.php я же хочу показать пример на Unity и сказать зачем он может быть нужен. Для выразительности пример будет упрощённый, так как архитектурно в целом я бы делал бы немного иначе)
Но сначала предыстория) 3 года назад я работал в одной компании, и мы много времени 3д моделеров тратили на тупую задачу — сделать коробку с окнами. Пробилдера тогда не было, да и в целом хотелось чего-то поудобнее. И тогда я придумал https://github.com/Nox7atra/Apartment_Builder Но так как я не был таким опытным, я не додумался до одной вещи) Собственно до того, что в ядро любого разрабатываемого редактора нужно класть паттерн команда, чтобы поддержать всего лишь один функционал) ctrl+Z :) Если ядро сделано с ним, то это делается тривиально)
Если коротко паттерн команда приколен многими вещами) В зависимости от глубины реализации он позволяет вам делать какие-то действия отложенно, откатывать их, хранить историю действий и т.п. Это очень удобно для всякого рода редакторов, пошаговых игр (можно легко делать проигрыватель геймплея, хранить реплеи если делать так) И т.п. Я люблю его использовать для читов, консольных команд и многого другого. Плюс его удобно логировать и в целом выводить историю. Чтож. Простой пример, как и обещал) Я решил на тему паттерновых историй завести целый репозиторий (потом напишу к нему ридми) https://github.com/Nox7atra/PatternsUnityPlayground
Разберём на простом примере — крестики-нолики. В целом мой любимый пример для обучения новичков чему-либо) Итак, сама по себе команда — это по сути объект умеющий делать две работы. Выполнять работу и откатывать работу, поэтому у нас для неё есть интерфейс ICommand с методами Execute и Undo (всё можно найти в репе). Как и в редакторе действия у нас строго последовательны. И их надо как-то хранить и выполнять. Как и для редакторов я люблю конструкцию со стеком StackCommandInvoker. По сути мы пишем все команды в стек, чтобы потом иметь возможность откатить их строго в той последовательности, в которой мы их выполняли. Чтож осталась игра)
В крестиках-ноликах очевидно, что командой у нас является ход пользователя. Ресивер для упрощения — сама игра. Поэтому остаток реализации можно посмотреть в репозитории выше именно в виде кода в классах CrossGame и PlayerTurnCommand. Ну я тут немного поговорю про идеологию. Вот мы всё это сделали, и теперь что нам это даёт? По сути так как команды отлично в этом паттерне сериализуются, то можно сделать откат на любое число шагов, реплей игры и т.п. Сохранить партию и т.п. И это позволяет просто правильно и вовремя заложенный паттерн команда) Очень рекомендую :)
P.S. Возможно более подробный разбор стоит составить в статью на хабре. С кодом и построчно) Но это так сказать пробный пост из первых рук. Предлагаю устроить простое голосование, кому интересна эта тема. 👍 — значит такой формат "по горячим следам из первых рук" вести тут, 🔥 — значит лучше разбирать подробнее и на хабре :) Со статьями на хабре есть одна проблема, на них прям нужно находить время, так как там требуется соблюдать более строгий формат и больше нюансов по оформлению, так что там я по своей загрузке смогу писать, но только пореже)
Плюсы паттерна команда:
1. Просто делать ctrl+Z если надо
2. Просто делать реплеи
3. Просто делать отложенные действия и непрямой геймплей
4. Просто сериализовать все действия в файлы, чтобы потом это дело вынести на сервер или в сейв
👍12🔥3
Как стоит относиться к архитектуре, паттернам и т.п.
Раз у нас тут вечер архитектуры, то ещё надо сказать моё к ней отношение. Стоит запомнить, что программирование — не является точной наукой. Все холивары выглядят довольно забавно, когда немного меняешь взгляд на разработку в целом. Разработка процесс творческий. Паттерны, SOLID и прочие прелести разработки были придуманы не для того, чтобы спорить о том "а что лучше". А для того, чтобы ими пользоваться. Паттерн — это базовый шаблон. Его не то чтобы можно реализовать неправильно, если просто соблюсти базовый концепт и то зачем он нужен. У вас может быть своё расширение над паттерном. SOLID — это не строгая инструкция "как правильно и хорошо программировать", а просто набор рекомендаций. Который строго говоря не всегда применим. Так же, как и ООП, ФП. Дактайпинг или статическая типизация и т.п. Иногда кажется, что программисты дольше спорят вместо того, чтобы просто пользоваться и творчески подходить к задачам с инструментами, которые им когда-то оформили и дали в руки)
Я в целом думаю, что частичная проблема этого, что многие программисты в прошлом технари. А технари чаще сталкиваются с точными науками. В математике каждая запятая в формулировке важна, строго значит одно и математики дико педантичны в том, чтобы поправить. Потому что чаще всего неправильная формулировка означает непонимание вопроса. Но в программировании — это вообще не так работает, так как программирование не точная наука. Я видел и огромные системы на синглтонах (которые хорошо работали и нормально поддерживались) и много чего ещё. А видел и откровенное мракобесие "с архитектурой". Где фабрика едет через фабрику, фабричным методом погоняя. И всё супер абстрактно, и я то могу вытерпеть распутывание этого клубка "супер абстракций" с бутылкой джина :) Иначе сразу лучше в дурку)
Старый принцип KISS на первом уровне проще всего соблюдать так. Не придумывайте сложных абстракций. Человеческий язык не совершенен и не всегда получается правильно другому человеку донести свои мысли обычными словами. Но когда в программу закладывается может быть очень крутая идея, но она — сложная. Высок риск, что другой человек её просто не поймёт. Почти всегда не нужно руководствоваться абстракциями программирования, паттернами и т.п. и не городить красивую "всё умеющую башню абстракций". А нужно руководствоваться обычной и такой простой человеческой логикой) Она остальным программистам будет более понятна) Конечно так же без крайностей. Интерфейсы, события, какой-то уровень абстрагирования нужен. Но я слишком часто сталкивался с просто переусложнённым кодом вообще непонятно зачем)
Раз у нас тут вечер архитектуры, то ещё надо сказать моё к ней отношение. Стоит запомнить, что программирование — не является точной наукой. Все холивары выглядят довольно забавно, когда немного меняешь взгляд на разработку в целом. Разработка процесс творческий. Паттерны, SOLID и прочие прелести разработки были придуманы не для того, чтобы спорить о том "а что лучше". А для того, чтобы ими пользоваться. Паттерн — это базовый шаблон. Его не то чтобы можно реализовать неправильно, если просто соблюсти базовый концепт и то зачем он нужен. У вас может быть своё расширение над паттерном. SOLID — это не строгая инструкция "как правильно и хорошо программировать", а просто набор рекомендаций. Который строго говоря не всегда применим. Так же, как и ООП, ФП. Дактайпинг или статическая типизация и т.п. Иногда кажется, что программисты дольше спорят вместо того, чтобы просто пользоваться и творчески подходить к задачам с инструментами, которые им когда-то оформили и дали в руки)
Я в целом думаю, что частичная проблема этого, что многие программисты в прошлом технари. А технари чаще сталкиваются с точными науками. В математике каждая запятая в формулировке важна, строго значит одно и математики дико педантичны в том, чтобы поправить. Потому что чаще всего неправильная формулировка означает непонимание вопроса. Но в программировании — это вообще не так работает, так как программирование не точная наука. Я видел и огромные системы на синглтонах (которые хорошо работали и нормально поддерживались) и много чего ещё. А видел и откровенное мракобесие "с архитектурой". Где фабрика едет через фабрику, фабричным методом погоняя. И всё супер абстрактно, и я то могу вытерпеть распутывание этого клубка "супер абстракций" с бутылкой джина :) Иначе сразу лучше в дурку)
Старый принцип KISS на первом уровне проще всего соблюдать так. Не придумывайте сложных абстракций. Человеческий язык не совершенен и не всегда получается правильно другому человеку донести свои мысли обычными словами. Но когда в программу закладывается может быть очень крутая идея, но она — сложная. Высок риск, что другой человек её просто не поймёт. Почти всегда не нужно руководствоваться абстракциями программирования, паттернами и т.п. и не городить красивую "всё умеющую башню абстракций". А нужно руководствоваться обычной и такой простой человеческой логикой) Она остальным программистам будет более понятна) Конечно так же без крайностей. Интерфейсы, события, какой-то уровень абстрагирования нужен. Но я слишком часто сталкивался с просто переусложнённым кодом вообще непонятно зачем)
👍7🤔1
Одна из моих любимых фич за последние годы в Unity — это VFX Graph) С ней можно делать откровенную магию. Конечно, как и любой VFX она требует некоторой насмотренности. К VFX можно подходить по разному. Для придумывания каких-то новых эффектов нужно экспериментировать и иметь некоторое художественное понимание. С другой стороны для повтора чего-то существующего достаточно просто пытаться технически разбирать "из чего состоит тот или иной эффект или явление". Но для начала я в любом случае советую изучить инструментарий и пройти как можно больше туториалов) Это всегда отличный источник идей и "набивки руки" :) Вчера я наткнулся на неплохой туториал по созданию портала через VFX граф :) https://www.youtube.com/watch?v=V2NZb0WN7SY
YouTube
Unity VFX Graph - Portal Effect Tutorial
Let's see how to create a pretty cool Portal effect with VFX Graph and Shader Graph as well. We also see how to use Shader Graph directly with VFX Graph, which is super powerful :)
Portal Shader Graph: https://www.youtube.com/watch?v=w0znZIuvQ2I&list=PL…
Portal Shader Graph: https://www.youtube.com/watch?v=w0znZIuvQ2I&list=PL…
Шейдер граф
Я очень любил писать шейдеры кодом. На мой взгляд это было быстрее) Ну и с реймаршингом и т.п., это правда так (ставь 🔥 если стоит написать про реймаршинг — не байт ни разу) Но сейчас я прихожу к тому, что графами в разы проще делать сложные эффекты. Когда тебе не приходится в 100 раз искать по куче проектов тот же дисторшн. Или же просто нужно "покрутить" и "по переставлять". Добавить френеля, убрать френеля, пошумить и т.п. Но возможно я так сильно не любил это всё дело, так как просто не знал про этот мануал и эту часть пакета шейдер графа https://docs.unity3d.com/Packages/com.unity.shadergraph@6.7/manual/Custom-Function-Node.html
Создавая свои кастомные ноды можно делать много прикольных авторских шейдеров. При этом воспринимать это всё дело часто в разы проще, чем векторный код + интересные шейдеры можно выложить скриншотом. Хотя конечно вот тут — код копипастить удобнее :)
Я очень любил писать шейдеры кодом. На мой взгляд это было быстрее) Ну и с реймаршингом и т.п., это правда так (ставь 🔥 если стоит написать про реймаршинг — не байт ни разу) Но сейчас я прихожу к тому, что графами в разы проще делать сложные эффекты. Когда тебе не приходится в 100 раз искать по куче проектов тот же дисторшн. Или же просто нужно "покрутить" и "по переставлять". Добавить френеля, убрать френеля, пошумить и т.п. Но возможно я так сильно не любил это всё дело, так как просто не знал про этот мануал и эту часть пакета шейдер графа https://docs.unity3d.com/Packages/com.unity.shadergraph@6.7/manual/Custom-Function-Node.html
Создавая свои кастомные ноды можно делать много прикольных авторских шейдеров. При этом воспринимать это всё дело часто в разы проще, чем векторный код + интересные шейдеры можно выложить скриншотом. Хотя конечно вот тут — код копипастить удобнее :)
🔥11
Работа с функциями в шейдерах
Я часто говорю, что программирование — это не математика. И это на самом деле так. Кроме шейдеров. Шейдеры — это математика. Дисторшн и т.п. сейчас художники используют во всю. Но первоначально это математика. У меня есть старая серия статей про математику) И в одной статье из серии я разбираю полностью уравнение плоской волны https://habr.com/ru/post/435828/ И в целом существует много прикольной математики) Из старых мат моделей, что я находил на просторах интернета я помню https://andrewhungblog.wordpress.com/2018/04/29/page-curl-shader-breakdown/ Идея её проста, по сути "накручивание меша на цилиндр" :)
Но чем интересна статья про волны, она отлично иллюстрирует, зачем часто бывает полезна удобная визуализация. И если в самой статье я рекомендовал вольфрам, то позже я нашёл инструмент в разы удобнее) https://www.desmos.com/calculator?lang=ru Да, конечно диффур там не посчитаешь и т.п. Но для того, чтобы подобрать правильный параметр для синуса или какую-то кусочную функцию — подходит отлично. И в разы проще разобраться, чем в том же вольфраме :)
Я часто говорю, что программирование — это не математика. И это на самом деле так. Кроме шейдеров. Шейдеры — это математика. Дисторшн и т.п. сейчас художники используют во всю. Но первоначально это математика. У меня есть старая серия статей про математику) И в одной статье из серии я разбираю полностью уравнение плоской волны https://habr.com/ru/post/435828/ И в целом существует много прикольной математики) Из старых мат моделей, что я находил на просторах интернета я помню https://andrewhungblog.wordpress.com/2018/04/29/page-curl-shader-breakdown/ Идея её проста, по сути "накручивание меша на цилиндр" :)
Но чем интересна статья про волны, она отлично иллюстрирует, зачем часто бывает полезна удобная визуализация. И если в самой статье я рекомендовал вольфрам, то позже я нашёл инструмент в разы удобнее) https://www.desmos.com/calculator?lang=ru Да, конечно диффур там не посчитаешь и т.п. Но для того, чтобы подобрать правильный параметр для синуса или какую-то кусочную функцию — подходит отлично. И в разы проще разобраться, чем в том же вольфраме :)
Хабр
Математика в Gamedev по-простому. Кривые и рябь для эффекта дождя в Unity
Всем привет! Меня зовут Гриша, и я основатель CGDevs. Продолжим говорить про математику что ли. Пожалуй, основное применение математики в геймдеве и компьютерной графики в целом – это VFX. Вот и...
Очень жаль, что Brackeys год назад перестали вести свой канал. Конечно не скажу, что я согласен со всеми их туториалами (портал между локациями я бы делал через стенсил, а не через две камеры, как пример) Но всё равно там много крутого контента. И советую с ним ознакомиться, если вдруг не знали :) Ну и этот туториал диззолва тоже неплох https://www.youtube.com/watch?v=taMp1g1pBeE :)
YouTube
DISSOLVE using Unity Shader Graph
Let’s learn how to create one of my favourite effects: Dissolve!
Check out Skillshare: http://skl.sh/brackeys6
● Download the project: https://github.com/Brackeys/Shader-Graph-Tutorials
❤️ Donate: https://www.paypal.com/donate/?hosted_button_id=VCMM2PLRRX8GU…
Check out Skillshare: http://skl.sh/brackeys6
● Download the project: https://github.com/Brackeys/Shader-Graph-Tutorials
❤️ Donate: https://www.paypal.com/donate/?hosted_button_id=VCMM2PLRRX8GU…
🔥6
Паттерн Декоратор
Думаю это самый популярный шаблон проектирования. Многие языки целиком пронизаны им. JS в особенности, где по сути "всё декоратор". Определение и пример формальные почитать можно тут https://metanit.com/sharp/patterns/4.1.php, хотя я не согласен с определением Component. Так как по тексту статьи Component должен быть интерфейсом, а не абстрактным классом. Но мы же говорим про Unity. В юнити декоратором по сути является любой MonoBehavior, так как он расширяет функции объекта, и в любой момент эти функции можно снять или отключить :) Но это даже не самое главное. Тоже самое условно можно сделать через наследование) Декоратор как раз таки прикол в том, что по своей структуре позволяет избежать сложной иерархии наследования)
Например вы хотите, чтобы у вас в игре был меч. И чтобы он бил "огнём", "ядом" и "льдом". Как это можно сделать?
Ну самый упоротый путь сделать класс Sword, и от него отнаследовать ToxicSword, FireSword и FrostSword. Это позволяет сохранить разное поведение, но усложняет реализацию комбинированного урона
Можно сделать "маску урона". По сути завести enum DamageType и хранить в мече либо битмаской, либо словарём (если значения урона разные). Поведение будет определять класс меч, а урон резолвить переданный в него словарь. Это лучше, но тоже не так удобно
А можно сделать компоненты, которые определяют тип урона FrostDamageModificator, ToxicDamageModificator и FireDamageModificator. Которые добавляют классу меча функциональность урона. Так же какой-нить AOEAttackTypeModificator и т.п. для того, чтобы определить как меч бьёт. И потом собрав все эти компоненты по конфигу айтема меч получит все нужные ему свойства. А класс Sword будет просто скелетом определяющим, как это всё между собой дружить :)
И это один пример. Я допустим очень сильно люблю декорировать всякое в маркерном AR всякие эффекты. Конечно с мечом пример долго реализуем, поэтому в репозитории я привёл более простой пример с декорированием инпута. Его в целом можно сделать и без общего класса скелета, он сделан скорее для наглядности :) https://github.com/Nox7atra/PatternsUnityPlayground
Да, хитрая иллюзия того, что в юнити скелет не знает про свой декоратор. Но важно понимать, что в юнити скелетом является трансформ, который через дженерик метод добавляет на себя компоненты наследники MonoBehavior. Так что это нормально, чтобы класс "скелет" знал про декораторы и наоборот. Хотя там зависимости опять таки можно развозить кучей способов. Основное это всегда функциональная суть паттерна)
Суть паттерна Декоратор:
1. Расширение функционала без наследования
2. Возможность натянуть на скелет (основное что непонятно новичкам в этом паттерне — это его блок схемы. Даже в примере по ссылке выше — это лишь один из примеров реализации такого скелета)
Основные плюсы:
1. Легко включать выключать различные функции и придавать свойства объекту
2. Легко комбинировать между собой свойства, при этом зная другие паттерны делать это так, чтобы декораторы друг о друге ничего не знали (что вернее)
Прошлые разборы:
1. Команда — https://news.1rj.ru/str/dyadichenkoga/76
P.S. Когда соберу большую часть паттернов, надо будет закрепить наверное на канале в какую-нить общую статью :)
Думаю это самый популярный шаблон проектирования. Многие языки целиком пронизаны им. JS в особенности, где по сути "всё декоратор". Определение и пример формальные почитать можно тут https://metanit.com/sharp/patterns/4.1.php, хотя я не согласен с определением Component. Так как по тексту статьи Component должен быть интерфейсом, а не абстрактным классом. Но мы же говорим про Unity. В юнити декоратором по сути является любой MonoBehavior, так как он расширяет функции объекта, и в любой момент эти функции можно снять или отключить :) Но это даже не самое главное. Тоже самое условно можно сделать через наследование) Декоратор как раз таки прикол в том, что по своей структуре позволяет избежать сложной иерархии наследования)
Например вы хотите, чтобы у вас в игре был меч. И чтобы он бил "огнём", "ядом" и "льдом". Как это можно сделать?
Ну самый упоротый путь сделать класс Sword, и от него отнаследовать ToxicSword, FireSword и FrostSword. Это позволяет сохранить разное поведение, но усложняет реализацию комбинированного урона
Можно сделать "маску урона". По сути завести enum DamageType и хранить в мече либо битмаской, либо словарём (если значения урона разные). Поведение будет определять класс меч, а урон резолвить переданный в него словарь. Это лучше, но тоже не так удобно
А можно сделать компоненты, которые определяют тип урона FrostDamageModificator, ToxicDamageModificator и FireDamageModificator. Которые добавляют классу меча функциональность урона. Так же какой-нить AOEAttackTypeModificator и т.п. для того, чтобы определить как меч бьёт. И потом собрав все эти компоненты по конфигу айтема меч получит все нужные ему свойства. А класс Sword будет просто скелетом определяющим, как это всё между собой дружить :)
И это один пример. Я допустим очень сильно люблю декорировать всякое в маркерном AR всякие эффекты. Конечно с мечом пример долго реализуем, поэтому в репозитории я привёл более простой пример с декорированием инпута. Его в целом можно сделать и без общего класса скелета, он сделан скорее для наглядности :) https://github.com/Nox7atra/PatternsUnityPlayground
Да, хитрая иллюзия того, что в юнити скелет не знает про свой декоратор. Но важно понимать, что в юнити скелетом является трансформ, который через дженерик метод добавляет на себя компоненты наследники MonoBehavior. Так что это нормально, чтобы класс "скелет" знал про декораторы и наоборот. Хотя там зависимости опять таки можно развозить кучей способов. Основное это всегда функциональная суть паттерна)
Суть паттерна Декоратор:
1. Расширение функционала без наследования
2. Возможность натянуть на скелет (основное что непонятно новичкам в этом паттерне — это его блок схемы. Даже в примере по ссылке выше — это лишь один из примеров реализации такого скелета)
Основные плюсы:
1. Легко включать выключать различные функции и придавать свойства объекту
2. Легко комбинировать между собой свойства, при этом зная другие паттерны делать это так, чтобы декораторы друг о друге ничего не знали (что вернее)
Прошлые разборы:
1. Команда — https://news.1rj.ru/str/dyadichenkoga/76
P.S. Когда соберу большую часть паттернов, надо будет закрепить наверное на канале в какую-нить общую статью :)
👍5❤1🤯1
Player Prefs
В целом префсы великий механизм для кроссплатформенной разработки. Когда ваши сейвы и т.п. не весят несколько мегабайт, то это всё что вам надо. Даже при синхронизации сейвов с сервером — это отличная штука для оффлайн доступа :) Я довольно часто сейвы и конфигурации храню в виде json строки в префсах. Основной плюс этого кроссплатформенность. Да почти на всех платформах всё решается Application.persistentDataPath, но скажем не на том же webgl)
И кстати для неё есть достаточно прикольный репозиторий с инструментами, чтобы в редакторе было немного удобнее всё это дело тестить https://github.com/sabresaurus/PlayerPrefsEditor
В целом префсы великий механизм для кроссплатформенной разработки. Когда ваши сейвы и т.п. не весят несколько мегабайт, то это всё что вам надо. Даже при синхронизации сейвов с сервером — это отличная штука для оффлайн доступа :) Я довольно часто сейвы и конфигурации храню в виде json строки в префсах. Основной плюс этого кроссплатформенность. Да почти на всех платформах всё решается Application.persistentDataPath, но скажем не на том же webgl)
И кстати для неё есть достаточно прикольный репозиторий с инструментами, чтобы в редакторе было немного удобнее всё это дело тестить https://github.com/sabresaurus/PlayerPrefsEditor
GitHub
GitHub - sabresaurus/PlayerPrefsEditor: PlayerPrefs Editor & Utilities provide an easy way to see what PlayerPrefs your game is…
PlayerPrefs Editor & Utilities provide an easy way to see what PlayerPrefs your game is using and change them at run-time. - sabresaurus/PlayerPrefsEditor
Epic Games анонсировали Reality Scan https://www.capturingreality.com/introducing-realityscan
Места в бете уже закончились и будем посмотреть, как оно будет работать. Больше инструментов всегда круто!) И если будет работать качественно — шикарно :) Но тут стоит сказать, что они не единственные и не первые. Хотя я не видел, чтобы кто-то бесплатно давал своё облако для расчёта фотограмметрии. А что ещё существует?
Ну например https://www.trnio.com/ тоже досатточно прикольное комплексное решение по сканированию пространства) Есть Agisoft Metashape (https://www.agisoft.com/) — правда для мобильного телефона, там нужно написать свой клиент. Но ничего не мешает на сервере поднять свою ноду для фотограметрии. И совсем для разработчиков https://github.com/alicevision/meshroom которое прям заточено под разворачивание серверов
Это было если мы говорим про качественный скан. Если брать простенький скан, то на IOS много сканеров умеющих собирать модель чуть ли не в реалтайме на устройстве :) Но качество там конечно так себе
Единственное, чем это действительно может быть супер круто — это интеграцией с выкладкой в маркетплейс. Поставил аппу на телефон, отсканировал какую-нить красивую 3дшку, прошёл базовую премодерацию, поставил цену-описание, и вот у тебя ассет в маркетплейсе. Хотел бы я подобную тулзу для ассет стора, думаю тогда там можно было бы найти много интересных сканов)
Когда я лазал по горам в Дагестане, я уже думал, что было бы прикольно иметь тулзу, которая куда-нить в облако шлёт подобные симлес текстуры (см. картинку ниже). И может стоит заморочиться и сделать такой опенсорс инструмент) Путешествуешь, гуляешь, чёт красивое сфоткал/отсканил, кто-то потом использует в своей игре или ролике — кайф же :)
Места в бете уже закончились и будем посмотреть, как оно будет работать. Больше инструментов всегда круто!) И если будет работать качественно — шикарно :) Но тут стоит сказать, что они не единственные и не первые. Хотя я не видел, чтобы кто-то бесплатно давал своё облако для расчёта фотограмметрии. А что ещё существует?
Ну например https://www.trnio.com/ тоже досатточно прикольное комплексное решение по сканированию пространства) Есть Agisoft Metashape (https://www.agisoft.com/) — правда для мобильного телефона, там нужно написать свой клиент. Но ничего не мешает на сервере поднять свою ноду для фотограметрии. И совсем для разработчиков https://github.com/alicevision/meshroom которое прям заточено под разворачивание серверов
Это было если мы говорим про качественный скан. Если брать простенький скан, то на IOS много сканеров умеющих собирать модель чуть ли не в реалтайме на устройстве :) Но качество там конечно так себе
Единственное, чем это действительно может быть супер круто — это интеграцией с выкладкой в маркетплейс. Поставил аппу на телефон, отсканировал какую-нить красивую 3дшку, прошёл базовую премодерацию, поставил цену-описание, и вот у тебя ассет в маркетплейсе. Хотел бы я подобную тулзу для ассет стора, думаю тогда там можно было бы найти много интересных сканов)
Когда я лазал по горам в Дагестане, я уже думал, что было бы прикольно иметь тулзу, которая куда-нить в облако шлёт подобные симлес текстуры (см. картинку ниже). И может стоит заморочиться и сделать такой опенсорс инструмент) Путешествуешь, гуляешь, чёт красивое сфоткал/отсканил, кто-то потом использует в своей игре или ролике — кайф же :)
Какой красивый шейдер на параллакс маппинге 🤩
https://mobile.twitter.com/tomdns_/status/1044637213533892608
https://mobile.twitter.com/tomdns_/status/1044637213533892608
Twitter
Thomas Denis
Parallax mapping experiments #2 #shaders #madewithunity #gamedev
❤10
Пиксельарт
Многие любят фотореализм и графен, а мне как-то всегда больше нравилась стилизация. Ori, Hades, Crypt of the NecroDancer :) И бывают так же клёвые представители пиксель арта, тот же Narita Boy (очень стильная игра)
С пиксель артом есть одна проблема, хотя она и мелкая. Чтобы не было визуальных проблем нужно весьма специфично двигать камеру (собственно кратно пикселям) Удобно размер камеры делать таким и всю сетку координат, чтобы работать вообще с int значениями, а не с float. Тогда в целом ничего не будет мерцать :)
Ну и вот недавно вышел прикольный туториал на одном канале по VFX в стилистике пиксель арта :) https://youtu.be/JZDlCuIpq9I
Многие любят фотореализм и графен, а мне как-то всегда больше нравилась стилизация. Ori, Hades, Crypt of the NecroDancer :) И бывают так же клёвые представители пиксель арта, тот же Narita Boy (очень стильная игра)
С пиксель артом есть одна проблема, хотя она и мелкая. Чтобы не было визуальных проблем нужно весьма специфично двигать камеру (собственно кратно пикселям) Удобно размер камеры делать таким и всю сетку координат, чтобы работать вообще с int значениями, а не с float. Тогда в целом ничего не будет мерцать :)
Ну и вот недавно вышел прикольный туториал на одном канале по VFX в стилистике пиксель арта :) https://youtu.be/JZDlCuIpq9I
YouTube
Unity Shader Graph - Pixel Art VFX Tutorial
Now you can easily create some Pixel Art effects with this technique! Either by converting some effects you already have or by creating them from scratch! The cool thing is that you don't need to know how to draw pixel art, you can simply use this shader…
Как мерить фпс?
В целом для любой более-менее серьёзной разработки нужны дебаг инструменты, которые открываются в рантайме. В мелких проектах я просто делаю скрытую панель, которую крайне маловероятно что найдёт пользователь (например 15 кликов быстрых на определённый текст в интерфейсе). В крупных проектах они вообще не идут в сборку, так как там есть dev, stage, prod билды, настроенные для них окружения и т.п. Собственно ряд инструментов ездит почти в каждый проект) Один из таких это https://github.com/Tayx94/graphy
Абсолютно гениальная вещь для мониторинга перфоманса) Ребята сделали очень крутой плагин) Он показывает фреймрейт, память, громкость звука. А так же всю информацию о тестируемом устройстве — просто ляпота :)
В целом для любой более-менее серьёзной разработки нужны дебаг инструменты, которые открываются в рантайме. В мелких проектах я просто делаю скрытую панель, которую крайне маловероятно что найдёт пользователь (например 15 кликов быстрых на определённый текст в интерфейсе). В крупных проектах они вообще не идут в сборку, так как там есть dev, stage, prod билды, настроенные для них окружения и т.п. Собственно ряд инструментов ездит почти в каждый проект) Один из таких это https://github.com/Tayx94/graphy
Абсолютно гениальная вещь для мониторинга перфоманса) Ребята сделали очень крутой плагин) Он показывает фреймрейт, память, громкость звука. А так же всю информацию о тестируемом устройстве — просто ляпота :)
GitHub
GitHub - Tayx94/graphy: Graphy is the ultimate, easy to use, feature packed FPS counter, stats monitor and debugger for your Unity…
Graphy is the ultimate, easy to use, feature packed FPS counter, stats monitor and debugger for your Unity project. - Tayx94/graphy
Fluent Design
Надо немного поговорить на тему UX в AR. У майкрософта есть старая классная концепция дизайна — Fluent Design. https://www.youtube.com/watch?v=vcBGj4R7Fo0 И одна её идея отлично подходит под дополненную реальность. В ней очень круто смотрится акрил :) (В прошлом году я даже написал статью с разбором, как его получить https://habr.com/ru/post/565662/ и репозиторием https://github.com/Nox7atra/UMOM )
Но что такого классного в акриле в AR? Ну на самом деле несколько пунктов.
1. Как и любой "фотореализм" он не имеет стиля — то есть универсален
Плюс фотореалистичной графики относительно стилизации в целом в том, что нельзя сказать "о, этот реализм — это марвел, а этот dc". Их можно разделить по настроению, по посту, по цветовой палитре и т.п. Но по сути визуально реализм есть реализм
2. Он подстраивается под любой фон
В AR фоном у нас является видео-поток с камеры, поэтому сложно подобрать цвета, которые будут хорошо смотреться на любом фоне. Красное на красном будет сливаться и т.п. Поэтому интерфейс с фактурой отлично отделён от фона
3. Он не отвлекает от самого AR
Центральным объектом в AR вряд ли является интерфейс, поэтому конечно кнопки отделены от фона благодаря фактуре, но в какой-то момент их проще перестать замечать, так как так или иначе они цвета фона. Есть трюки, как на акриле балансировать контрастность, если это вдруг зачем-то надо. Но обычно, как раньше говорилось: "Лучший интерфейс, это отсутствие интерфейса". Так что акрил это компромисс, так как при правильном использовании ты как минимум перестаёшь замечать наличие худа, как такового. И кажется что места на экране больше для самого центрального объекта
В целом в Fluent Design концепции было много интересных идей, жаль она конечно не развита с точки зрения гайдлайнов так, как тот же Material Design :)
Надо немного поговорить на тему UX в AR. У майкрософта есть старая классная концепция дизайна — Fluent Design. https://www.youtube.com/watch?v=vcBGj4R7Fo0 И одна её идея отлично подходит под дополненную реальность. В ней очень круто смотрится акрил :) (В прошлом году я даже написал статью с разбором, как его получить https://habr.com/ru/post/565662/ и репозиторием https://github.com/Nox7atra/UMOM )
Но что такого классного в акриле в AR? Ну на самом деле несколько пунктов.
1. Как и любой "фотореализм" он не имеет стиля — то есть универсален
Плюс фотореалистичной графики относительно стилизации в целом в том, что нельзя сказать "о, этот реализм — это марвел, а этот dc". Их можно разделить по настроению, по посту, по цветовой палитре и т.п. Но по сути визуально реализм есть реализм
2. Он подстраивается под любой фон
В AR фоном у нас является видео-поток с камеры, поэтому сложно подобрать цвета, которые будут хорошо смотреться на любом фоне. Красное на красном будет сливаться и т.п. Поэтому интерфейс с фактурой отлично отделён от фона
3. Он не отвлекает от самого AR
Центральным объектом в AR вряд ли является интерфейс, поэтому конечно кнопки отделены от фона благодаря фактуре, но в какой-то момент их проще перестать замечать, так как так или иначе они цвета фона. Есть трюки, как на акриле балансировать контрастность, если это вдруг зачем-то надо. Но обычно, как раньше говорилось: "Лучший интерфейс, это отсутствие интерфейса". Так что акрил это компромисс, так как при правильном использовании ты как минимум перестаёшь замечать наличие худа, как такового. И кажется что места на экране больше для самого центрального объекта
В целом в Fluent Design концепции было много интересных идей, жаль она конечно не развита с точки зрения гайдлайнов так, как тот же Material Design :)
Триггерный ИИ
Игровой ИИ — это очень глубокая тема, в ней можно прям закопаться. Конечные автоматы, Behavior Tree и многое другое. Комбинированные методы. Но я хочу рассказать об упрощённой задаче, так сказать для затравочки, которую мы решали в этом проекте https://foxsys.pro/beringia-game Это стенд на выставку, так что тут нет требования, чтобы ИИ был прям умным)
В целом есть базовое правило, когда вы выставляете игру на выставке, каком-то шоукейсе или другом мероприятии в идеале у неё должно быть два состояния: в неё кто-то играет или она играет сама в себя. Причём решений второго масса, самый простой из которых, когда игры никто не касается больше 1-2 минут, она переносится на старт и запускает ролик с записью геймплея. У нас же игра позволяла простенький мультиплеер на стенде, поэтому идея была просто. Нужен ИИ который:
1. Будет играть сам с собой и игроками
2. У него можно перехватить управление. На случай если кто-то решил зайти в игру, когда другие игроки играют. Чтобы не ждать пока "ИИ" доиграет
3. Будет играть каждый раз не одинаково. Плюс с ИИ всегда есть проблема баланса, чтобы в простой игре он не всегда выигрывал и у него был рассчитан диапазон набираемых очков
В подобном раннере — это было сделано довольно просто. Карта у нас заготовленная, хотя на бесконечной делалось это бы точно так же. По трассе просто расставляются триггеры с весами. Где вес определяет с какой вероятностью ИИ пойдёт в сторону и в какую. Если вдруг у кого-то нет, вот сниппет самого простого алгоритма расчёта взвешенной вероятности https://pastebin.com/aMCZup9V Добавив условие, что триггеры игнорируются, если пользователь нажал кнопку управления в течении последних 15 секунд, мы получаем перехват управления. Как игроком, так и ИИ при 15 секундном бездействии заберёт на себя управление, если кому-то скажем нужно срочно отойти и с кем-то поговорить
Причём важно понимать, что триггеры в данном случае — это всего лишь удобный инструмент для левел дизайна. В сущности ровно тоже самое можно было бы параметрически представить в виде сценария, где запуск сценариев зависит от пройденного игроком расстояния, и в момент перехода границы делается взвешенный выбор. То есть скажем таким образом не на триггерах, а сделав сценарий в виде графа решений, можно сделать ИИ для любой пошаговой игры скажем. Но как я и говорил, сам по себе ИИ это очень глубокая тема, так что потом разберём и другие примеры :)
Игровой ИИ — это очень глубокая тема, в ней можно прям закопаться. Конечные автоматы, Behavior Tree и многое другое. Комбинированные методы. Но я хочу рассказать об упрощённой задаче, так сказать для затравочки, которую мы решали в этом проекте https://foxsys.pro/beringia-game Это стенд на выставку, так что тут нет требования, чтобы ИИ был прям умным)
В целом есть базовое правило, когда вы выставляете игру на выставке, каком-то шоукейсе или другом мероприятии в идеале у неё должно быть два состояния: в неё кто-то играет или она играет сама в себя. Причём решений второго масса, самый простой из которых, когда игры никто не касается больше 1-2 минут, она переносится на старт и запускает ролик с записью геймплея. У нас же игра позволяла простенький мультиплеер на стенде, поэтому идея была просто. Нужен ИИ который:
1. Будет играть сам с собой и игроками
2. У него можно перехватить управление. На случай если кто-то решил зайти в игру, когда другие игроки играют. Чтобы не ждать пока "ИИ" доиграет
3. Будет играть каждый раз не одинаково. Плюс с ИИ всегда есть проблема баланса, чтобы в простой игре он не всегда выигрывал и у него был рассчитан диапазон набираемых очков
В подобном раннере — это было сделано довольно просто. Карта у нас заготовленная, хотя на бесконечной делалось это бы точно так же. По трассе просто расставляются триггеры с весами. Где вес определяет с какой вероятностью ИИ пойдёт в сторону и в какую. Если вдруг у кого-то нет, вот сниппет самого простого алгоритма расчёта взвешенной вероятности https://pastebin.com/aMCZup9V Добавив условие, что триггеры игнорируются, если пользователь нажал кнопку управления в течении последних 15 секунд, мы получаем перехват управления. Как игроком, так и ИИ при 15 секундном бездействии заберёт на себя управление, если кому-то скажем нужно срочно отойти и с кем-то поговорить
Причём важно понимать, что триггеры в данном случае — это всего лишь удобный инструмент для левел дизайна. В сущности ровно тоже самое можно было бы параметрически представить в виде сценария, где запуск сценариев зависит от пройденного игроком расстояния, и в момент перехода границы делается взвешенный выбор. То есть скажем таким образом не на триггерах, а сделав сценарий в виде графа решений, можно сделать ИИ для любой пошаговой игры скажем. Но как я и говорил, сам по себе ИИ это очень глубокая тема, так что потом разберём и другие примеры :)
foxsys.pro
Игра-гонка "Моя стихия - Берингия"
Проект игры-гонки на стенд для Дней Дальнего Востока в Москве 2019
👍2
Хоть и старенький, но классный туториал по эффекту из Dragon Ball
https://youtu.be/TR1xM1HMNQ8
Он отлично демонстрирует, что VFX это такая кросс экспертиза, где нужно немного уметь в несколько дисциплин вроде 3д моделирования, написания шейдеров и т.п. :)
https://youtu.be/TR1xM1HMNQ8
Он отлично демонстрирует, что VFX это такая кросс экспертиза, где нужно немного уметь в несколько дисциплин вроде 3д моделирования, написания шейдеров и т.п. :)
YouTube
Гайд как создать эффект "Kamehameha" из аниме Dragon Ball в Unity
Создание эффекта с помощью системы частиц на игровом движке Unity. Game effect tutorial.
Если вы подписаны на мою страницу Patreon, то готовый эффект вы можете скачать здесь: https://www.patreon.com/posts/kamehameha-vfx-1-25583523
----------------------…
Если вы подписаны на мою страницу Patreon, то готовый эффект вы можете скачать здесь: https://www.patreon.com/posts/kamehameha-vfx-1-25583523
----------------------…
🔥4