Unity â en plattform som har funnits lĂ€nge och stĂ€ndigt utvecklas. Men nĂ€r man arbetar med flera projekt samtidigt kan man fortfarande stöta pĂ„ svĂ„righeter med att anvĂ€nda gemensamma kĂ€llfiler (.cs), bibliotek (.dll) och andra tillgĂ„ngar (bilder, ljud, modeller, prefabs). I denna artikel delar vi med oss av vĂ„r erfarenhet av en nativ lösning pĂ„ detta problem för Unity.

Metoder för att sprida gemensamma resurser
Det finns mer Àn ett sÀtt att anvÀnda gemensamma resurser för olika projekt, men varje metod har sina fördelar och nackdelar.
1. Duplicering â manuellt duplicera resurser mellan projekten.
Fördelar:
- LÀmplig för alla typer av resurser.
- Inga problem med beroenden.
- Inga problem med GUID:er för tillgÄngar.
Nackdelar:
- Gigantiska bibliotek.
- Inga möjligheter till versionshantering.
- SvÄrigheter att spÄra förÀndringar i gemensamma resurser.
- SvÄrigheter att uppdatera gemensamma resurser.
2. â spridning av gemensamma resurser genom externa submoduler.
Fördelar:
- Möjligt att arbeta med kÀllfiler.
- Möjligt att sprida tillgÄngar.
- Inga problem med beroenden.
Nackdelar:
- KrÀver kunskap om Git.
- Git fungerar inte sĂ€rskilt bra med binĂ€ra filer â LFS mĂ„ste anlitas.
- BehörighetsavgrÀnsning för repository.
- SvÄrigheter vid upp- och nedgraderingar.
- Möjliga GUID-kollisioner och oklarheter i hur Unity hanterar dem.
3. NuGet â spridning av gemensamma bibliotek genom NuGet-paket.
Fördelar:
- Enkel hantering av projekt som inte Àr beroende av Unity.
- Enkel versionshantering och lösning av beroenden.
Nackdelar:
- Unity kan inte hantera NuGet-paket "ur lÄdan" (du kan hitta NuGet Package Manager for Unity pÄ GitHub, som ÄtgÀrdar detta, men det finns vissa förbehÄll).
- SvÄrigheter vid spridning av andra typer av tillgÄngar.
4. Unity Package Manager â spridning av gemensamma resurser genom en nativ lösning för Unity.
Fördelar:
- Nativt grÀnssnitt för att arbeta med paket.
- Skydd mot överskrivning av .meta-filer i paket vid GUID-konflikter.
- Möjlighet till versionshantering.
- Möjlighet att sprida alla typer av resurser för Unity.
Nackdelar:
- Konflikter med GUID:er kan fortfarande intrÀffa.
- Ingen dokumentation för implementation.
Den senaste metoden har fler fördelar Àn nackdelar. Men den Àr för nÀrvarande inte sÀrskilt populÀr pÄ grund av brist pÄ dokumentation, sÄ vi kommer att gÄ in pÄ den i detalj.
Unity Package Manager
Unity Package Manager (hÀdanefter UPM) Àr ett verktyg för paketledning. Det lades till i Unity 2018.1 och anvÀndes enbart för paket som utvecklades av Unity Technologies. Men frÄn och med version 2018.3 blev det möjligt att lÀgga till anpassade paket.

GrÀnssnittet för Unity Package Manager
Paket hamnar inte i projektets kÀllfiler (mappen Assets). De finns i en separat mapp. %projectFolder%/Library/PackageCache och pÄverkar inte projektet; den enda referensen i kÀllfilerna finns i filen packages/manifest.json.

Paket i projektets filsystem
PaketkÀllor
UPM kan anvÀnda flera paketkÀllor:
1. Filsystem.
Fördelar:
- Genomförande hastighet.
- KrÀver inga externa verktyg.
Nackdelar:
- Versioneringens komplexitet.
- Gemensam Ätkomst till filsystemet krÀvs för alla som arbetar med projektet.
2. Git-repository.
Fördelar:
- Endast ett Git-repository behövs.
Nackdelar:
- Kan inte byta versioner via UPM-fönstret.
- Fungerar inte med alla Git-repositories.
3. npm-repository.
Fördelar:
- Stöder fullt ut UPM:s funktionalitet och anvÀnds för distribution av officiella Unity-paket.
Nackdelar:
- För nÀrvarande ignorerar den alla strÀngversioner av paket utom »-preview«.
Nedan kommer vi att titta pÄ genomförandet av UPM + npm. Denna kombination Àr praktisk eftersom den gör det möjligt att arbeta med alla typer av resurser och hantera paketversioner, och stöder Àven UPM:s ursprungliga grÀnssnitt helt.
Som npm-repository kan man anvÀnda . Det finns en detaljerad , och för att köra det behövs bokstavligen nÄgra kommandon.
MiljöinstÀllning
För att börja, installera .
Skapa paket
För att skapa ett paket mÄste filen package.json, som kommer att beskriva det, placeras i katalogen med innehÄllet för detta paket. Gör följande:
GÄ till projektmappen som vi vill göra till ett paket.
Kör kommandot npm init och ange nödvÀndiga vÀrden under dialogen. För namn anger vi namnet i omvÀnd domÀnformat, till exempel com.plarium.somepackage.
För att smidigt visa paketnamnet â lĂ€gg till egenskapen displayName i package.json och fyll i det.
Eftersom npm Àr js-orienterat, finns det i filen onödiga egenskaper som main och scripts, som Unity inte anvÀnder. Det Àr bÀttre att ta bort dem för att inte överbelasta paketbeskrivningen. Filen bör se ut ungefÀr sÄ hÀr:
- GÄ till projektmappen som vi vill göra till ett paket.
- Kör kommandot npm init och ange nödvÀndiga vÀrden under dialogen. För namn anger vi namnet i omvÀnd domÀnformat, till exempel com.plarium.somepackage.
- För att smidigt visa paketnamnet â lĂ€gg till egenskapen displayName i package.json och fyll i det.
- Eftersom npm Àr js-orienterat, finns det i filen onödiga egenskaper som main och scripts, som Unity inte anvÀnder. Det Àr bÀttre att ta bort dem för att inte överbelasta paketbeskrivningen. Filen bör se ut ungefÀr sÄ hÀr:
{ "name": "com.plarium.somepackage", "displayName": "NĂ„got Paket", "version": "1.0.0", "description": "Beskrivning av NĂ„got Paket", "keywords": [ "Unity", "UPM" ], "author": "FĂRFATTARE", "license": "OBEHOVLIG" } - Ăppna Unity och generera en .meta-fil för package.json (Unity ser inte tillgĂ„ngarna utan .meta-filer; paket för Unity öppnas endast för lĂ€sning).
Skicka paketet
För att skicka paketet, mÄste du köra kommandot: npm publish --registry *adress till paketlagret*.
Installation och uppdatering av paket via Unity Package Manager
För att lÀgga till ett paket i ett Unity-projekt mÄste du:
- Föra in i filen
manifest.jsoninformation om paketkÀllor. För detta mÄste du lÀgga till egenskapenscopedRegistriesoch ange scopes och adressen till kÀllan dÀr specifika scopes ska sökas."scopedRegistries": [ { "name": "Huvud", "url": "adress till paketlagret", "scopes": [ "com.plarium" ] } ] - GÄ till Unity och öppna Package Manager-fönstret (hantering av anpassade paket skiljer sig inte frÄn hantering av inbyggda).
- VĂ€lj Alla Paket.
- Hitta det nödvÀndiga paketet och lÀgg till det.

Arbete med kÀllkod och felsökning
För att kÀllkoden ska kopplas till projektet mÄste du skapa en för paketet.
AnvÀndningen av paket begrÀnsar inte möjligheterna till felsökning. Men vid arbete med paket i Unity kan du inte gÄ till IDE genom att klicka pÄ ett fel i konsolen, om felet intrÀffade i paketet. Detta beror pÄ att Unity inte ser skripten som enskilda filer, eftersom de sammanstÀlls i ett bibliotek och kopplas till projektet vid anvÀndning av Assembly Definition. Vid arbete med kÀllkoden frÄn projektet Àr övergÄng till IDE möjlig.
Skript i projektet med kopplad paket:

Skript frÄn paketet med fungerande brytpunkt:

Akut Àndring av paket
Paketen som har lagts till i projektet Àr endast skrivskyddade, men de kan redigeras i paketens cache. För detta mÄste du:
- GĂ„ till paketet i paketens cache.

- Göra nödvÀndiga Àndringar.
- Uppdatera versionen i filen
package.json. - Skicka paketet
npm publish --registry *adress till paketlagret*. - Uppdatera paketversionen till den korrigerade genom UPM-grÀnssnittet.
Konflikter vid import av paket
Vid import av paket kan följande GUID-konflikter intrÀffa:
- Paket â paket. Om det vid import av paket upptĂ€cks att det finns tillgĂ„ngar med samma GUID redan i de tillagda paketen, kommer tillgĂ„ngar med matchande GUID frĂ„n det importerade paketet inte att lĂ€ggas till i projektet.
- Paketet Àr ett projekt. Om det upptÀckts att det finns tillgÄngar med samma GUID:er i projektet vid import av paketet, kommer inte tillgÄngarna frÄn paketet att lÀggas till i projektet. Dock kommer tillgÄngar som Àr beroende av dem att börja anvÀnda tillgÄngarna frÄn projektet.
Ăverföring av tillgĂ„ngar frĂ„n projektet till paketet
Om du överför en tillgÄng frÄn projektet till paketet med Unity öppen, kommer dess funktionalitet att bevaras, och referenser i beroende tillgÄngar kommer att börja anvÀnda tillgÄngen frÄn paketet.
Det Àr viktigt: vid kopiering av en tillgÄng frÄn projektet till paketet uppstÄr konflikten "Paket - projekt", som beskrivits i avsnittet ovan.
Möjliga lösningar pÄ konflikter
- Omdefiniera GUID:er med egna algoritmer vid import av alla tillgÄngar för att undvika kollisioner.
- Samla alla tillgÄngar i ett projekt och dela dem upp i paket senare.
- Skapa en databas som innehÄller GUID:erna för alla tillgÄngar och validera vid sÀndning av paket.
Slutsats
UPM Àr en ny lösning för distribution av gemensamma resurser pÄ Unity, som kan bli ett vÀrdigt alternativ till befintliga metoder. Riktlinjerna som beskrivs i artikeln har kommit fram genom verkliga fall. Vi hoppas att de Àr till hjÀlp.
KĂ€lla: habr.com

