Unity: сквозь тернии к importing assets

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Бэкграунд

В геймдеве более 10 лет. Начинал с порта iOS игр на Android, потом пилил небольшие проекты на LibGDX, писал туториалы, которые, в своё время, многим помогли. В какой‑то момент переехал в Москву, где работал Android‑разработчиком, а параллельно со знакомыми организовал свой первый стартап, в рамках которого работали над MOBA Unyworld, под которую мы даже привлекли инвестиции. Проект, правда, пришлось закрыть.

Игра была на Unity. С тех пор (с ~2014 года) в той или иной степени приходится взаимодействовать с движком. Я не специалист графики и вряд ли сейчас с ходу смогу свой рендер написать или нормальный шейдер. На том проекте я занимался всем бекендом/инфраструктурой (инстансы, аркестраторы самопальные, матчмейкер, работа с БД и вот это вот всё), а в Юньке отвечал по большей части лишь за какие‑то архитектурные вещи или аспекты, которые не касаются непосредственно самого движка:

  • Квестовая система

  • Система ачивок

  • AI

  • Клиент‑серверное взаимодействие

  • Лиги, рейтинговые бои

  • Чат (использовали ejabberd)

За годы взаимодействия с движком накопилось множество заметок, часть из которых я начал публиковать в треде. Решил в итоге как отдельный пятничный пост оформить.

Небольшое отступление

Это не пост с целью показать какой Unity плохой движок. Если бы я столько времени проработал с тем же UE, то, думаю, моментиков было бы не меньше. Просто делюсь опытом и интересными (надеюсь) историями из личной практики. А если я сейчас буду опять делать небольшую инди‑игру, то, скорей всего, всё ещё выберу Unity.

Проблемные обновления

Познакомился с движком в районе Unity 4. И было множество изменений тех или иных аспектов Unity, которые влекли за собой переписывание нашего кода. Нормально, когда движок меняется, особенно в рамках мажорных обновлений, вот только…новые вещи привносят новые проблемы и баги, которые компания может месяцами (а то и годами) не фиксить.

У них несколько раз менялась сетка. В бородатые годы там были RPC. Примерно в то же время была альтернатива в виде uLink. Но это стороннее решение было не самым стабильным. Были вопросики к мастер‑слейв архитектуре и крашам. В какой‑то момент пришлось переехать на HLAPI/LLAPI. Теперь уже и HLAPI/LLAPI deprecated.

На момент написания заметок про сетку уже появилось MLAPI, но тогда оно было в статусе экспериментального. Что забавно, в старых доках куча рекомендаций использовать LLAPI, который уже не поддерживается. А в LLAPI ссылки на новый экспериментальный MLAPI.

В былые годы для отправки http запросов был не самый лучший класс WWW. Позже на замену пришёл UnityWebRequest. Я в наших игровых инстансах серверных (да, они были на Юнити) переписал код для отправки Http‑запросов на него. В какой‑то момент запросы переставали отправляться. Не было ясно, что не так. Даже если явно всё закрывать, вызывать Dispose и прочие хитрости.

netstat показывал сотни незакрытых соединений. UnityWebRequest почему‑то их вообще не закрывал. В итоге пришлось остаться на самописном Http‑клиенте с использованием дефолтного TcpClient из C#.

Был момент, когда начали приходить тревоги, что на серваке место на диске заканчивается. Но на этих серваках кроме логов ничего и не пишется. В итоге выяснилось, что Юнитишное LLAPI спамило каждый кадр ошибку откуда‑то из нативного кода, логфайл забил весь хард из‑за этого. Отловить ошибку нельзя. Затрай‑кетчить тоже. Что вызывало ошибку? Не ясно. В итоге я это зарепортил напрямую сотруднику, который сетку пилил. Через 1–2 апдейта починили.

Тот самый WWW класс вообще не поддерживал keep‑alive соединения. UnityWebRequest изначально тоже не поддерживал… И, судя по всему, поддерживать начал только в Unity 2019.

Очень часто происходят регрессии при обновлениях. Чинить такое могут очень долго. Оно и понятно, когда у тебя одновременно несколько десятков активных различных версий движка. Сидение на LTS версии особо не спасает.

Очередной релиз принёс ошибку «Increase kMaxCallback». А всё потому что выкатили обновление, при котором при каждом заходе в Play Mode регистрировался ивент, а отписки не было. В итоге, если редактор долго запущен, то после 64 запусков он крашился.

Unity Hub до сих пор не умеет обновлять версии Unity. Скажем, если я сижу на LTS версии, то при выходе новой минорки мне нужно ставить её рядом. Обновить текущую установленную нельзя.

Что-то не фиксится годами.

Странности

Была у нас однажды проблема с тем, что в какой‑то момент просто пропадало всё GUI в игре. В логах спавн сообщений из нативного движка про вертексы. Так и не было ясно, что не так. Репортили Unity, те ответили, что баг очень редкий, но они «готовы выделиться сотрудника, если мы будем оплачивать ему часы по ставке $10к в месяц».

В итоге разбили корневой канвас на более мелкие — проблема исчезла. Баг с UI забавен ещё тем, что, если зайти в иерархию объектов в редакторе Unity и просто кликнуть по объекту, то гуятина снова появлялась.

Чтобы разгрузить основной билд и скорость запуска увеличить, часть ассетов вынесли в ассет бандлы и грузили по требованию. Иногда бывала ошибка «Asset Bundle: CRC Mismatch». Так и не поняли, что с этим делать. При пересборке иногда лечилось. Так и всплывало от раза к разу.

Тормоза UI это норма. Окна можно инстанциировать на старте игры и отключать (память жрут) либо инстанциировать по надобности (большой фриз при открытии). Но даже без этого всё равно будут при обновлениях тормоза:

  • Работа с текстом.

  • Перерисовки канвасов.

  • и т. д.

Я: оптимизирую логику AI и рейксаты, а теперь думаю, куда бы направить сэкономленный бюджет кадра.

Тем временем GUI:

Про Windows все шутят, мол «если что‑то не работает на Винде, то ребутни/переустанови». С Unity есть похожая тема. Порой, когда начинаются непонятки, ошибки с пакетами и т. п, то советуют удалить папку Library. Что забавно, это очень часто действительно решало проблему. Хотя сейчас, к счастью, такое реже происходит.

Бывает, что в редкторе всё ок, а в билде с шейдерами проблема. Почему‑то периодически могут слетать в настройках графики. Приходилось ресетать.

Если включить автосохранение, то при малейшем изменении префабов и их свойств редактор будет тупить несколько секунд.

Багует периодически сам редактор. При установке нескольких версий Юнити, судя по всему, ломаются теймплейты для создания новых проектов. В итоге при открытии проекта два юнити запускаются и нормально не поработать.

Лечится тем, что нужно сбросить расположение слоёв в редакторе Windows → Layouts → там переключиться на что‑нить. Потом на default.

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

В редакторе бывают проблемы, которые проявляются на каких‑то конкретных версиях. А в одном из след. обновлений могу пропасть, при этом в патчнотах ничего про это нету. Вот такое, постоянно появляющееся, окно бесило в какой‑то из 2020.x версий.

Профайлер в Unity живёт своей жизнью. Я его сам не включал, и он ничего не трекал. Выходит, что там за ночь что‑то натекло в служебных процессах

Источник: https://habr.com/ru/articles/794118/


Интересные статьи

Интересные статьи

Хватит блокировать вертикальную или горизонтальную ориентацию экрана в своих проектах на Unity! В этой статье мы рассмотрим небольшой скрипт, который я использовал в своем проекте.
Когда речь заходит об асинхронных операциях в Unity, на ум первым делом приходит coroutine. И это не удивительно, так как большинство примеров в сети реализованы именно через них. Но мало кто знает, ч...
В PVS-Studio уже некоторое время есть плагины для таких IDE от JetBrains, как Rider, IntelliJ IDEA и Android Studio. Другую известную среду разработки, CLion, мы долгое время незаслуженно обходили сто...
Итак, вы оптимизировали самые очевидные части своей игры. Однако на самом деле это не так. Вы упустили хитрый, не совсем заметный момент: оптимизацию иерархии сцены Unity. А что не так с иерар...
[Первая, вторая, третья и четвёртая части туториала] Поддержка врагов малого, среднего и крупного размеров. Создание игровых сценариев со множественными волнами врагов. Разделение конфигур...