Unity — platforma, ki obstaja že dolgo časa in se nenehno razvija. Vendar pa se, ko delate na več projektih hkrati, še vedno lahko srečate z izzivi pri uporabi skupnih izvorov (.cs), knjižnic (.dll) in drugih sredstev (slike, zvoki, modeli, prednastavitve). V tem članku bomo delili naše izkušnje z uporabo nativne rešitve za to težavo v Unity.

Metode distribucije skupnih virov
Obstaja več načinov za uporabo skupnih virov za različne projekte, vendar ima vsak pristop svoje prednosti in slabosti.
1. Podvzgledovanje — ročno podvajanje virov med projekti.
Prednosti:
- Primerno za vse vrste virov.
- Brez težav z odvisnostmi.
- Brez težav z GUID-ji sredstev.
Mane:
- Ogromna repozitorija.
- Brez možnosti verzioniranja.
- Težave pri sledenju spremembam v skupnih virih.
- Težave pri posodabljanju skupnih virov.
2. — distribucija skupnih virov preko zunanjih podmodulov.
Prednosti:
- Lahko delate z izvorno kodo.
- Lahko distribuirate sredstva.
- Brez težav z odvisnostmi.
Mane:
- Potrebna je znanje o delu z Git.
- Git ni posebej prijazen z binarnimi datotekami — potrebno je vključiti LFS.
- Ločevanje dostopa do repozitorijev.
- Težave pri nadgrajevanju in zniževanju različice.
- Možne kolizije GUID-jev in ni enoznačnega obnašanja s strani Unity za njihovo reševanje.
3. NuGet — distribucija skupnih knjižnic preko NuGet paketov.
Prednosti:
- Enostavno delo s projekti, ki niso odvisni od Unity.
- Enostavno verzioniranje in reševanje odvisnosti.
Mane:
- Unity ne zna delati z NuGet paketi "iz škatle" (na GitHubu lahko najdete NuGet Package Manager for Unity, ki to uredi, vendar so tukaj nekatere težave).
- Težave pri distribuciji drugih vrst sredstev.
4. Unity Package Manager — distribucija skupnih virov preko nativne rešitve za Unity.
Prednosti:
- Nativen vmesnik za delo s paketi.
- Zaščita pred prepisovanjem .meta datotek v paketih pri konfliktih GUID-jev.
- Možnost verzioniranja.
- Možnost distribucije vseh vrst virov za Unity.
Mane:
- Še vedno se lahko pojavijo konflikti GUID-jev.
- Brez dokumentacije za izvedbo.
Zadnji način ima več prednosti kot slabosti. Vendar pa trenutno ni zelo priljubljen zaradi pomanjkanja dokumentacije, zato se bomo na tem podrobneje osredotočili.
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é společností Unity Technologies. Od verze 2018.3 však došlo k možnosti přidávání vlastních balíčků.

Rozhraní Unity Package Manager
Balíčky se nedostanou do zdrojů projektu (adresář Assets). Jsou umístěny v samostatném adresáři. %projectFolder%/Library/PackageCache a nijak neovlivňují projekt, jejich jediná zmínka ve zdrojích je v souboru packages/manifest.json.

Balíčky ve filesystému projektu
Zdrojové balíčky
UPM může využívat několik zdrojů balíčků:
1. Souborový systém.
Prednosti:
- Rychlost realizace.
- Nevyžaduje žádné externí nástroje.
Mane:
- Složitost verzování.
- Je nutný společný přístup k souborovému systému pro všechny, kdo pracují na projektu.
2. Git-repozitář.
Prednosti:
- Potřebujete pouze Git-repozitář.
Mane:
- Nelze přepínat mezi verzemi přes okno UPM.
- Nepracuje se všemi Git-repozitáři.
3. npm-repozitář.
Prednosti:
- Úplně podporuje funkčnost UPM a používá se pro distribuci oficiálních balíčků Unity.
Mane:
- V současnosti ignoruje všechny řetězcové verze balíčků, kromě „-preview“.
Níže se podíváme na implementaci UPM + npm. Tato vazba je výhodná, protože umožňuje pracovat s jakýmikoli typy zdrojů a spravovat verze balíčků, a také plně podporuje nativní rozhraní UPM.
Jako npm-repozitář můžete použít . K němu je podrobná , a k jeho spuštění bude potřebovat doslova pár příkazů.
Nastavení prostředí
Nejprve je nutné nainstalovat .
Vytvoření balíčku
Aby bylo možné vytvořit balíček, je nutné umístit soubor package.json, který jej popisuje, do adresáře se obsahem tohoto balíčku. Je třeba udělat následující:
Přejít do adresáře projektu, který chceme vytvořit jako balíček.
Spustit příkaz npm init a během dialogu zadat potřebné hodnoty. Pro název uveďte jméno ve formátu reverzní domény, například com.plarium.somepackage.
Pro pohodlné zobrazení názvu balíčku - přidejte vlastnost displayName do package.json a vyplňte ji.
Jelikož je npm orientovaný na js, v souboru se nacházejí nám nepotřebné vlastnosti main a scripts, které Unity nepoužívá. Je lepší je odstranit, aby se popis balíčku neznečišťoval. Soubor by měl vypadat zhruba takto:
- Přejít do adresáře projektu, který chceme vytvořit jako balíček.
- Spustit příkaz npm init a během dialogu zadat potřebné hodnoty. Pro název uveďte jméno ve formátu reverzní domény, například com.plarium.somepackage.
- Pro pohodlné zobrazení názvu balíčku - přidejte vlastnost displayName do package.json a vyplňte ji.
- Jelikož je npm orientovaný na js, v souboru se nacházejí nám nepotřebné vlastnosti main a scripts, které Unity nepoužívá. Je lepší je odstranit, aby se popis balíčku neznečišťoval. Soubor by měl vypadat zhruba takto:
{ "name": "com.plarium.somepackage", "displayName": "Nekateri paket", "version": "1.0.0", "description": "Opis nekaterih paketov", "keywords": [ "Unity", "UPM" ], "author": "AVTOR", "license": "UNLICENSED" } - Odprite Unity in ustvarite .meta datoteko za package.json (Unity ne vidi virov brez .meta datotek, paketi za Unity se odpirajo le za branje).
Pošiljanje paketa
Za pošiljanje paketa je treba izvesti ukaz: npm publish --registry *naslov shranjevanja paketov*.
Namestitev in posodabljanje paketov prek Unity Package Managerja
Za dodajanje paketa v Unity projekt je potrebno:
- V datoteko
manifest.jsonvpisati informacije o virih paketov. Za to je treba dodati lastnostscopedRegistriesin navesti obsege in naslov vira, po katerem se bodo iskali določeni obsegi."scopedRegistries": [ { "name": "Main", "url": "naslov shranjevanja paketov", "scopes": [ "com.plarium" ] } ] - Prejdite v Unity in odprite okno Package Manager (delo s prilagojenimi paketi se ne razlikuje od dela s vgrajenimi).
- Izberite Vse pakete.
- Poiščite želeni paket in ga dodajte.

Delo z izvorno kodo in odpravljanje napak
Da se izvorne kode povežejo s projektom, je treba ustvariti za paket.
Uporaba paketov ne omejuje možnosti za odpravljanje napak. Vendar pa pri delu s paketi v Unity ni mogoče preiti v IDE s klikom na napako v konzoli, če je napaka nastala v paketu. To je povezano s tem, da Unity ne vidi skriptov kot ločenih datotek, saj so pri uporabi Assembly Definition zbrane v knjižnico in povezane s projektom. Pri delu z izvorno kodo iz projekta je prehod v IDE s klikom mogoč.
Skript v projektu s povezanim paketom:

Skript iz paketa z delujočo točko prekinjanja:

Nujne popravke v pakete
Paketi, dodani v projekt Unity, so samo za branje, vendar jih je mogoče urejati v predpomnilniku paketov. Za to je treba:
- Pojdite v paket v predpomnilniku paketov.

- Uredite potrebne spremembe.
- Posodobite različico v datoteki
package.json. - Pošljite paket
npm publish --registry *naslov shranjevanja paketov*. - Posodobite različico paketa na popravljeno prek vmesnika UPM.
Konflikti pri uvozu paketov
Pri uvozu paketov lahko pride do naslednjih konfliktov GUID-ov:
- Paket — paket. Če se pri uvozu paketa ugotovi, da so v že dodanih paketih sredstva s takim istim GUID-om, sredstva s podvojenimi GUID-i iz uvoženega paketa ne bodo dodana v projekt.
- Paket je projekt. Ako se prilikom uvoza paketa otkrije da u projektu postoje resursi s istim GUID-ovima, resursi iz paketa neće biti dodani u projekt. Ipak, resursi koji ovise o njima počet će koristiti resurse iz projekta.
Premještanje resursa iz projekta u paket
Ako premjestite resurs iz projekta u paket dok je Unity otvoren, njegova funkcionalnost će ostati sačuvana, a veze u ovisnim resursima počet će koristiti resurs iz paketa.
Pomembno: prilikom kopiranja resursa iz projekta u paket doći će do sukoba „Paket — projekt“, opisanog u prethodnom odjeljku.
Moguća rješenja sukoba
- Ponovno dodjeljivanje GUID-ova prema vlastitim algoritmima prilikom uvoza svih resursa kako bi se isključile kolizije.
- Dodavanje svih resursa u jedan projekt s njihovim naknadnim razdvajanjem na pakete.
- Kreiranje baze podataka koja sadrži GUID-ove svih resursa, te provođenje validacije prilikom slanja paketa.
Zaključek
UPM je nova solucija za distribuciju zajedničkih resursa na Unity-ju, koja može biti dostojna alternativa postojećim metodama. Preporuke opisane u članku proizašle su iz stvarnih slučajeva. Nadamo se da će vam biti korisne.
Izvor: habr.com

