Кодогенерация в этих ваших юнити
Мы засунули монитор тебе в монитор, а потом MTV скатился в кал.
Ну и что такое это ваша кодогенерация? Всё просто. Это код, который пишет код. Это как интернет, карри (и currying тоже, да) или унитаз -- сначала ты думаешь "а нахуя оно мне надо", а потом жить без этого не можешь.
И вот где-где, а в Юнити без неё жить точно невозможно, потому что на каждом шагу приходится пользоваться магическими строками:
- Названия стейтов и параметров в аниматоре (аниматор вообще сильно повышает риск суицида)
- Названия инпутов, что во встроенной системе, что в каком-нибудь Rewired
- Названия сцен
- Названия слоёв, тэгов, и ещё целой кучи разного говна
"Ну строки и строки", скажешь ты, -- "и чё"? LayerMask.GetMask("Dfeault"), вот чё. Или иди попробуй через два месяца вспомни, как называется триггер для мощной атаки в аниматоре -- "Attack Heavy", "Attack_Heavy", "AttackHeavy", я на тебя посмотрю.
Ну ты понял, короче. А теперь, вот как это делается: в Юнити есть замечательный такой аттрибут (не спрашивайте, какого хрена сишарповская версия декораторов так называется -- я не знаю): [UnityEditor.InitializeOnLoadMethod].
Он прикручивается к методу и этот метод будет запускаться при каждой перезагрузке ассетов или компиляции скриптов -- как раз то, что нам нужно.
А теперь попробуем запилить генератор, который выводит все слои в константы.
Для начала, создадим новый класс и засунем его в какой-нибудь стрёмный неймспейс, чтобы случайно где не надо к нему не обратиться
Теперь напишем метод, который возвращает массив всех слоёв.
Тут всё просто -- в Юнити есть 32 слоя, поэтому мы и проходимся от 0 до 32 и записываем в массив результаты метода LayerMask.LayerToName, который возвращает названия слоя по индексу.
Ну а теперь, собственно, мякотка: сам метод, который генерирует и записывает в файл наш код:
Первая строка говорит сама за себя -- создаём переменную path, в которую записываем путь к файлу, который будем создавать. В данном случае = /Assets/Scripts/Generated/Layers.cs
А вот на String.Join("\n", GetLayerNames().Select(_ => $"const string {_} = {_};")) я остановлюсь поподробнее. Тут мы сначала преобразуем массив слоёв в массив из строк вида "const string %НАЗВАНИЕ_СЛОЯ% = "%НАЗВАНИЕ_СЛОЯ%"" через LINQовский Select, а потом объединяем всё это в одную большую строку раздёленную символом переноса строк -- "\n".
Не видишь проблему? А она есть, как суслик. Даже целых два суслика.
Вот так вот выглядит наш сгененерированный файл. На отступы похуй, никто этот файл всё равно открывать никогда не будет, а вот то, что в названиях слоёв могут быть пробелы или они вообще могут быть пустыми -- это уже проблема. Как минимум потому, что наш код тупо не компилится.
Ну-ка по-быстрому её решим.
Теперь мы сначала фильтруем массив, выкидывая в мусорку все слои с пустыми названиями, а потом ещё и заменяем все пробелы на _. И в апперкейс, чтобы женевской нейминг конвенции соответствовала.
Для копипаста, выглядит всё в результате вот так:
Такие дела. Мораль думайте сами.
Или иди попробуй через два месяца вспомни, как называется триггер для мощной атаки в аниматоре — "Attack Heavy", "Attack_Heavy", "AttackHeavy"
Если у вас нет стайлгайдов для таких вещей, то это печально.
а) не всегда спасает
б) в стайл гайд всё равно нужно лезть
ц) всё-таки намного лучше, когда интеллисенс сам предлагает варианты
Ещё райдер сильно облегчает эту задачу, он интелсенсит и слои и теги.
это единственное его отличие от VC или есть ещё что то полезное для юнити?
Комментарий недоступен
Ну совсем спасти не спасёт, но вот от тупых очепяток защитит. И сразу забьёт тревогу, если нужный стейт или параметр удалили/переименовали.
Но в целом аниматор я выбросил в мусорку, купил Animancer и доволен как слон.
- Названия стейтов и параметров в аниматоре (аниматор вообще сильно повышает риск суицида)- Названия инпутов, что во встроенной системе, что в каком-нибудь Rewired- Названия сцен- Названия слоёв, тэгов, и ещё целой кучи разного говна
Интересно что ты перечислил всё чего в проекте я практически не касаюсь:
Аниматор - использую только для возможности вывода анимации ну и деревья,
Слои - только некоторые объекты в Игноррейкаст,
Название сцен -сцена обычно одна
Тэги???? если кто то их использует то нам не по пути, разве что CameraMain и то правильнее обращаться на прямую.
Статью целиком не читал, но прочитав начало ещё раз убедился в своей правоте.