Unity Package Manager

Unity - платформа, якая існуе даўнавата і ўвесь час развіваецца. Аднак, працуючы ў ёй з некалькімі праектамі адначасова, усё яшчэ можна сутыкнуцца са складанасцямі ў выкарыстанні агульных зыходнікаў (.cs), бібліятэк (.dll) і астатніх ассетаў (малюнкі, гукі, мадэлі, прэфабы). У гэтым артыкуле мы распавядзем аб нашым досведзе працы з натыўным рашэннем такой праблемы для Unity.

Unity Package Manager

Метады распаўсюджвання агульных рэсурсаў

Існуе больш за адзін спосаб выкарыстаць агульныя рэсурсы для розных праектаў, але ў кожнага падыходу ёсць свае плюсы і мінусы.

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
Інтэрфейс Unity Package Manager

Пакеты не трапляюць у зыходнікі праекту (дырэкторыю Assets). Яны знаходзяцца ў асобнай дырэкторыі %projectFolder%/Library/PackageCache і ніяк на праект не ўплываюць, іх адзіная згадка ў зыходніках - у файле packages/manifest.json.

Unity Package Manager
Пакеты ў файлавай сістэме праекта

Крыніцы пакетаў

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 не выкарыстае. Лепш іх выдаліць, каб не засмечваць апісанне пакета. Файл павінен выглядаць прыкладна так:

  1. Перайсці ў дырэкторыю праекта, якую жадаем зрабіць пакетам.
  2. Выканаць каманду npm init і падчас дыялогу ўвесці неабходныя значэнні. Для name паказваем імя ў фармаце рэверс дамена, напрыклад com.plarium.somepackage.
  3. Для зручнага адлюстравання імя пакета - дадаць уласцівасць displayName у package.json і запоўніць яго.
  4. Бо 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"
    }

  5. Адкрыць Unity і згенераваць .meta файл для package.json (Unity не бачыць асеты без .meta файлаў, пакеты для Unity адчыняюцца толькі для чытання).

Адпраўка пакета

Для адпраўкі пакета неабходна выканаць каманду: npm publish --registry *адрес до хранилища пакетов*.

Усталяванне і абнаўленне пакетаў праз Unity Package Manager

Каб дадаць пакет у Unity-праект, трэба:

  1. Унесці ў файл manifest.json інфармацыю аб крыніцы пакетаў. Для гэтага неабходна дадаць уласцівасць scopedRegistries і ўказаць скоўпы і адрас крыніцы, па якой будуць шукацца канкрэтныя скоўпы.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Перайсці ў Unity і адкрыць акно Package Manager'а (праца з кастамнымі пакетамі не адрозніваецца ад працы са ўбудаванымі).
  3. Выбраць All Packages.
  4. Знайсці патрэбны пакет і дадаць яго.

Unity Package Manager

Праца з зыходнікамі і адладка

Каб зыходнікі падключыліся да праекту, неабходна стварыць Assembly Definition для пакета.

Выкарыстанне пакетаў не абмяжоўвае магчымасці для адладкі. Аднак пры працы з пакетамі ў Unity нельга перайсці ў IDE па зграі на памылку ў кансолі, калі памылка адбылася ў пакеце. Гэта злучана з тым, што Unity не бачыць скрыпты як асобныя файлы, паколькі пры выкарыстанні Assembly Definition яны збіраюцца ў бібліятэку і падлучаюцца да праекту. Пры працы з зыходнікамі з праекту пераход у IDE па кліку даступны.

Скрыпт у праекце з падключаным пакетам:

Unity Package Manager
Скрыпт з пакета з працуючым брэйкпоінтам:

Unity Package Manager

Тэрміновае занясенне выпраўленняў у пакеты

Дададзеныя ў праект пакеты Unity адчыненыя толькі для чытання, але іх можна рэдагаваць у кэшы пакетаў. Для гэтага неабходна:

  1. Перайсці ў пакет у кэшы пакетаў.

    Unity Package Manager

  2. Унесці неабходныя змены.
  3. Абнавіць версію ў файле package.json.
  4. Адправіць пакет npm publish --registry *адрес до хранилища пакетов*.
  5. Абнавіць версію пакета да выпраўленай праз інтэрфейс UPM.

Канфлікты імпарту пакетаў

Пры імпарце пакетаў могуць адбыцца наступныя канфлікты GUID'аў:

  1. Пакет - пакет. Калі пры імпарце пакета выявіцца, што ва ўжо дададзеных пакетах ёсць асеты з такім жа GUID'ом, асеты з супалымі GUID'амі з імпартаванага пакета не дададуцца ў праект.
  2. Пакет - праект. Калі пры імпарце пакета выявіцца, што ў праекце ёсць асеты з супадальнымі GUID'амі, то асеты з пакета не дададуцца ў праект. Аднак асеты, якія залежаць ад іх, пачнуць выкарыстоўваць асеты з праекту.

Перанос асэтаў з праекту ў пакет

Калі перанесці асет з праекту ў пакет пры адчыненай Unity, тое яго функцыянальнасць захаваецца, а спасылкі ў залежных асетах пачнуць выкарыстоўваць асет з пакета.

Важна: пры капіяванні асета з праекта ў пакет адбудзецца канфлікт "Пакет - праект", апісаны ў раздзеле вышэй.

Магчымыя рашэнні канфліктаў

  1. Перапрызначэнне GUID'аў па ўласных алгарытмах пры імпарце ўсіх асэтаў, каб выключыць калізіі.
  2. Даданне ўсіх асэтаў у адзін праект з іх наступным падзелам на пакеты.
  3. Стварэнне базы дадзеных, утрымоўвальнай GUID'ы ўсіх ассетаў, і правядзенне валідацыі пры адпраўцы пакетаў.

Заключэнне

UPM - новае рашэнне для распаўсюджвання агульных рэсурсаў на Unity, якое можа стаць годнай альтэрнатывай існуючым метадам. Рэкамендацыі, апісаныя ў артыкуле, узніклі на аснове рэальных кейсаў. Спадзяемся, яны вам спатрэбяцца.

Крыніца: habr.com

Дадаць каментар