Unity - платформа, якая існуе даўнавата і ўвесь час развіваецца. Аднак, працуючы ў ёй з некалькімі праектамі адначасова, усё яшчэ можна сутыкнуцца са складанасцямі ў выкарыстанні агульных зыходнікаў (.cs), бібліятэк (.dll) і астатніх ассетаў (малюнкі, гукі, мадэлі, прэфабы). У гэтым артыкуле мы распавядзем аб нашым досведзе працы з натыўным рашэннем такой праблемы для Unity.
Метады распаўсюджвання агульных рэсурсаў
Існуе больш за адзін спосаб выкарыстаць агульныя рэсурсы для розных праектаў, але ў кожнага падыходу ёсць свае плюсы і мінусы.
1. Дубляванне - "рукамі" дублюем рэсурсы паміж праектамі.
Плюсы:
- Падыходзіць для ўсіх відаў рэсурсаў.
- Няма праблем з залежнасцямі.
- Няма праблем з GUID'амі ассетаў.
Мінусы:
- Гіганцкія рэпазітары.
- Няма магчымасці версіянавання.
- Складанасць адсочвання змен у агульных рэсурсах.
- Складанасць абнаўлення агульных рэсурсаў.
2.
Плюсы:
- Можна працаваць з зыходнікамі.
- Можна распаўсюджваць асеты.
- Няма праблем з залежнасцямі.
Мінусы:
- Неабходны навык працы з 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-рэпазітара можна выкарыстоўваць
Настройка асяроддзя
Для пачатку трэба ўсталяваць
Стварэнне пакета
Каб стварыць пакет, неабходна змясціць файл 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 не выкарыстае. Лепш іх выдаліць, каб не засмечваць апісанне пакета. Файл павінен выглядаць прыкладна так:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- Адкрыць Unity і згенераваць .meta файл для package.json (Unity не бачыць асеты без .meta файлаў, пакеты для Unity адчыняюцца толькі для чытання).
Адпраўка пакета
Для адпраўкі пакета неабходна выканаць каманду: npm publish --registry *адрес до хранилища пакетов*
.
Усталяванне і абнаўленне пакетаў праз Unity Package Manager
Каб дадаць пакет у Unity-праект, трэба:
- Унесці ў файл
manifest.json
інфармацыю аб крыніцы пакетаў. Для гэтага неабходна дадаць уласцівасцьscopedRegistries
і ўказаць скоўпы і адрас крыніцы, па якой будуць шукацца канкрэтныя скоўпы."scopedRegistries": [ { "name": "Main", "url": "адрес до хранилища пакетов", "scopes": [ "com.plarium" ] } ]
- Перайсці ў Unity і адкрыць акно Package Manager'а (праца з кастамнымі пакетамі не адрозніваецца ад працы са ўбудаванымі).
- Выбраць All Packages.
- Знайсці патрэбны пакет і дадаць яго.
Праца з зыходнікамі і адладка
Каб зыходнікі падключыліся да праекту, неабходна стварыць
Выкарыстанне пакетаў не абмяжоўвае магчымасці для адладкі. Аднак пры працы з пакетамі ў Unity нельга перайсці ў IDE па зграі на памылку ў кансолі, калі памылка адбылася ў пакеце. Гэта злучана з тым, што Unity не бачыць скрыпты як асобныя файлы, паколькі пры выкарыстанні Assembly Definition яны збіраюцца ў бібліятэку і падлучаюцца да праекту. Пры працы з зыходнікамі з праекту пераход у IDE па кліку даступны.
Скрыпт у праекце з падключаным пакетам:
Скрыпт з пакета з працуючым брэйкпоінтам:
Тэрміновае занясенне выпраўленняў у пакеты
Дададзеныя ў праект пакеты Unity адчыненыя толькі для чытання, але іх можна рэдагаваць у кэшы пакетаў. Для гэтага неабходна:
- Перайсці ў пакет у кэшы пакетаў.
- Унесці неабходныя змены.
- Абнавіць версію ў файле
package.json
. - Адправіць пакет
npm publish --registry *адрес до хранилища пакетов*
. - Абнавіць версію пакета да выпраўленай праз інтэрфейс UPM.
Канфлікты імпарту пакетаў
Пры імпарце пакетаў могуць адбыцца наступныя канфлікты GUID'аў:
- Пакет - пакет. Калі пры імпарце пакета выявіцца, што ва ўжо дададзеных пакетах ёсць асеты з такім жа GUID'ом, асеты з супалымі GUID'амі з імпартаванага пакета не дададуцца ў праект.
- Пакет - праект. Калі пры імпарце пакета выявіцца, што ў праекце ёсць асеты з супадальнымі GUID'амі, то асеты з пакета не дададуцца ў праект. Аднак асеты, якія залежаць ад іх, пачнуць выкарыстоўваць асеты з праекту.
Перанос асэтаў з праекту ў пакет
Калі перанесці асет з праекту ў пакет пры адчыненай Unity, тое яго функцыянальнасць захаваецца, а спасылкі ў залежных асетах пачнуць выкарыстоўваць асет з пакета.
Важна: пры капіяванні асета з праекта ў пакет адбудзецца канфлікт "Пакет - праект", апісаны ў раздзеле вышэй.
Магчымыя рашэнні канфліктаў
- Перапрызначэнне GUID'аў па ўласных алгарытмах пры імпарце ўсіх асэтаў, каб выключыць калізіі.
- Даданне ўсіх асэтаў у адзін праект з іх наступным падзелам на пакеты.
- Стварэнне базы дадзеных, утрымоўвальнай GUID'ы ўсіх ассетаў, і правядзенне валідацыі пры адпраўцы пакетаў.
Заключэнне
UPM - новае рашэнне для распаўсюджвання агульных рэсурсаў на Unity, якое можа стаць годнай альтэрнатывай існуючым метадам. Рэкамендацыі, апісаныя ў артыкуле, узніклі на аснове рэальных кейсаў. Спадзяемся, яны вам спатрэбяцца.
Крыніца: habr.com