День, когда наши шейдеры пропали из сборки
В редакторе Unity всё выглядело идеально. В готовой сборке — розовые поверхности и пропавшие эффекты. Добро пожаловать в одну из самых коварных ловушек Unity — и в пару её родственниц.
Вырезание шейдеров (shader stripping). При сборке Unity выбрасывает всё, что, по его мнению, не нужно, — включая шейдеры. Проблема: если загружать шейдеры во время работы через Shader.Find() (как мы делаем с более чем 20 собственными шейдерами для воды, атмосферы, голограмм и не только), Unity не видит на них ни одной ссылки ни в одной сцене. Итог: в редакторе шейдер есть, а в сборке пропал. Решение неэффектное, но обязательное: каждый такой шейдер нужно добавить в список Always Included Shaders в настройках графики. С тех пор у нас правило: новый шейдер? Добавь сразу.
Слой, который оказался -1. Похожая категория: мы получали физический слой в коде по его имени. В редакторе — работает. В пакетной сборке на сервере сборки слоя нет, поиск возвращает -1, и всё, что опирается на этот слой, тихо ведёт себя неправильно. С тех пор мы ссылаемся на слои по их фиксированному индексу, а не по имени.
Мораль: редактор Unity и готовая сборка — два разных мира. Редактор милосерден — у него под рукой все ассеты, все имена, все шейдеры. Сборка беспощадна. Поэтому у нас каждое изменение клиента сопровождается настоящей локальной проверочной сборкой, а не просто кнопкой Play в редакторе. Это дольше. Но это уже уберегло нас от многих постыдных релизов.
Комментарии