Unity je platforma koja postoji već dugo i neprestano se razvija. Ipak, prilikom rada na više projekata istovremeno, i dalje se mogu susresti s izazovima u korištenju zajedničkih izvora (.cs), biblioteka (.dll) i drugih resursa (slike, zvukovi, modeli, prefabovi). U ovom članku ćemo podijeliti svoje iskustvo u radu s nativnim rješenjem ovog problema za Unity.

Metode distribucije zajedničkih resursa
Postoji više od jednog načina za korištenje zajedničkih resursa za različite projekte, ali svaki pristup ima svoje prednosti i nedostatke.
1. Duplication — 'ručno' dupliciramo resurse između projekata.
Prednosti:
- Pogodno za sve vrste resursa.
- Nema problema s ovisnostima.
- Nema problema s GUID-ovima resursa.
Mane:
- Ogromni repozitoriji.
- Nema mogućnosti verzioniranja.
- Teškoće u praćenju promjena u zajedničkim resursima.
- Teškoće u ažuriranju zajedničkih resursa.
2. — distribucija zajedničkih resursa putem vanjskih podmodula.
Prednosti:
- Moguće je raditi s izvorima.
- Moguće je distribuirati resurse.
- Nema problema s ovisnostima.
Mane:
- Potrebno je znanje rada s Git-om.
- Git se ne sljubljuje dobro s binarnim datotekama — trebat će uključiti LFS.
- Ograničavanje pristupa za repozitorije.
- Teškoće prilikom povećanja i smanjenja verzije.
- Moguće su kolizije GUID-ova i nema jednoznačnog ponašanja s strane Unity-a za njihovo rješavanje.
3. NuGet — distribucija zajedničkih biblioteka putem NuGet paketa.
Prednosti:
- Praktičan rad s projektima koji nisu ovisni o Unity-u.
- Pojednostavljeno verzioniranje i rješavanje ovisnosti.
Mane:
- Unity ne može raditi s NuGet paketima 'iz kutije' (na GitHubu možete pronaći NuGet Package Manager za Unity koji to ispravlja, ali postoje nijanse).
- Teškoće u distribuciji drugih vrsta resursa.
4. Unity Package Manager — distribucija zajedničkih resursa putem nativnog rješenja za Unity.
Prednosti:
- Nativno sučelje za rad s paketima.
- Zaštita od prepisivanja .meta datoteka u paketima pri konfliktima GUID-ova.
- Mogućnost verzioniranja.
- Mogućnost distribucije svih vrsta resursa za Unity.
Mane:
- I dalje mogu nastati konflikti GUID-ova.
- Nema dokumentacije za implementaciju.
Posljednji način ima više prednosti nego nedostataka. Ipak, trenutno nije jako popularan zbog nedostatka dokumentacije, pa ćemo se detaljno osvrnuti na njega.
Unity Package Manager
Unity Package Manager (dalje UPM) je alat za upravljanje paketima. Dodan je u Unity 2018.1, a korišten je samo za pakete koje su razvijali Unity Technologies. Međutim, od verzije 2018.3 postoji mogućnost dodavanja prilagođenih paketa.

Sučelje Unity Package Managera
Paketi ne idu u izvorne datoteke projekta (direktorij Assets). Oni su smješteni u odvojenom direktoriju %projectFolder%/Library/PackageCache i ne utječu na projekt, njihovo jedino spominjanje u izvorima je u datoteci packages/manifest.json.

Paketi u datotečnom sustavu projekta
Izvori paketa
UPM može koristiti nekoliko izvora paketa:
1. Datotečni sustav.
Prednosti:
- Brzina implementacije.
- Ne zahtijeva dodatne alate.
Mane:
- Složenost verzioniranja.
- Potrebno je zajedničko pristupanje datotečnom sustavu za sve koji rade s projektom.
2. Git repozitorij.
Prednosti:
- Potreban je samo Git repozitorij.
Mane:
- Nije moguće prebacivati se između verzija putem UPM sučelja.
- Ne radi sa svim Git repozitorijima.
3. npm repozitorij.
Prednosti:
- Potpuno podržava UPM funkcionalnosti i koristi se za distribuciju službenih Unity paketa.
Mane:
- Trenutno zanemaruje sve verzije paketa osim "-preview".
U nastavku ćemo razmotriti implementaciju UPM + npm. Ova kombinacija je zgodna jer omogućava rad s različitim vrstama resursa i upravljanje verzijama paketa, a također potpuno podržava izvorno UPM sučelje.
Kao npm repozitorij može se koristiti . Postoji detaljna , a za pokretanje su potrebne samo nekoliko naredbi.
Postavke okruženja
Za početak, treba instalirati .
Izrada paketa
Kako biste stvorili paket, potrebno je staviti datoteku package.json, koja će ga opisivati, u direktorij s sadržajem ovog paketa. Treba učiniti sljedeće:
Pređite u direktorij projekta koji želite pretvoriti u paket.
Izvršite naredbu npm init i tijekom dijaloga unesite potrebne vrijednosti. Za name navedite ime u formatu reverz domena, na primjer com.plarium.somepackage.
Za zgodno prikazivanje imena paketa — dodajte svojstvo displayName u package.json i ispunite ga.
Budući da je npm usmjeren na js, u datoteci se nalaze nepotrebna svojstva main i scripts koja Unity ne koristi. Bolje ih je ukloniti kako ne bi zagušivali opis paketa. Datoteka bi trebala izgledati otprilike ovako:
- Pređite u direktorij projekta koji želite pretvoriti u paket.
- Izvršite naredbu npm init i tijekom dijaloga unesite potrebne vrijednosti. Za name navedite ime u formatu reverz domena, na primjer com.plarium.somepackage.
- Za zgodno prikazivanje imena paketa — dodajte svojstvo displayName u package.json i ispunite ga.
- Budući da je npm usmjeren na js, u datoteci se nalaze nepotrebna svojstva main i scripts koja Unity ne koristi. Bolje ih je ukloniti kako ne bi zagušivali opis paketa. Datoteka bi trebala izgledati otprilike ovako:
{ "name": "com.plarium.somepackage", "displayName": "Neki Paket", "version": "1.0.0", "description": "Opis nekog paketa", "keywords": [ "Unity", "UPM" ], "author": "AUTOR", "license": "NEOVLAŠTEN" } - Otvorite Unity i generirajte .meta datoteku za package.json (Unity ne prepoznaje resurse bez .meta datoteka, paketi za Unity otvaraju se samo za čitanje).
Slanje paketa
Za slanje paketa potrebno je izvršiti naredbu: npm publish --registry *adresa do spremišta paketa*.
Instalacija i ažuriranje paketa putem Unity Package Manager-a
Da biste dodali paket u Unity projekt, potrebno je:
- Unijeti u datoteku
manifest.jsoninformacije o izvoru paketa. Za to je potrebno dodati svojstvoscopedRegistriesi odrediti scope-ove i adresu izvora prema kojoj će se tražiti određeni scope-ovi."scopedRegistries": [ { "name": "Main", "url": "adresa do spremišta paketa", "scopes": [ "com.plarium" ] } ] - Idite u Unity i otvorite prozor Package Manager-a (rad s prilagođenim paketima ne razlikuje se od rada s ugrađenima).
- Odaberite Sve pakete.
- Pronađite potreban paket i dodajte ga.

Rad s izvorima i debagiranje
Da bi se izvori povezali s projektom, potrebno je stvoriti za paket.
Korištenje paketa ne ograničava mogućnosti za debagiranje. Međutim, pri radu s paketima u Unity-ju nije moguće preći u IDE klikom na grešku u konzoli ako se greška dogodila unutar paketa. To je zbog toga što Unity ne prepoznaje skripte kao zasebne datoteke, budući da se pri korištenju Assembly Definition-a sakupljaju u biblioteku i povezuju s projektom. Kada radite s izvorima iz projekta, prelazak u IDE klikom je dostupan.
Skripta u projektu s povezanim paketom:

Skripta iz paketa s aktivnim breakpointom:

Hitna ispravka paketa
Paketi Unity dodani u projekt su samo za čitanje, ali ih je moguće uređivati u predmemoriji paketa. Za to je potrebno:
- Preći u paket u predmemoriji paketa.

- Unijeti potrebne izmjene.
- Ažurirati verziju u datoteci
package.json. - Poslati paket
npm publish --registry *adresa do spremišta paketa*. - Ažurirati verziju paketa na ispravnu putem sučelja UPM.
Sukobi pri uvozu paketa
Prilikom uvoza paketa mogu se javiti sljedeći sukobi GUID-ova:
- Paket — paket. Ako se prilikom uvoza paketa otkrije da u već dodanim paketima postoje resursi s istim GUID-om, resursi s podudarnim GUID-ovima iz uvoženog paketa neće biti dodani u projekt.
- Paket — projekt. Ako se prilikom uvoza paketa otkrije da projekt sadrži resurse s istim GUID-ovima, ovi resursi iz paketa neće biti dodani u projekt. Međutim, resursi ovisni o njima će početi koristiti resurse iz projekta.
Premještanje resursa iz projekta u paket
Ako se resurs premjesti iz projekta u paket dok je Unity otvoren, njegova funkcionalnost će ostati sačuvana, a veze u ovisnim resursima će početi koristiti resurs iz paketa.
Važno: 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 u pakete.
- Stvaranje baze podataka koja sadrži GUID-ove svih resursa te provođenje validacije prilikom slanja paketa.
Zaključak
UPM — novo rješenje za distribuciju zajedničkih resursa na Unity, koje može postati dostojna alternativa postojećim metodama. Preporuke opisane u članku nastale su na temelju stvarnih slučajeva. Nadamo se da će vam biti korisne.
Izvor: habr.com

