При работе с кодом, который использует несколько сборок или другие сторонние пакеты, вы можете столкнуться с чем-то вроде следующего:

Имя типа или пространства имен «ClassName» не найдено (вам не хватает директивы using или ссылки на сборку?)

Вы пытаетесь использовать intellisense вашей IDE, чтобы придумать использование импорта, но все, что вы получаете, — это варианты создания файла класса, даже если импортированные скрипты находятся прямо здесь. Скрипты были импортированы в порядке, так что же вызвало проблему?

Чтобы поэкспериментировать со ссылками на сборки в чистом небольшом проекте, см. пример на Github.

Работа со сборками в Unity.

Сборки — это наборы типов и ресурсов, созданные для совместной работы и формирующие логическую единицу функциональности. По умолчанию Unity компилирует ваши скрипты в предопределенную сборку, Assembly-CSharp.dll, но для более крупных проектов этот монолитный подход может замедлить время компиляции для итеративных изменений кода. Определяя сборки, вы можете эффективно установить модульность и возможность повторного использования.

Подробнее о сборках читайте в Руководстве по Unity или Документации по .NET.

Таким образом, при импорте другого пакета вы используете их сборку, и на нее нужно ссылаться в сборке вашего кода, чтобы вы действительно могли ее использовать.

Ссылка на другую сборку в вашем коде

Пример проекта, который я вам даю, мал для простоты, но он достаточно хорош, чтобы объяснить концепцию.

Предположим, у нас есть GameplayManager, который управляет общим состоянием игры, включая включение и отключение элементов управления. Затем у нас есть элементы управления движением нашего игрока PlayerController и PlayerWeapons. Чтобы привести пример использования сторонних пакетов Unity, я также ссылаюсь на импортированный проект Asset Store, в данном случае на мой пакет Aim Assist.

Вы, вероятно, уже знакомы с файлами .cs. Файлы определения сборки — это файлы .asmdef. Обратите внимание, как они расположены в каталогах проекта. Файлы кода, находящиеся на том же уровне или в подкаталогах файла определения сборки, принадлежат указанному определению сборки.

Gameplay, Player и сторонний код являются отдельными сборками и автоматически не знают друг о друге.

И PlayerController, и PlayerWeapons зависят от GameplayManager, чтобы сообщить ему, включены ли элементы управления. PlayerWeapons также использует сторонний пакет. Однако, когда вы пытаетесь скомпилировать, вы получаете ошибку отсутствующей ссылки, даже если вы добавите необходимые операторы using. Также настораживает то, что intellisense вашей IDE не выдает предложения классу.

Решение проблемы

Решение на самом деле удивительно простое, если вы знаете, что такое сборки и как они вписываются в проект.

В редакторе Unity найдите файл .asmdef для вашего проигрывателя:

Откройте Инспектор и посмотрите параметры:

Отмеченное поле Ссылки на определение сборки не содержит ссылок на какие-либо другие сборки. В результате все остальные файлы кода внутри этих сборок невидимы для этой сборки. Unity рекомендует использовать GUID для идентификации сборок.

Дважды нажмите маленькую иконку +, чтобы создать два эталонных слота. Затем мы выбираем доступные файлы определения сборки, щелкая маленькую ручку справа от эталонного слота:

Затем в конце нажмите «Применить». Это включало ссылки на ваш файл .asmdef:

Теперь вернитесь в свою IDE и вызовите свои предложения по импорту, и вы должны увидеть всплывающее окно оператора using:

Теперь у вас должно быть красивое и чистое окно консоли Unity, в котором не отображаются ссылки на сборки, и все готово.

Спасибо, что прочитали мою статью, надеюсь, она помогла вам исправить проблемы со ссылками на сборки вашего проекта. Если вам интересно, чем я занимаюсь, загляните в мои социальные сети или в магазин активов. Удачного кодирования!