🔓 Игнорирование internal для asmdef в Unity 🔓
Уровень материала: 🐥 #middle
Assembly Definitions — мощный инструмент для организации кода в Unity. Он предоставляет множество полезных возможностей и, в частности, позволяет пользоваться благами модификатора доступа internal. Но иногда бывает нужно internal "обходить" и получать доступ к закрытым ресурсам.
📌 Кратко про другие возможности Assembly Definitions:
- Помогает разделить проект на модули и изолировать их друг от друга (UI, Gameplay, Data).
- Помогает прозрачно контролировать зависимости между модулями.
- Предотвращает появление циклических зависимостей, хотя бы на уровне модулей.
- Ускоряет компиляцию скриптов, т.к. перекомпиляция происходит только для изменившихся и зависимых от них asmdef'ов.
- Позволяет реализовывать платформозависимые модули (в т.ч. чисто Editor-модули).
- Позволяет использовать Define Constraints на уровне целого модуля.
- Позволяет реализовывать Define Symbols на основе версий Unity или используемых пакетов.
Про это более подробно написано в документации Unity.
🔒 Про internal:
Что делает internal: он делает доступ невозможным за пределами конкретного asmdef. Т.е. с internal можно взаимодействовать только в рамках одного модуля. Как private в рамках одного класса. Только уровнем выше.
Это помогает контролировать как Low Coupling, так и High Cohesion (см GRASP).
🚧 Преодоление internal:
Это неправильно с точки зрения проектирования, но есть, как минимум, два исключения. Это тесты и тулзы для редактора. Test и Editor – два модуля, которые вполне оправданно хотят трогать другие модули за все доступные и недоступные места. Но как это сделать?
Ответ: атрибут InternalsVisibleTo. Но как его использовать?
Это один из тех моментов, который плохо освещён в документации Unity. Но всё очень просто. Достаточно около asmdef'а создать файл AssemblyInfo.cs и поместить там атрибут InternalsVisibleTo с указанием имён asmdef'ов, для которых должен быть открыт доступ до internal методов и классов.
🔎 Поиск asmdef'ов:
Не все это знают, но в Unity внутри вкладки Project можно отфильтровать все Assembly Definition в проекте через промпт t: asmdef.
—————————————
#gamedev #development #unity #assembly #asmdef #internal #advice #геймдев #разработка #советы