Unity — platforma, která existuje již poměrně dlouho a neustále se vyvíjí. Nicméně, při práci na několika projektech současně se stále můžete setkat s obtížemi při používání sdílených zdrojových kódů (.cs), knihoven (.dll) a ostatních assetů (obrázky, zvuky, modely, prefaby). V tomto článku se podělíme o naše zkušenosti s nativním řešením této situace pro Unity.

Metody šíření sdílených zdrojů
Existuje více než jeden způsob, jak využívat sdílené zdroje pro různé projekty, ale každý přístup má své výhody a nevýhody.
1. Duplikace — ručně duplicujeme zdroje mezi projekty.
Plusy:
- Vhodné pro všechny typy zdrojů.
- Žádné problémy se závislostmi.
- Žádné problémy s GUIDy assetů.
Nevýhody:
- Obrovské repozitáře.
- Žádná možnost verzování.
- Obtížnost sledování změn ve sdílených zdrojích.
- Obtížnost aktualizace sdílených zdrojů.
2. — distribuce sdílených zdrojů prostřednictvím externích podmodulů.
Plusy:
- Lze pracovat se zdrojovými kódy.
- Lze šířit assety.
- Žádné problémy se závislostmi.
Nevýhody:
- Je vyžadována dovednost práce s Gitem.
- Git se moc nepřátelí s binárními soubory — bude nutné zapnout LFS.
- Dělení přístupu pro repozitáře.
- Obtíže při zvyšování a snižování verze.
- Mohou nastat kolize GUIDů a Unity nemá jednoznačné chování pro jejich řešení.
3. NuGet — distribuce sdílených knihoven prostřednictvím NuGet balíčků.
Plusy:
- Pohodlná práce s projekty, které nezávisí na Unity.
- Pohodlné verzování a řešení závislostí.
Nevýhody:
- Unity neumí pracovat s NuGet balíčky "out of the box" (na GitHubu lze nalézt NuGet Package Manager for Unity, který to opravuje, ale jsou tam určité nuance).
- Obtížnost při distribuci ostatních typů assetů.
4. Unity Package Manager — distribuce sdílených zdrojů prostřednictvím nativního řešení pro Unity.
Plusy:
- Nativní rozhraní pro práci s balíčky.
- Ochrana před přepsáním .meta souborů v balíčcích při kolizích GUIDů.
- Možnost verzování.
- Možnost distribuce všech typů zdrojů pro Unity.
Nevýhody:
- Stále mohou nastat kolize GUIDů.
- Žádná dokumentace pro implementaci.
Poslední způsob má více výhod než nevýhod. Nicméně, v současné době není příliš populární kvůli nedostatku dokumentace, a proto se na něj podrobněji zaměříme.
Unity Package Manager
Unity Package Manager (dále UPM) je nástroj pro správu balíčků. Byl přidán do Unity 2018.1 a byl využíván pouze pro balíčky vyvíjené Unity Technologies. Od verze 2018.3 je však možné přidávat vlastní balíčky.

Rozhraní Unity Package Manager
Balíčky se nedostanou do zdrojových kódů projektu (adresář Assets). Nacházejí se v samostatném adresáři. %projectFolder%/Library/PackageCache a nijak neovlivňují projekt, jejich jediné zmínění ve zdrojích je v souboru packages/manifest.json.

Balíčky v souborovém systému projektu
Zdroje balíčků
UPM může využívat několik zdrojů balíčků:
1. Souborový systém.
Plusy:
- Rychlost realizace.
- Nepotřebuje žádné externí nástroje.
Nevýhody:
- Složitost verzování.
- Je třeba mít společný přístup k souborovému systému pro všechny, kdo pracují na projektu.
2. Git repozitář.
Plusy:
- Je třeba mít pouze Git repozitář.
Nevýhody:
- Není možné přepínat mezi verzemi přes okno UPM.
- Nepracuje se všemi Git repozitáři.
3. npm repozitář.
Plusy:
- Plně podporuje funkčnost UPM a používá se k distribuci oficiálních balíčků Unity.
Nevýhody:
- V současnosti ignoruje všechny řetězcové verze balíčků kromě „-preview“.
Níže se podíváme na implementaci UPM + npm. Tato kombinace je pohodlná, protože umožňuje pracovat se všemi druhy zdrojů a spravovat verze balíčků, a také plně podporuje nativní rozhraní UPM.
Jako npm repozitář můžeme použít . K tomu existuje podrobná , a k jeho spuštění bude potřebovat doslova pár příkazů.
Nastavení prostředí
Nejprve je potřeba nainstalovat .
Vytvoření balíčku
Abychom vytvořili balíček, je nutné umístit soubor package.json, který jej bude popisovat, do adresáře se obsahem tohoto balíčku. Je potřeba provést následující:
Přejděte do adresáře projektu, který chceme udělat balíčkem.
Spusťte příkaz npm init a během dialogu zadejte potřebné hodnoty. Pro name uveďte jméno ve formátu reverzní domény, například com.plarium.somepackage.
Pro pohodlné zobrazení jména balíčku – přidejte vlastnost displayName do package.json a vyplňte ji.
Jelikož je npm orientovaný na js, v souboru jsou pro nás nepotřebné vlastnosti main a scripts, které Unity nepoužívá. Je lepší je odstranit, abychom nezaplnili popis balíčku. Soubor by měl vypadat přibližně takto:
- Přejděte do adresáře projektu, který chceme udělat balíčkem.
- Spusťte příkaz npm init a během dialogu zadejte potřebné hodnoty. Pro name uveďte jméno ve formátu reverzní domény, například com.plarium.somepackage.
- Pro pohodlné zobrazení jména balíčku – přidejte vlastnost displayName do package.json a vyplňte ji.
- Jelikož je npm orientovaný na js, v souboru jsou pro nás nepotřebné vlastnosti main a scripts, které Unity nepoužívá. Je lepší je odstranit, abychom nezaplnili popis balíčku. Soubor by měl vypadat přibližně takto:
{ "name": "com.plarium.somepackage", "displayName": "Nějaký balíček", "version": "1.0.0", "description": "Popis nějakého balíčku", "keywords": [ "Unity", "UPM" ], "author": "AUTOR", "license": "NEOPRÁVNĚNÉ" } - Otevřete Unity a vygenerujte soubor .meta pro package.json (Unity nevidí assety bez .meta souborů, balíčky pro Unity se otevírají pouze pro čtení).
Odeslat balíček
Pro odeslání balíčku je potřeba provést příkaz: npm publish --registry *adresa k úložišti balíčků*.
Instalace a aktualizace balíčků přes Unity Package Manager
Aby bylo možné přidat balíček do projektu Unity, je třeba:
- Upravit soubor
manifest.jsoninformace o zdrojích balíčků. K tomu je nutné přidat vlastnostscopedRegistriesa uvést scope a adresu zdroje, podle kterého budou hledány konkrétní scopy."scopedRegistries": [ { "name": "Hlavní", "url": "adresa k úložišti balíčků", "scopes": [ "com.plarium" ] } ] - Přejděte do Unity a otevřete okno Správce balíčků (práce s vlastními balíčky se neliší od práce se zabudovanými).
- Vyberte Všechny balíčky.
- Najděte požadovaný balíček a přidejte ho.

Práce se zdrojovými kódy a ladění
Aby se zdroje připojily k projektu, je nutné vytvořit pro balíček.
Použití balíčků neomezuje možnosti ladění. Při práci s balíčky v Unity však není možné přejít do IDE kliknutím na chybu v konzoli, pokud k chybě došlo v balíčku. Je to dáno tím, že Unity nevidí skripty jako samostatné soubory, protože při použití Assembly Definition jsou shromažďovány do knihovny a připojovány k projektu. Při práci se zdrojovými kódy z projektu je možné přejít do IDE kliknutím.
Skript v projektu s připojeným balíčkem:

Skript z balíčku s funkčním záchytem:

Okamžité provedení oprav v balíčcích
Přidané balíčky Unity v projektu jsou pouze pro čtení, ale je možné je upravovat v mezipaměti balíčků. K tomu je třeba:
- Přejděte k balíčku v mezipaměti balíčků.

- Proveďte potřebné změny.
- Aktualizujte verzi v souboru
package.json. - Odešlete balíček
npm publish --registry *adresa k úložišti balíčků*. - Aktualizujte verzi balíčku na opravenou prostřednictvím rozhraní UPM.
Konflikty při importu balíčků
Při importu balíčků mohou nastat následující konflikty GUID:
- Balíček - balíček. Pokud při importu balíčku zjistíte, že v již přidaných balíčcích jsou assety se stejným GUID, assety s shodnými GUID z importovaného balíčku nebudou přidány do projektu.
- Balíček je projekt. Pokud se během importu balíčku zjistí, že v projektu jsou assety se shodnými GUID, assety z balíčku se do projektu nepřidají. Nicméně assety, které na ně závisí, začnou používat assety z projektu.
Přenos assetů z projektu do balíčku
Pokud přenesete asset z projektu do balíčku při otevřeném Unity, jeho funkcionalita zůstane zachována, a odkazy v závislých assetech začnou používat asset z balíčku.
Je důležité: při kopírování assetu z projektu do balíčku dojde ke konfliktu "Balíček — projekt", jak je popsáno v předchozí části.
Možná řešení konfliktů
- Přečíslování GUID podle vlastních algoritmů při importu všech assetů, aby se vyloučily kolize.
- Přidání všech assetů do jednoho projektu a jejich následné rozdělení na balíčky.
- Vytvoření databáze obsahující GUID všech assetů a provádění validace při odesílání balíčků.
Závěr
UPM je nové řešení pro distribuci sdílených zdrojů v Unity, které může být cennou alternativou k existujícím metodám. Doporučení uvedená v článku vznikla na základě skutečných případů. Doufáme, že vám budou užitečná.
Zdroj: habr.com

