Unity Package Manager
Перед тем, как мы перейдем к теме статьи, напоминаю всем нашим читателям: прямо сейчас наша команда работает над интересным проектом vkserfing bot. Если вам интересно — следите за новостями в нашем телеграм-канале.
- *nix,
- Unity,
- Разработка игр
- Tutorial
Методы распространения общих ресурсов
Существует больше одного способа использовать общие ресурсы для разных проектов, но у каждого подхода есть свои плюсы и минусы.
1. Дублирование — «руками» дублируем ресурсы между проектами.
- Подходит для всех видов ресурсов.
- Нет проблем с зависимостями.
- Нет проблем с GUID’ами ассетов.
- Гигантские репозитории.
- Нет возможности версионирования.
- Сложность отслеживания изменений в общих ресурсах.
- Сложность обновления общих ресурсов.
2. Git submodules — распространение общих ресурсов через внешние подмодули.
- Можно работать с исходниками.
- Можно распространять ассеты.
- Нет проблем с зависимостями.
- Необходим навык работы с Git.
- Git не очень дружит с бинарными файлами — придется подключать LFS.
- Разграничение доступа для репозиториев.
- Сложности при повышении и понижении версии.
- Возможны коллизии GUID’ов и нет однозначного поведения со стороны Unity для их разрешения.
3. NuGet — распространение общих библиотек через NuGet-пакеты.
- Удобная работа с проектами, не зависящими от Unity.
- Удобное версионирование и разрешение зависимостей.
- Unity не умеет работать с NuGet-пакетами «из коробки» (на GitHub можно найти NuGet Package Manager for Unity, который исправляет это, но есть нюансы).
- Сложности при распространении остальных видов ассетов.
4. Unity Package Manager — распространение общих ресурсов через нативное решение для Unity.
- Нативный интерфейс для работы с пакетами.
- Защита от перезаписи .meta файлов в пакетах при конфликтах GUID’ов.
- Возможность версионирования.
- Возможность распространения всех видов ресурсов для Unity.
- Все еще могут случаться конфликты GUID’ов.
- Нет документации для реализации.
Последний способ имеет больше преимуществ, чем недостатков. Однако он сейчас не очень популярен из-за отсутствия документации, и поэтому мы остановимся на нем подробно.
Unity Package Manager
Unity Package Manager (далее UPM) — инструмент для управления пакетами. Его добавили в Unity 2018.1, и он использовался только для пакетов, которые разрабатывались Unity Technologies. Однако начиная с версии 2018.3 появилась возможность добавления кастомных пакетов.
Интерфейс Unity Package Manager
Пакеты не попадают в исходники проекта (директорию Assets). Они находятся в отдельной директории %projectFolder%/Library/PackageCache и никак на проект не влияют, их единственное упоминание в исходниках — в файле packages/manifest.json .
Пакеты в файловой системе проекта
Источники пакетов
UPM может использовать несколько источников пакетов:
1. Файловая система.
- Скорость реализации.
- Не требует сторонних инструментов.
- Сложность версионирования.
- Необходим общий доступ к файловой системе для всех, кто работает с проектом.
2. Git-репозиторий.
- Нужен только Git-репозиторий.
- Нельзя переключаться между версиями через окно UPM.
- Работает не со всеми Git-репозиториями.
3. npm-репозиторий.
- Полностью поддерживает функционал UPM и используется для распространения официальных пакетов Unity.
- В настоящее время игнорирует все строковые версии пакетов, кроме «-preview».
Ниже мы рассмотрим реализацию UPM + npm. Эта связка удобна, поскольку позволяет работать с любыми видами ресурсов и управлять версиями пакетов, а также полностью поддерживает нативный интерфейс UPM.
В качестве npm-репозитория можно использовать Verdaccio. К нему есть подробная документация, и для его запуска потребуется буквально пара команд.
Настройка окружения
Для начала нужно установить node.js.
Создание пакета
Чтобы создать пакет, необходимо поместить файл package.json , который будет его описывать, в директорию с содержимым этого пакета. Нужно сделать следующее:
Перейти в директорию проекта, которую хотим сделать пакетом.
Выполнить команду npm init и во время диалога ввести необходимые значения. Для name указываем имя в формате реверс домена, например com.plarium.somepackage.
Для удобного отображения имени пакета — добавить свойство displayName в package.json и заполнить его.
Так как npm js-ориентирован, в файле есть не нужные нам свойства main и scripts, которые Unity не использует. Лучше их удалить, чтобы не засорять описание пакета. Файл должен выглядеть примерно так:
- Перейти в директорию проекта, которую хотим сделать пакетом.
- Выполнить команду npm init и во время диалога ввести необходимые значения. Для name указываем имя в формате реверс домена, например com.plarium.somepackage.
- Для удобного отображения имени пакета — добавить свойство displayName в package.json и заполнить его.
- Так как npm js-ориентирован, в файле есть не нужные нам свойства main и scripts, которые Unity не использует. Лучше их удалить, чтобы не засорять описание пакета. Файл должен выглядеть примерно так:
Отправка пакета
Для отправки пакета необходимо выполнить команду: npm publish —registry *адрес до хранилища пакетов* .
Установка и обновление пакетов через Unity Package Manager
Чтобы добавить пакет в Unity-проект, нужно:
- Внести в файл manifest.json информацию об источнике пакетов. Для этого необходимо добавить свойство scopedRegistries и указать скоупы и адрес источника, по которому будут искаться конкретные скоупы.
- Перейти в Unity и открыть окно Package Manager’а (работа с кастомными пакетами не отличается от работы со встроенными).
- Выбрать All Packages.
- Найти нужный пакет и добавить его.
Работа с исходниками и отладка
Чтобы исходники подключились к проекту, необходимо создать Assembly Definition для пакета.
Использование пакетов не ограничивает возможности для отладки. Однако при работе с пакетами в Unity нельзя перейти в IDE по клику на ошибку в консоли, если ошибка произошла в пакете. Это связано с тем, что Unity не видит скрипты как отдельные файлы, поскольку при использовании Assembly Definition они собираются в библиотеку и подключаются к проекту. При работе с исходниками из проекта переход в IDE по клику доступен.
Скрипт в проекте с подключенным пакетом:
Скрипт из пакета с работающим брейкпоинтом:
Срочное внесение исправлений в пакеты
Добавленные в проект пакеты Unity открыты только для чтения, но их можно редактировать в кэше пакетов. Для этого необходимо:
- Перейти в пакет в кэше пакетов.
Конфликты импорта пакетов
При импорте пакетов могут произойти следующие конфликты GUID’ов:
- Пакет — пакет. Если при импорте пакета обнаружится, что в уже добавленных пакетах есть ассеты с таким же GUID’ом, ассеты с совпавшими GUID’ами из импортируемого пакета не добавятся в проект.
- Пакет — проект. Если при импорте пакета обнаружится, что в проекте есть ассеты с совпадающими GUID’ами, то ассеты из пакета не добавятся в проект. Однако ассеты, зависящие от них, начнут использовать ассеты из проекта.
Перенос ассетов из проекта в пакет
Если перенести ассет из проекта в пакет при открытой Unity, то его функциональность сохранится, а ссылки в зависимых ассетах начнут использовать ассет из пакета.
Важно: при копировании ассета из проекта в пакет произойдет конфликт «Пакет — проект», описанный в разделе выше.
Возможные решения конфликтов
- Переназначение GUID’ов по собственным алгоритмам при импорте всех ассетов, чтобы исключить коллизии.
- Добавление всех ассетов в один проект с их последующим разделением на пакеты.
- Создание базы данных, содержащей GUID’ы всех ассетов, и проведение валидации при отправке пакетов.
Заключение
UPM — новое решение для распространения общих ресурсов на Unity, которое может стать достойной альтернативой существующим методам. Рекомендации, описанные в статье, возникли на основе реальных кейсов. Надеемся, они вам пригодятся.
Package Manager window
Use the Unity Package Manager (in Unity’s top menu: Window > Package Manager) to view which packages and feature sets are available for installation or already installed in your project. In addition, you can use this window to see which versions are available, and install, remove, disable, or update packages and feature sets for each project.
The Package Manager window
The Package Manager window displays:
(A) The experimental package indicator, which warns you if your project contains experimental packages.
(B) The add button, which you can click to install a package directly into your project by entering a git URL, a local path, or a package name.
(C) The Packages drop-down menu, which you can use to change what appears in the list (context).
(D) The Sort drop-down menu, which lets you sort the list of packages and feature sets by name or date.
For Asset Store A growing library of free and commercial assets created by Unity and members of the community. Offers a wide variety of assets, from textures, models and animations to whole project examples, tutorials and Editor extensions. More info
See in Glossary packages, two additional controls give you some additional filtering options:
The Filters drop-down menu and the Clear Filters button allow you to narrow down which Asset Store packages appear in the list
(E) Advanced settings , which you can use to access the project settings A broad collection of settings which allow you to configure how Physics, Audio, Networking, Graphics, Input and many other areas of your project behave. More info
See in Glossary for the Package Manager or reset your project’s packages and feature sets to default.
(F) The search box, which you can use to look for packages and feature sets by name.
(G) The list view, which displays all packages that match the filter and search parameters you specify.
(H) The detail view, which displays information specific to the feature set or package A container that stores various types of features and assets for Unity, including Editor or Runtime tools and libraries, Asset collections, and project templates. Packages are self-contained units that the Unity Package Manager can share across Unity projects. Most of the time these are called packages, but occasionally they are called Unity Package Manager (UPM) packages. More info
See in Glossary selected in the list. For example, if a feature set is selected, the information specific to the feature set appears, including which packages it contains.
(I) The status bar, which displays information when Package Manager loads packages and feature sets. This includes errors and warning messages, the number of Asset Store packages available, and a link to load more Asset Store packages.
(J) The reload drop-down menu, which lets you force Package Manager to reload or resolve the packages in your project.
(K) Buttons to perform any of the following actions at the project level:
Advanced settings
The advanced settings drop-down menu allows you to perform these actions:
Status bar
The Package Manager displays messages in the status bar at the bottom left of the Package Manager window.
There are typically four status messages that you might see:
The first time you open the Package Manager window in a new project, the Refreshing packages message appears briefly:
Loading packages message
This message also appears when you select Refresh list from the reload drop-down menu.
When you are using the My Assets context, the load bar appears above the date. It displays the number of Asset Store packages and a Load link:
Most of the time the status bar displays the date and time of when the Package Manager window last refreshed its information. However, if the Package Manager detects a problem, such as a missing network connection, the Package Manager displays an error in the status bar:
If your network connection is working, but you are not signed into your Unity account, the Package Manager doesn’t display any Asset Store packages. When you try to use the My Assets context, the Package Manager displays an error in the status bar:
Logged out of Unity account
In the list view, click the Sign in button to sign into your Unity account through the Unity Hub.
For information on how to resolve these errors and more, see Error messages.
Unity Package Manager
Unity — платформа, которая существует довольно давно и постоянно развивается. Однако, работая в ней с несколькими проектами одновременно, все еще можно столкнуться со сложностями в использовании общих исходников (.cs), библиотек (.dll) и остальных ассетов (изображения, звуки, модели, префабы). В этой статье мы расскажем о нашем опыте работы с нативным решением такой проблемы для Unity.
Методы распространения общих ресурсов
Существует больше одного способа использовать общие ресурсы для разных проектов, но у каждого подхода есть свои плюсы и минусы.
1. Дублирование — «руками» дублируем ресурсы между проектами.
- Подходит для всех видов ресурсов.
- Нет проблем с зависимостями.
- Нет проблем с GUID’ами ассетов.
- Гигантские репозитории.
- Нет возможности версионирования.
- Сложность отслеживания изменений в общих ресурсах.
- Сложность обновления общих ресурсов.
- Можно работать с исходниками.
- Можно распространять ассеты.
- Нет проблем с зависимостями.
- Необходим навык работы с Git.
- Git не очень дружит с бинарными файлами — придется подключать LFS.
- Разграничение доступа для репозиториев.
- Сложности при повышении и понижении версии.
- Возможны коллизии GUID’ов и нет однозначного поведения со стороны Unity для их разрешения.
- Удобная работа с проектами, не зависящими от Unity.
- Удобное версионирование и разрешение зависимостей.
- Unity не умеет работать с NuGet-пакетами «из коробки» (на GitHub можно найти NuGet Package Manager for Unity, который исправляет это, но есть нюансы).
- Сложности при распространении остальных видов ассетов.
- Нативный интерфейс для работы с пакетами.
- Защита от перезаписи .meta файлов в пакетах при конфликтах GUID’ов.
- Возможность версионирования.
- Возможность распространения всех видов ресурсов для Unity.
- Все еще могут случаться конфликты GUID’ов.
- Нет документации для реализации.
Unity Package Manager
Unity Package Manager (далее UPM) — инструмент для управления пакетами. Его добавили в Unity 2018.1, и он использовался только для пакетов, которые разрабатывались Unity Technologies. Однако начиная с версии 2018.3 появилась возможность добавления кастомных пакетов.
Интерфейс Unity Package Manager
Пакеты не попадают в исходники проекта (директорию Assets). Они находятся в отдельной директории %projectFolder%/Library/PackageCache и никак на проект не влияют, их единственное упоминание в исходниках — в файле packages/manifest.json .
Пакеты в файловой системе проекта
Источники пакетов
UPM может использовать несколько источников пакетов:
1. Файловая система.
- Скорость реализации.
- Не требует сторонних инструментов.
- Сложность версионирования.
- Необходим общий доступ к файловой системе для всех, кто работает с проектом.
- Нужен только Git-репозиторий.
- Нельзя переключаться между версиями через окно UPM.
- Работает не со всеми Git-репозиториями.
- Полностью поддерживает функционал UPM и используется для распространения официальных пакетов Unity.
- В настоящее время игнорирует все строковые версии пакетов, кроме «-preview».
В качестве npm-репозитория можно использовать Verdaccio. К нему есть подробная документация, и для его запуска потребуется буквально пара команд.
Настройка окружения
Для начала нужно установить node.js.
Создание пакета
Чтобы создать пакет, необходимо поместить файл package.json , который будет его описывать, в директорию с содержимым этого пакета. Нужно сделать следующее:
- Перейти в директорию проекта, которую хотим сделать пакетом.
- Выполнить команду npm init и во время диалога ввести необходимые значения. Для name указываем имя в формате реверс домена, например com.plarium.somepackage .
- Для удобного отображения имени пакета — добавить свойство displayName в package.json и заполнить его.
- Так как npm js-ориентирован, в файле есть не нужные нам свойства main и scripts , которые Unity не использует. Лучше их удалить, чтобы не засорять описание пакета. Файл должен выглядеть примерно так:
Отправка пакета
Для отправки пакета необходимо выполнить команду: npm publish —registry *адрес до хранилища пакетов* .
Установка и обновление пакетов через Unity Package Manager
Чтобы добавить пакет в Unity-проект, нужно:
- Внести в файл manifest.json информацию об источнике пакетов. Для этого необходимо добавить свойство scopedRegistries и указать скоупы и адрес источника, по которому будут искаться конкретные скоупы.
Работа с исходниками и отладка
Чтобы исходники подключились к проекту, необходимо создать Assembly Definition для пакета.
Использование пакетов не ограничивает возможности для отладки. Однако при работе с пакетами в Unity нельзя перейти в IDE по клику на ошибку в консоли, если ошибка произошла в пакете. Это связано с тем, что Unity не видит скрипты как отдельные файлы, поскольку при использовании Assembly Definition они собираются в библиотеку и подключаются к проекту. При работе с исходниками из проекта переход в IDE по клику доступен.
Скрипт в проекте с подключенным пакетом:
Скрипт из пакета с работающим брейкпоинтом:
Срочное внесение исправлений в пакеты
Добавленные в проект пакеты Unity открыты только для чтения, но их можно редактировать в кэше пакетов. Для этого необходимо:
- Перейти в пакет в кэше пакетов.
Конфликты импорта пакетов
При импорте пакетов могут произойти следующие конфликты GUID’ов:
- Пакет — пакет. Если при импорте пакета обнаружится, что в уже добавленных пакетах есть ассеты с таким же GUID’ом, ассеты с совпавшими GUID’ами из импортируемого пакета не добавятся в проект.
- Пакет — проект. Если при импорте пакета обнаружится, что в проекте есть ассеты с совпадающими GUID’ами, то ассеты из пакета не добавятся в проект. Однако ассеты, зависящие от них, начнут использовать ассеты из проекта.
Перенос ассетов из проекта в пакет
Если перенести ассет из проекта в пакет при открытой Unity, то его функциональность сохранится, а ссылки в зависимых ассетах начнут использовать ассет из пакета.
Важно: при копировании ассета из проекта в пакет произойдет конфликт «Пакет — проект», описанный в разделе выше.
Менеджер пакетов Unity
Пакет – это контейнер, в котором хранятся различные типы функций или ресурсов, например:
- Инструменты и библиотеки для редактирования, такие как текстовый редактор, средство просмотра анимации или тестовые среды.
- Инструменты и библиотеки среды выполнения, такие как Physics API или конвейер графики.
- Коллекции объектов, например текстуры или анимации.
- Шаблоны проектов для обмена общими типами проектов с другими.
Пакеты предоставляют широкий спектр улучшений для Unity с помощью диспетчера пакетов. В редакторе вы можете получить доступ к окну диспетчера пакетов через это меню: Window > Package Manager.
Примечание. Диспетчер пакетов также поддерживает просмотр любых пакетов Asset Store, которые вы уже загрузили или импортировали из Unity Магазин ресурсов Расширяющаяся библиотека бесплатных и коммерческих ресурсов, созданных Unity и членами сообщества. Предлагает широкий спектр ресурсов, от текстур, моделей и анимации до целых примеров проектов, руководств и расширений редактора. Подробнее
См. в Словарь .
Как Unity работает с пакетами
Когда Unity открывает проект, диспетчер пакетов Unity читает манифест проекта Каждый проект Unity имеет манифест проекта, который действует как точка входа для диспетчера пакетов. Этот файл должен находиться в каталоге
/Packages . Диспетчер пакетов использует его для настройки многих вещей, включая список зависимостей для этого проекта, а также любой репозиторий пакетов для запроса пакетов. Подробнее
См. Словарь (1), чтобы понять какие пакеты загружать в Project. Затем он отправляет запрос (2) на сервер реестра пакетов (3) для каждого пакета, который отображается как зависимость
См. в Словарь в манифесте. Затем реестр пакетов отправляет запрошенную информацию и данные обратно диспетчеру пакетов (4), который затем устанавливает эти пакеты (5) в проект. У каждого проекта есть собственный манифест, в котором перечислены пакеты для загрузки в качестве «зависимостей» проекта.
Как менеджер пакетов Unity устанавливает пакеты
Если вы хотите включить пакет в свой проект, вы должны обновить манифест проекта, чтобы включить его в список зависимостей. Если вы хотите, вы можете изменить манифест проекта напрямую, но безопаснее и проще позволить это сделать диспетчеру пакетов. Дополнительные сведения об использовании пользовательского интерфейса см. в документации к окну диспетчера пакетов.
Как использовать диспетчер пакетов
Диспетчер пакетов использует три интерфейса для связи с пользователями, манифестами и реестрами: