Григорий Дядиченко – Telegram
Григорий Дядиченко
2.83K subscribers
395 photos
160 videos
7 files
1.19K links
Разработчик игр, интерактивных стендов и интерактивной рекламы. Эксперт в области интерактивов и XR.

100+ проектов за 5 лет.

По вопросам сотрудничества писать: @it_bizdev
Реклама в канале: https://vk.cc/cNhGLE
Download Telegram
KeenTools AR Geo Tracker
https://80.lv/articles/keentools-geotracker-for-after-effects-officially-released/

Вышла прикольная тулза для афтера, которая позволяет притречиваться к объектам. По рекламному ролику работает прям хорошо :)

#новости
2👍1
Appmetrica и ARCore

Программирование было бы простой работой, если бы всё работало из коробки. Забавное наблюдение. Это конечно не коснётся вас если вы юзаете ARCore XR Plugin 5.0 в Unity (так как это баг аркора до 1.24 версии, которая в 4+ ARCore Unity). Гугл и его депенденси.

Если же вы подключаете что-то, что скажем использует com.android.installreferrer.installreferrer-2.2-runtime.jar то вместе с ARCore у вас вызовет ошибку.

Duplicate class a.a.a found in modules arcore_client-runtime.jar (:arcore_client:) and com.android.installreferrer.installreferrer-2.2-runtime.jar (:com.android.installreferrer.installreferrer-2.2:)

В версиях старше ARCore 1.24 оно пофикшено (ох уж эти одинаковые классы в двух либах от гугла). Но для версии 1.24 (которая ща в Unity основная) — нет. И есть два пути решения проблемы, которые оба очень неочевидные для Unity разработчика.

Первое переезд на ARFoundation 5.0.3. Но чтобы это стало квестом Unity почему-то не дало права выбирать версию в менеджере пакетов. А нужно лезть в манифест и править руками. Инструкция есть тут. И всё соберётся, так как 5.0.3 опирается на ARCore 1.31 и соответственно там уже нет конфликта с installreferrer.

Второе же. Удалить installreferrer. Но не файл, он будет постоянно появляться. А в градле. Для этого вы создаёте кастомный темплейт градла и добавляете в него запись — как на скриншоте. Она исключит эту либу из сборки. Это костыль-костыль. Метрику почему-то он не ломает (мне не совсем ясно почему). Но если вы никак не можете переехать на 5.0.3 — как временное решение может сработать. Мне оно не нравится, но ничего элегантнее я не нашёл.

В общем разработка это просто говорили они. Там всё легко. Поэтому я не люблю делать что-то на сторы XD

#советы
👍6
Наса рассматривает возможность использования AR в костюмах космонавтов
https://80.lv/articles/nasa-is-exploring-the-idea-of-using-ar-in-spacesuits/

Прикольная концепция, хотя с оптикой там очень много гемора. Но в скафанде на кнопочки особо не пожимаешь, и дисплей наверное никуда не засунешь. Так что вместо аудио информации зрительная — может быть полезно)

#новости
🐳2
Баланс в играх
https://habr.com/ru/post/709012/

Прикольная обзорная статейка про баланс в играх. Это конечно задача геймдизайнеров балансом заниматься, но в общих чертах всё равно полезно понимать. А уж в инди там ты и сам себе программист, и сам себе геймдизайнер. Помню когда ещё работал геймдизом читал Fundamentials of Gamedesign. Классная книжка.

#новости
👍3
Appmetrica и IOS

Настоящий кроссплатформенный разработчик — это не тот, кто знает кроссплатформенный фреймворк. А тот кто ещё понимает нюансы самих платформ. Итак, андроид мы победили (обновив ARFoundation до 5.0.3) Теперь поговорим про айос.

На айос, особенно если вы как и я сборки собираете под виндой, может возникнуть такая ошибка (кстати не только с этим плагином).

'YandexMobileMetrica/YandexMobileMetrica.h' file not found

При этом не будет файла xcworkspace, только xcproject. Дело в том, что обычно такие плагины и зависимости подключаются через cocoapods. Чинится это довольно просто. На макбуке.

1. Установить cocoapods
2. Установить гит (если он не стоит для терминала)
3. Сделать cd в папку с собранным xcode проектом
4. Сделать команду pod install в ней
5. Зайти в появишийся xcworkspace файл
6. (Возможно) потребуется ещё а проекте Pods-Unity-Iphone поставить Enable Bitcode в Build Options

И вуаля. Всё соберётся. Под макосью такая проблема тоже может возникнуть, если кокоаподс не стоит или стоит как-то криво. Чисто по той причине, что юнити не вернёт вам ошибку, а просто не соберёт xcworkspace.

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

#советы
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Рисуем график
#задачка

Давайте элегантно нарисуем график функции y = x ^ 2 в UI в Unity. Задачку нужно решить с использованием MaskableGraphic и VertexHelper.

Решение: https://github.com/Nox7atra/Unity-Test-Tasks/blob/master/Assets/Unity-Test-Tasks/Task_2/Scripts/GraphRenderer.cs

Обоснование к решению я напишу в спойлере ниже. Сразу скажу, что задача на знание того, как делаются кастомные UI компоненты с рядом важных нюансов. Из-за чего решается она не элементарно.

Плюс добавлю опрос. Интересен ли такой формат задач или слишком сложно?
👍13
Григорий Дядиченко
Рисуем график #задачка Давайте элегантно нарисуем график функции y = x ^ 2 в UI в Unity. Задачку нужно решить с использованием MaskableGraphic и VertexHelper. Решение: https://github.com/Nox7atra/Unity-Test-Tasks/blob/master/Assets/Unity-Test-Tasks/Task…
Комментарий к решению задачке "Рисуем график"

Дальше под спойлером нюансы решения. Просто разбора такого примера недостаточно для "статьи на хабр". А знание довольно полезное и может пригодиться.

В Unity есть замечательная возможность через меш генерацию делать свои кастомные UI элементы. По сути для этого нужно унаследовать класс от MaskableGraphic. Переопределить метод OnPopulateMesh(VertexHelper vh) и сделать свою реализацию этого метода. Но тут есть несколько нюансов, которые стоит знать, чтобы "чудо произошло".

Чтобы график в целом нарисовался, помимо самого скрипта на объекте должен находится CanvasRenderer. Иначе ничего не будет рендерится и не будет вызываться метод OnPopulateMesh

Помимо этого можно затереть базовую реализацию этого метода, так как она делает лишние вещи.

Дальше нужно немного понимать в меш генерацию. И сделать генератор нужного нам меша с VertexHelper.

Дальше нужно разобраться с системой координат. Там много способов сделать самые разные варианты.

Моё решение выше, оно как бы общее. Можно было бы элегантно сгенерить меш под график y = x ^ 2, но по сути данное решение позволяет легко нарисовать любой график.

Важно понимать, что суть задачи не в конкретной реализации (как и всех задач в будущем, так как у всех реализация будет разная). А в сути на что это упражнение и какие нюансы нужно знать, чтобы его в целом сделать. Тут нужно в первую очередь знать про CanvasRenderer и про то, как делаются кастомные UI элементы. Причём проще всего наследоваться от MaskableGraphic, чтобы просто не прокидывать логику реализации масок и т.п.
🔥6👍2
Пишу материал по оптимизации веса билда. Думаю может получиться любопытно и надеюсь завтра я добью. Хотя я в одной только оптимизации текстур уже закопался на три пункта. Но хочется собрать некий чеклист.
🔥25👍4
Как сделать билд минимального размера в Unity?
https://habr.com/ru/post/709126/

А вот и статья про то где и что можно поджать внутренними инструментами Unity и рядом дополнительных техник. Без узких глубоких оптимизаций конечно, так как есть ещё техники подходящие прям совсем конкретным проектам. Вроде получилось неплохо пройтись галопом по европам. А остальное уже очень специфичная конкретика проектов.

Часть вещей для многих думаю будут банальными и очевидными. Вроде атласов. А про найн слайс и вертексные параметры — то что про это не думают, и я замечал довольно часто перехватывая чужие проекты. Плюс по нюансам я сталкивался с тем, что кто-то пытался оптимизировать размер изображений в проекте с помощью утилит мака и т.п. Хотя это не работает.

А так ответ на вопрос конечно получился длинноват :) Напоминаю, что вопросы можно задавать тут.

#статья
🔥19👍7
Григорий Дядиченко pinned «Как сделать билд минимального размера в Unity? https://habr.com/ru/post/709126/ А вот и статья про то где и что можно поджать внутренними инструментами Unity и рядом дополнительных техник. Без узких глубоких оптимизаций конечно, так как есть ещё техники подходящие…»
Как достигнута комиксная стилистика в игре Rollerdrome
https://www.youtube.com/watch?v=G1NY0LKDqJo

Классное видео про то, как можно достичь визуала комикса в Unity. Так сказать как красиво нарисовать аутлайны на 3д моделях.

#новости
👍5
Unity Deque
https://github.com/Nox7atra/Unity-Deque

Для разминки написал коллекцию Deque (Double-ended Queue) и вынес в пакет. Она бывает полезной для операций где нужно быстро добавление удаление из начала или из конца и важен порядок. В отличии от классической реализации таких очередей она опирается не на массив, а на LinkedList, который позволяет делать по сути всё тоже самое. Только Deque с чуть более привычной сигнатурой класса для очереди и ограничениями доступа. Dequeue, Peek и так далее. Ну в общем требование добавление и удаление из начала и из конца в О(1) соблюдено. Как и отсутствие доступа к ненужным операциям (доступ к вершинам связанного списка). Так как коллекция возвращает везде только значения.

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

#репозитории
👍12
Media is too big
VIEW IN TELEGRAM
"Бесконечный" скролл
#задачка

Сделать скролл который будет вмещать в себя 500 000 элементов случайного размера по высоте и не будет тормозить. Например игровой чат или система диалога, где размер текста непредсказуем.

Решение:
https://github.com/Nox7atra/Unity-Test-Tasks/blob/master/Assets/Unity-Test-Tasks/Task_3/Scripts/FastDialogScreen.cs
https://github.com/Nox7atra/Unity-Test-Tasks/blob/master/Assets/Unity-Test-Tasks/Task_3/Scripts/DialogBubble.cs

В репозитории я убрал мок генерацию 721 000 строк, так как не у всех сцена с таким числом запустится. Это просто дорого по оперативной памяти. Это задачка возможно даже посложнее, чем прошлая.
👍7
Григорий Дядиченко
"Бесконечный" скролл #задачка Сделать скролл который будет вмещать в себя 500 000 элементов случайного размера по высоте и не будет тормозить. Например игровой чат или система диалога, где размер текста непредсказуем. Решение: https://github.com/Nox7atra/Unity…
Обоснование задачки "Бесконечный" скролл

Скриншот так сказать для пруфов. На видео листается 720 896 элементов. Просто тормозит оно не из-за скролла, а из-за отрисовки инспектора. Если цеплять это окно. Так вот, а теперь по деталям решения задачи.

В первую очередь это задача на знание того, как сделать "свой контент сайз фиттер" и понимание, чем плохи лейауты Unity. Так как на лейаутах всё ляжет даже на 100 элементах на мобилках. И оно уже будет тормозить.

Окна адаптирующиеся под текст делаются очень просто. Для этого надо знать про существование метода. GetPreferredValues в TextMeshPro. И уметь работать с размерами RectTransform.

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

А вот часть с бесконечным скроллом уже сложнее. Так как нужно понимать, как работать с пулом, со скролл вью и с тем, как делаются в целом нетормозящие скроллы.

Просто плохо сделанные скроллы — это моя боль. Первый проект, который я делал на фрилансе ещё пять лет назад передали мне со скроллом на лейаутах и контент сайз фиттерах юнити. И на 40 элементах оно не выдавало 60 фпс на топовом устройстве. А на скроллах очень заметны тормоза. Поэтому у меня в целом аллергия на Unity лейауты.

Тут просто показано решение одним скриптом, как с помощью методов расчитать размер контента и вместо 720к+ элементов мы будем переставлять 8 элементов. И в этом весь трюк. Плюс ряд оптимизаций. Остальное можно понять разобрав код.
👍10
Интересная подборка туториалов от Unity
https://blog.unity.com/games/7-tutorials-to-help-uplevel-your-unity-skills-in-2023

Прикольный набор курсов для новичков. Даже AR охватывает. Правда фейсмаски меня сначала заинтриговали, а потом это оказывается про айос. Так что ничё особо нового :) Но всё равно неплохие обзорные курсы и бесплатные в плюс к тому.

#новости
👍31
Про JPEG
https://www.youtube.com/watch?v=0me3guauqOU

Интересный ролик про JPEG. Всегда интересно разбирать алгоритмы сжатия и т.п. Когда понимаешь идеи лежащие в этом всём, то становится понятнее как решать более сложные задачи. А текстуры — это одна из основных сущностей игровой разработке. И понимать их устройство, что такое цветовые пространства, что такое изображение в памяти и так далее. Это даёт в разы больше инструментов для реализации классных проектов.

#интересное
👍8
Media is too big
VIEW IN TELEGRAM
Doom запустили в инспекторе
https://github.com/xabblll/DoomInUnityInspector

Есть такое дело, дум запускать где угодно. И вот и на Unity запустили Doom. Можно поиграть в инспекторе :) Если вдруг кто забыл управление. Ctrl стрелять, пробел открывать использовать (открывать двери)

Чтобы установить себе в редактор и заниматься более важными вещами чем какая-то там разработка нужно в Package Manager добавить git url https://github.com/xabblll/DoomInUnityInspector.git

И всё. Дум работает. На версии 2021.3.16 — протестировано :)

#новости
😁21
Как же иногда бесит Git LFS

Git lfs часто и любопытно ломается. То какой-то файл найти не может, то что-то ещё. Особенно забавно он себя начинает вести с несколькими ремоутами. Так как там если у тебя локально нет какого-то файла, то запушить бывает целым приключением. За последние 2 месяца правил я какие-то проблемы уже дважды. Сейчас вот, так как у нас был переезд сервера гитлаба на новый, то как бы гит проблемы не увидел. Того, что это атака по середине и его ssh клиент почему-то не ругался. А вот lfs же (так как у меня не было одного файла, мне нужно было сделать git lfs fetch --all) начал ругаться. Ок. Сделали хендшейк с хостом, вроде всё ок? Не, теперь он просит пароль при ssh подключении. Кайф

Но бесит даже не это. Но любопытно такой кайф только под виндой? Промт с паролем нельзя закрыть не убив процессы руками. Ну то есть git-lfs будто бы не знает концепт "сопроцессов". Так как ожидаешь поведение. ЛФС сопросцесс гит клиента, ssh клиенты сопроцессы lfs. Поэтому когда закрываешь гит, всё должно закрыться. Но нет. Оно всё равно открывает окно с паролем. Допустим вы знаете, что этот промт открывает процесс ssh. Но просто закрыть его нельзя, так как ssh клиент будет переподнят git lfs. Поэтому сначала убивается гит лфс, а потом ссх клиент. И даже логику транзакций так обработать не трудно, создав демона для этой задачи, если рассуждать что с "сопроцессами" что-то пойдёт не так. Все локи и прочее в гите — это текстовые файлы конфигурации. Ну сейчас нет никакой проблемы хоть перед опасными операциями делать полный бекап, а потом восстанавливать из него "демоном" если процесс закрылся как-то не так. Но незакрывающиеся окна — это раздражает.

Ладно, пойду что ли ремоут пока на https заменю, чтобы сделать то, что мне надо. Это вероятно сработает.
1🤯1