Unity-разработчик
80 задач. Условие и варианты ответа открыты всем; проверка, подсказка и разбор — в клубе.
C# и жизненный цикл Unity
- Rigidbody двигают в Update: почему персонажа трясёт и он проскакивает сквозь стены
- Перемещение transform без учёта длительности кадра: как это увидит игрок
- Изменили значение поля в коде, а объект на сцене ведёт себя по-старому
- Один компонент заполняет данные в Awake, другой читает их в Awake — иногда пусто
- На паузе корутина награды не доходит до конца
- Асинхронная загрузка профиля падает, когда игрок выходит со сцены
- После нескольких перезапусков уровня счёт скачет, а лог полон обращений к уничтоженным объектам
- Оператор ?? с уничтоженным объектом Unity: что произойдёт на следующей строке
Профилирование и оптимизация
- В редакторе 300 кадров, на среднем Android — 22: где мерить производительность
- Профайлер показывает выделение памяти каждый кадр: что в этом коде его создаёт
- 400 одинаковых кустов дают 400 вызовов отрисовки: что реально снизит их число
- После подсветки урона батчинг рассыпался, а память растёт весь бой
- 800 объектов с почти пустым Update заметны в профайлере: почему
- Проверка земли под врагами: какие два изменения снимут нагрузку
- Главный поток почти весь кадр в ожидании кадра отрисовки, а команда оптимизирует C#
- Расчёт вынесли в джоб, но кадр не ускорился
Архитектура игрового кода
- Баланс оружия вынесли из констант в ассеты-конфиги: что это даёт
- Поиск игрока по сцене в Update у каждого врага
- Скрипт на кнопке магазина делает всё: списывает валюту, выдаёт предмет и шлёт аналитику
- Внедрили контейнер, но Resolve вызывают по всему коду
- Золото в ScriptableObject: в редакторе сохраняется, в билде сбрасывается
- После возврата из меню прогресс обнуляется, а в иерархии два менеджера
- Монолитный GameManager на живом проекте: как разбирать его без остановки релизов
- После перевода снарядов на пул они пульсируют и возвращаются в пул дважды
UI, контент и мобильная сборка
- Тап по экрану отзывается с задержкой, хотя логика пустая
- Интерфейс собран на 16:9 и разъезжается на планшете и длинном телефоне
- Весь контент лежит в папке Resources: чем это плохо и что делать
- Таймер на боевом экране заставляет пересобирать весь канвас
- Экран коллекции грузит иконки каждый раз, память растёт до вылета
- Вес мобильного билда вырос вдвое: какие два шага действительно помогут
- Фриз при первом появлении каждого нового эффекта, второй раз всё гладко
- Релизный билд падает на разборе серверного конфига, а в редакторе всё работает
Физика, коллизии и рейкасты
- Монета с триггером не подбирается, хотя игрок проходит прямо сквозь неё
- В 2D-платформере OnCollisionEnter у шипов не срабатывает
- Рейкаст по слою Ground с маской 8 попадает не в землю, а в воду
- Персонаж на CharacterController сходит с обрыва и продолжает идти по воздуху
- Бочка с MeshCollider и Rigidbody падает сквозь пол, а в консоли ошибка про convex
- Пули врагов отскакивают от других врагов, хотя в коде столкновение игнорируется
- Геймдизайнер поставил камню массу 1000, но он падает так же медленно, как ящик
- Взрыв гранаты наносит боссу тройной урон
- Выстрелы попадают в невидимые зоны чекпоинтов вместо врагов за ними
- Телепортированный игрок в том же кадре не находится проверкой OverlapSphere
- В замедлении времени падающие обломки двигаются рывками
- В открытом мире за 30 км от центра карты персонаж дрожит, а колёса проваливаются в дорогу
Корутины, async/await и UniTask
- Окно награды закрывается и не может запустить анимацию начисления монет
- Генерация карты в Task.Run падает на первой же строке с transform
- Мигание щита не выключается после окончания неуязвимости
- На ревью спорят, можно ли трогать объекты сцены после await Task.Delay
- После загрузки профиля с ConfigureAwait(false) интерфейс профиля не обновляется
- Один UniTask загрузки конфигов ждут два менеджера — второй получает исключение
- Экран загрузки висит 5 секунд, хотя каждый из пяти запросов идёт секунду
- Туториал показывает следующий шаг, не дождавшись окончания анимации камеры
- Быстрое переключение вкладок магазина показывает товары не той вкладки
- Редактор Unity намертво зависает на старте сцены после вызова .Result
- Поиск пути перенесли в корутину, а спайк в 400 мс остался
- Обработку ошибок загрузки в корутине обернули в try/catch — проект перестал компилироваться
Рендеринг, шейдеры и URP на мобильных
- Взрыв с дымом во весь экран роняет FPS на телефоне с 60 до 25
- Атласы интерфейса занимают в памяти на треть больше, чем ожидалось
- Эффект заморозки в билде рисуется розовым, а в редакторе всё нормально
- В подземелье 30 неподвижных факелов со светом в реальном времени — на телефоне 20 FPS
- Свечение предмета включается ключевым словом в редакторе, но не в сборке
- Стекло теплицы то рисуется поверх воды в бочке внутри, то пропадает за ней
- Текстуры персонажей занимают сотни мегабайт на Android, хотя в проекте их всего 20
- Игра с тяжёлыми шейдерами тормозит только на флагманах с экраном 3200×1440
- Включили GPU Instancing для орды из 500 зомби, а draw calls не уменьшились
- Густая трава с альфа-отсечением съедает половину GPU-времени кадра на iPhone
- Анимация течения реки на части Android-телефонов застывает, если игру не закрывать пару часов
- Frame Debugger показывает копирование глубины и цвета, которые никакой шейдер не читает
Сеть, сохранения и защита игровых данных
- В файле сохранения нет инвентаря, хотя остальные поля записались
- Разбор списка заданий с сервера падает с «JSON must represent an object type»
- Сохранение работает в редакторе, а на Android файл не создаётся
- При падении сервера игра показывает пустой магазин вместо сообщения об ошибке
- Игроки собирают ежедневную награду по 30 раз в день
- В таблице лидеров игроки с 2 миллиардами кристаллов
- После разрядки телефона во время сохранения прогресс игрока пропал целиком
- Запросы к тестовому серверу по http:// перестали проходить в сборках под телефоны
- После минутного сбоя сервер не может подняться: клиенты заваливают его повторами
- После переименования поля в сохранении у всех игроков обнулилась премиум-валюта
- Unity IAP: покупка прошла, сервер не ответил, пакет кристаллов потерян навсегда
- Разбор конфига уровней на 6 МБ даёт фриз 800 мс на экране загрузки
