А вот и три фотки ДО и три ПОСЛЕ к посту выше :)
Отдельно, потому что по количеству символов у постов с фото ограничение больше и всё не влезло.
Отдельно, потому что по количеству символов у постов с фото ограничение больше и всё не влезло.
🔥79👍31🤯7🤩4😱3
Только что пересел с Zenject (Extenject) на VContainer
Почему решил пересесть?
1. В использовании он, как по мне, проще (после Zenject'а тут всё интуитивно понятно, но лучше всегда внимательно читать документацию).
2. Весит меньше и не имеет настолько много лишнего (для большинства пользователей) функционала. В общем и целом, не перегружен.
3. По производительности он быстрее хотя бы потому, что здесь мы сами определяем какие GameObject'ы нам нужно заинжектить на старте, а не все сразу, что есть на сцене.
Ещё в документации есть очень полезная страница со сравнением VContainer и Zenject
Почему решил пересесть?
1. В использовании он, как по мне, проще (после Zenject'а тут всё интуитивно понятно, но лучше всегда внимательно читать документацию).
2. Весит меньше и не имеет настолько много лишнего (для большинства пользователей) функционала. В общем и целом, не перегружен.
3. По производительности он быстрее хотя бы потому, что здесь мы сами определяем какие GameObject'ы нам нужно заинжектить на старте, а не все сразу, что есть на сцене.
Ещё в документации есть очень полезная страница со сравнением VContainer и Zenject
👍47
У меня есть проект на GitHub под названием Finite State Machine.
Это обычная машина состояний, но на ней ещё можно очень удобно писать искусственный интеллект, ибо в ней можно биндить переходы из одного состояния в другое, а затем она опционально в Update (вызов контролируете как вам захочется) сама будет устанавливать нужное в зависимости от условий, которые вы зададите.
Например, у нас есть вражеский юнит, у которого есть два состояния: «Ожидание» и «Атака». Мы просто задаём переходы из «Ожидания» в «Атаку» и из «Атаки» в «Ожидание», а условием может быть, например, наличие или отсутствие цели соответственно.
Подробная документация есть на GitHub. Также по этой StateMachine я планирую записать видео.
Это обычная машина состояний, но на ней ещё можно очень удобно писать искусственный интеллект, ибо в ней можно биндить переходы из одного состояния в другое, а затем она опционально в Update (вызов контролируете как вам захочется) сама будет устанавливать нужное в зависимости от условий, которые вы зададите.
Например, у нас есть вражеский юнит, у которого есть два состояния: «Ожидание» и «Атака». Мы просто задаём переходы из «Ожидания» в «Атаку» и из «Атаки» в «Ожидание», а условием может быть, например, наличие или отсутствие цели соответственно.
Подробная документация есть на GitHub. Также по этой StateMachine я планирую записать видео.
GitHub
GitHub - MeeXaSiK/FiniteStateMachine: This is a lightweight Finite State Machine
This is a lightweight Finite State Machine. Contribute to MeeXaSiK/FiniteStateMachine development by creating an account on GitHub.
🔥32👍11❤1😁1
Офигеть, уже лето...
Получается, всем хорошо отдохнуть и хорошо поработать 🔥
🚄 А я готовлю очень полезное видео по всем основным типам атак в Unity: Raycast, Overlap и Projectile. Будет очень интересно)
Получается, всем хорошо отдохнуть и хорошо поработать 🔥
🚄 А я готовлю очень полезное видео по всем основным типам атак в Unity: Raycast, Overlap и Projectile. Будет очень интересно)
👍55🔥36
Пока видос озвучиваю, расскажу про интересный способ оптимизации. Принцип работы такой, что Update как бы "делится" на два (это не многопоток). Половина компонентов с Update вызывается в первом кадре, вторая половина в втором. В теории это увеличит FPS.
Обращаю ваше внимание, что при таком подходе нужно помнить про deltaTime. Ибо пройдёт два кадра, а deltaTime получим только за один. Но можно кэшировать время между кадрами в какие-нибудь deltaTimeA и deltaTimeB, а затем складывать и получать totalDeltaTime.
На практике пока не пробовал, поэтому не могу сказать, есть ли ещё какие-то подводные камни или баги, но способ достаточно интересный.
https://thegamedev.guru/unity-performance/cpu-slicing-secrets/
Обращаю ваше внимание, что при таком подходе нужно помнить про deltaTime. Ибо пройдёт два кадра, а deltaTime получим только за один. Но можно кэшировать время между кадрами в какие-нибудь deltaTimeA и deltaTimeB, а затем складывать и получать totalDeltaTime.
На практике пока не пробовал, поэтому не могу сказать, есть ли ещё какие-то подводные камни или баги, но способ достаточно интересный.
https://thegamedev.guru/unity-performance/cpu-slicing-secrets/
TheGameDev.Guru
Unity Performance: CPU Slicing Secrets | TheGamedev.Guru
When you don't have low-hanging fruits to optimize in Unity, you might need to resort to the CPU Slicing technique.
🤔13👍8🥰1
Нет, я не потерялся)
Несколько раз переписывал и переозвучивал части сюжета для нового видео про стрельбу, чтобы сделать его лучше. Будет много интересного 😉
Тем временем, это заявочка на очередной самый длинный ролик на канале. Похоже на то, что он будет минут на 40+, новый рекорд. Осталось смонтировать и выжить :D
Несколько раз переписывал и переозвучивал части сюжета для нового видео про стрельбу, чтобы сделать его лучше. Будет много интересного 😉
Тем временем, это заявочка на очередной самый длинный ролик на канале. Похоже на то, что он будет минут на 40+, новый рекорд. Осталось смонтировать и выжить :D
🔥68👍7
Сижу, ищу, читаю различные сайты с информацией о распространённых соглашениях по написанию кода C#.
Вообще, я искал чёткое описание того, в каком порядке лучше писать readonly, const и static поля - выше или ниже обычных полей. Пока не нашёл, но наткнулся на эту страницу, рекомендую заценить. Пару фишечек для себя подметил в тех моментах, которые я очень редко использую.
https://www.elma-bpm.ru/KB/article-6651.html
Вообще, я искал чёткое описание того, в каком порядке лучше писать readonly, const и static поля - выше или ниже обычных полей. Пока не нашёл, но наткнулся на эту страницу, рекомендую заценить. Пару фишечек для себя подметил в тех моментах, которые я очень редко использую.
https://www.elma-bpm.ru/KB/article-6651.html
👍21🔥7❤3
🚄 Айоу! Новое видео уже на канале 🔥
👀 Материалы из видео:
1. Скрипты
2. Библиотека OverlapSugar
3. Полезные атрибуты
👀 Само видео:
https://youtu.be/iLa1mF_PaEs
https://youtu.be/iLa1mF_PaEs
https://youtu.be/iLa1mF_PaEs
Надеюсь на вашу максимальную поддержку, очень много времени и сил потратил на этот ролик. Получился самый длинный на канале! Много чего переснимал, чтобы улучшить качество материала, а также много фишечек доснимал в процессе. Думаю, узнаете что-то новое 😉
👀 Материалы из видео:
1. Скрипты
2. Библиотека OverlapSugar
3. Полезные атрибуты
👀 Само видео:
https://youtu.be/iLa1mF_PaEs
https://youtu.be/iLa1mF_PaEs
https://youtu.be/iLa1mF_PaEs
Надеюсь на вашу максимальную поддержку, очень много времени и сил потратил на этот ролик. Получился самый длинный на канале! Много чего переснимал, чтобы улучшить качество материала, а также много фишечек доснимал в процессе. Думаю, узнаете что-то новое 😉
🔥75👍13❤6🤩2👏1
Больше 3К просмотров на новом видео за выходные, что вы за львы?! 😎
Планирую сделать ремейки нескольких своих старых видео по некоторым причинам, одна из которых - это новые знания и новый (трезвый) взгляд на старое.
А в данный момент я пилю обнову для NightPool. Как раз можно будет запилить видос про новую версию, ибо изменений много.
Кстати, если есть кто из ЕКб, друг анонсировал встречу разработчиков игр, может кому интересно будет.
Планирую сделать ремейки нескольких своих старых видео по некоторым причинам, одна из которых - это новые знания и новый (трезвый) взгляд на старое.
А в данный момент я пилю обнову для NightPool. Как раз можно будет запилить видос про новую версию, ибо изменений много.
Кстати, если есть кто из ЕКб, друг анонсировал встречу разработчиков игр, может кому интересно будет.
👍35🥰2👎1🤬1
Я всё ещё пилю крупную обнову для NightPool, мне пришлось также доработать свой NightList для того, чтобы избавиться от аллокаций или свести их к минимуму в работе пула, а ещё, чтобы в некоторых местах можно было передавать структуры по ссылке, а не каждый раз их копировать.
Так вот, чтобы можно было использовать лист вот таким образом:
Так вот, чтобы можно было использовать лист вот таким образом:
private NightList<T> _nightList = new();То есть, чтобы писать сразу
var firstElement = _nightList[0];
_nightList[i] вместо _nightList.Components[i], нужно написать следующее (обведено на скрине красным)👍28🔥6❤3👎1😱1
Внутри кода вы можете написать условную компиляцию
Но что делать, если вам нужно выполнять некоторый код не только в редакторе, но ещё и в Development билдах, а затем, после всех тестов на ошибки, убирать лишний код (например, некоторые проверки на
Для этого достаточно поменять препроцессорное выражение
#if UNITY_EDITORКод между директивами
...
#endif
#if и #endif будет выполняться только в Unity, но ни в одном из ваших билдов (даже в Development Build). Но что делать, если вам нужно выполнять некоторый код не только в редакторе, но ещё и в Development билдах, а затем, после всех тестов на ошибки, убирать лишний код (например, некоторые проверки на
null и прочее) на релизе?Для этого достаточно поменять препроцессорное выражение
UNITY_EDITOR на DEBUG👍33❤6🔥6👎1🤔1
Безархетипные ECS фреймворки
Соскучился я по ECS + очень хотел изучить Jobs и внедрить в свою игру. Сначала, недолго думая, внедрил LeoECS Lite для некоторых систем в игре. Меня всегда привлекали ECS от Leo своей простотой и максимальным абстрагированием от движка (до этого я работал только с LeoECS Classic). Lite версия оказалась ещё более производительной, но тоже не без проблем, об этом расскажу прямо сейчас.
После внедрения LeoECS Lite в проект, я начал подробнее изучать фреймворки и наткнулся на Morpeh, на который по итогу и перешёл. Проблема была в том, что, увеличивая количество фильтров, сущностей и компонентов, производительность в безархетипных ECS, таких как LeoECS (Classic и Lite), неявно ухудшалась. Это чревато тем, что время выполнения кода, написанного годом ранее, могло занимать 1 условную миллисекунду, а сейчас на него могут уходить уже и 3, и 5 мс, и все 10 мс. Время выполнения кода будет расти неявным образом по мере роста проекта, что звучит не очень то и приятно. Если я ничего не путаю, эту проблему можно решить (частично) разбиением окружения на несколько ECS World, но такой подход, вероятно, может загонять некоторых людей в какие-то рамки.
В Morpeh нет такой проблемы, поэтому мой текущий выбор и пал на этот фреймворк. Вроде бы эту проблему Leo уже решил в новом LeoECS Proto, но этот фреймворк пока что свежий и платный, опробую его в деле спустя некоторое время.
Если вы пишите большой проект целиком и полностью на ECS, где в мир отправляется куча событий и запросов, а сущности постоянно добавляются, удаляются и/или меняются, то лично я бы не смотрел в сторону безархетипных ECS, хоть и считаю LeoECS Lite одним из лучших и самых простых ECS фреймворков и по сей день.
А какой ECS фреймворк вы используете в своём проекте? Ответ "никакой" тоже подходит 😄.
Соскучился я по ECS + очень хотел изучить Jobs и внедрить в свою игру. Сначала, недолго думая, внедрил LeoECS Lite для некоторых систем в игре. Меня всегда привлекали ECS от Leo своей простотой и максимальным абстрагированием от движка (до этого я работал только с LeoECS Classic). Lite версия оказалась ещё более производительной, но тоже не без проблем, об этом расскажу прямо сейчас.
После внедрения LeoECS Lite в проект, я начал подробнее изучать фреймворки и наткнулся на Morpeh, на который по итогу и перешёл. Проблема была в том, что, увеличивая количество фильтров, сущностей и компонентов, производительность в безархетипных ECS, таких как LeoECS (Classic и Lite), неявно ухудшалась. Это чревато тем, что время выполнения кода, написанного годом ранее, могло занимать 1 условную миллисекунду, а сейчас на него могут уходить уже и 3, и 5 мс, и все 10 мс. Время выполнения кода будет расти неявным образом по мере роста проекта, что звучит не очень то и приятно. Если я ничего не путаю, эту проблему можно решить (частично) разбиением окружения на несколько ECS World, но такой подход, вероятно, может загонять некоторых людей в какие-то рамки.
В Morpeh нет такой проблемы, поэтому мой текущий выбор и пал на этот фреймворк. Вроде бы эту проблему Leo уже решил в новом LeoECS Proto, но этот фреймворк пока что свежий и платный, опробую его в деле спустя некоторое время.
Если вы пишите большой проект целиком и полностью на ECS, где в мир отправляется куча событий и запросов, а сущности постоянно добавляются, удаляются и/или меняются, то лично я бы не смотрел в сторону безархетипных ECS, хоть и считаю LeoECS Lite одним из лучших и самых простых ECS фреймворков и по сей день.
А какой ECS фреймворк вы используете в своём проекте? Ответ "никакой" тоже подходит 😄.
👍24
Forwarded from Болтовня
Дневничок разработчика 1
Часть 1:
Пост из разряда TIL (Today i learned):
Мне тут подкинули такую штуку как Tuple, или - "Кортежи", это такой сахар для System.ValueTuple<...> который позволяет передавать несколько разнотипных данных сразу одной структурой
Вкратце - это штука, упрощающая синтаксис и доступ к данным, выглядит это как запись нескольких значений в одну переменную через запятую в скобках. как когда мы вводим данные в метод:
Часть 1:
Пост из разряда TIL (Today i learned):
Мне тут подкинули такую штуку как Tuple, или - "Кортежи", это такой сахар для System.ValueTuple<...> который позволяет передавать несколько разнотипных данных сразу одной структурой
Вкратце - это штука, упрощающая синтаксис и доступ к данным, выглядит это как запись нескольких значений в одну переменную через запятую в скобках. как когда мы вводим данные в метод:
var tuple = (11, 12, 13);это я сейчас создал кортеж на 3 Int, обращаться к ним можно через item1, 2, 3, но можно и индивидуально им задать имя.
var tuple = (first: 1, second: 2);но самое вкусное, что мне нравится. их можно использовать как вывод в методе. и да, тоже с индивидуальными именами
var foo = tuple.second
; // = 2
public static (int first, string second) GetData() {...}
var data = GetData();
data.first // выведет какое то число
#unity #code #TIL #разработка👍18🔥5👎4
Forwarded from Болтовня
Дневничок разработчика 1
Часть 2:
Сначала это просто показалось мне прикольной фичей, но когда я попробовал - это оказалось супер удобно, супер красиво и лаконично.
Сразу полезли идеи для реализации всяких хелперов:
Например для ботов идеально подойдет какой-нибудь метод измеритель, который сразу выведет все позиции, дистанции, направления для взгляда и разворот бота относительно игрока одним методом, без огромного списка out'ов в скобках.
Или еще вот скриншот, так я для бота сократил в квантуме получение некоторых параметров, что урезало несколько классов для ботов на десятки строк.
Вот статья на хабре с чуть более детальным описанием что это и с чем едят. есть конечно какие то подводные их использования наверное, но не думаю что это превратит код в адовую сатану, можно юзать.
Подсказал штуку NightTrainCode, спасибо ему за это)
#unity #code #TIL #разработка
Часть 2:
Сначала это просто показалось мне прикольной фичей, но когда я попробовал - это оказалось супер удобно, супер красиво и лаконично.
Сразу полезли идеи для реализации всяких хелперов:
Например для ботов идеально подойдет какой-нибудь метод измеритель, который сразу выведет все позиции, дистанции, направления для взгляда и разворот бота относительно игрока одним методом, без огромного списка out'ов в скобках.
Или еще вот скриншот, так я для бота сократил в квантуме получение некоторых параметров, что урезало несколько классов для ботов на десятки строк.
Вот статья на хабре с чуть более детальным описанием что это и с чем едят. есть конечно какие то подводные их использования наверное, но не думаю что это превратит код в адовую сатану, можно юзать.
Подсказал штуку NightTrainCode, спасибо ему за это)
#unity #code #TIL #разработка
👍19👎2
Не знаю почему дизы налетели на предыдущие месседжи, про прикольную фичу решил поведать, тем более админ нашего чата уже сам нарыл инфу и сэкономил мне время на пост. Сам я Tuple на практике не юзаю, предпочитаю под это дело структуры писать с необходимыми полями, но в некоторых кейсах эта фича может быть очень удобной.
Тем временем, апдейт для NightPool уже на финишной прямой. Завёз кучу новых функций, кучу проверок (для защиты от чайника), файлик package json и с гордостью можно будет назвать эту версию NightPool 3.0.
Какой производительности получилось добиться по сравнению с конкурентом (в лице LeanPool)?
Первичный Instantiate клона в пул:
Разброс 3% в пользу то одного, то другого👌
Spawn(GameObject prefab):
NightPool на 19% быстрее✅
Spawn(GameObject prefab, Transform parent):
NightPool на 25% быстрее✅
Spawn(T component):
NightPool на 20% быстрее✅
Spawn(T component, Transform parent):
NightPool на 28% быстрее✅
Despawn(GameObject clone):
NightPool на 15% быстрее✅
Despawn(T clone):
NightPool на 17% быстрее✅
Spawn(T component, Transform parent) с опцией Recycle:
NightPool на 80% быстрее🔥
Осталось самое душное - проверка на баги и обновление документации :D
P.S. Тесты проводил на префабе в виде примитива (куба) с одним рандомным компонентом. В качестве замеров производил по 1000 итераций за раз, был включён Deep Profiling. С другими, более тяжелыми префабами, картина может меняться, но не кардинально
Тем временем, апдейт для NightPool уже на финишной прямой. Завёз кучу новых функций, кучу проверок (для защиты от чайника), файлик package json и с гордостью можно будет назвать эту версию NightPool 3.0.
Какой производительности получилось добиться по сравнению с конкурентом (в лице LeanPool)?
Первичный Instantiate клона в пул:
Разброс 3% в пользу то одного, то другого
Spawn(GameObject prefab):
NightPool на 19% быстрее
Spawn(GameObject prefab, Transform parent):
NightPool на 25% быстрее
Spawn(T component):
NightPool на 20% быстрее
Spawn(T component, Transform parent):
NightPool на 28% быстрее
Despawn(GameObject clone):
NightPool на 15% быстрее
Despawn(T clone):
NightPool на 17% быстрее
Spawn(T component, Transform parent) с опцией Recycle:
NightPool на 80% быстрее
Осталось самое душное - проверка на баги и обновление документации :D
P.S. Тесты проводил на префабе в виде примитива (куба) с одним рандомным компонентом. В качестве замеров производил по 1000 итераций за раз, был включён Deep Profiling. С другими, более тяжелыми префабами, картина может меняться, но не кардинально
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥5🤔3👎1