День, коли наші шейдери зникли зі збірки
У редакторі Unity усе виглядало ідеально. У готовій збірці — рожеві поверхні й зниклі ефекти. Ласкаво просимо до однієї з найпідступніших пасток Unity — і кількох її родичів.
Шейдерний stripping. Під час збірки Unity викидає все, що, схоже, не потрібне, — зокрема й шейдери. Проблема: якщо завантажувати шейдери під час роботи через Shader.Find() (як це робимо ми для понад 20 власних шейдерів води, атмосфери, голограм та інших), Unity не бачить жодного посилання на них у жодній сцені. Результат: шейдер є в редакторі й зникає у збірці. Рішення непримітне, але обов'язкове: кожен із цих шейдерів треба додати до списку Always Included Shaders у налаштуваннях графіки. Відтоді в нас правило: новий шейдер? Додай одразу.
Шар, що був -1. Схожа категорія: ми визначали фізичний шар у коді за його назвою. У редакторі — працює. У пакетній збірці на сервері збірки: шару не існує, пошук повертає -1, і все, що базується на цьому шарі, мовчки поводиться неправильно. Відтоді ми посилаємося на шари за їхнім фіксованим індексом, а не за назвою.
Мораль: редактор Unity і готова збірка — це два різні світи. Редактор поблажливий — під рукою всі ресурси, усі назви, усі шейдери. Збірка безжальна. Тому в нас кожна зміна клієнта супроводжується справжнім локальним тестом збірки, а не лише кнопкою Play в редакторі. Це триваліше. Але це вже врятувало нас від багатьох прикрих релізів.
Коментарі