Unity er en platform, der har eksisteret i lang tid og konstant udvikler sig. Dog, når man arbejder i den med flere projekter samtidig, kan man stadig opleve udfordringer med at bruge fælles kildekoder (.cs), biblioteker (.dll) og andre aktiver (billeder, lyde, modeller, prefab). I denne artikel vil vi dele vores erfaring med en indfødte løsning på et sådant problem for Unity.

Metoder til distribution af fælles ressourcer
Der findes mere end én måde at bruge fælles ressourcer for forskellige projekter, men hver tilgang har sine fordele og ulemper.
1. Duplikation – vi duplikerer ressourcer mellem projekterne »manuelt«.
Fordele:
- Passer til alle typer ressourcer.
- Ingen problemer med afhængigheder.
- Ingen problemer med aktivernes GUID'er.
Ulemper:
- Gigantiske repositories.
- Ingen versionsstyring.
- Sværere at spore ændringer i de fælles ressourcer.
- Sværere at opdatere de fælles ressourcer.
2. – distribution af fælles ressourcer gennem eksterne submoduler.
Fordele:
- Mulighed for at arbejde med kildekoder.
- Mulighed for at distribuere aktiver.
- Ingen problemer med afhængigheder.
Ulemper:
- Kræver færdigheder i Git.
- Git arbejder ikke særlig godt med binære filer – det bliver nødvendigt at tilslutte LFS.
- Adgangsbegrænsning for repositories.
- Udfordringer ved at op- og nedgradere versioner.
- Mulige GUID-konflikter og ingen entydig adfærd fra Unity til at løse dem.
3. NuGet – distribution af fælles biblioteker gennem NuGet-pakker.
Fordele:
- Behagelig at arbejde med projekter, der ikke afhænger af Unity.
- Praktisk versionering og afhængighedsopklaring.
Ulemper:
- Unity kan ikke arbejde med NuGet-pakker »ud af boksen« (man kan finde NuGet Package Manager for Unity på GitHub, som løser dette, men der er nogle nuancer).
- Udfordringer ved distribution af andre typer aktiver.
4. Unity Package Manager – distribution af fælles ressourcer gennem en indfødt løsning til Unity.
Fordele:
- Indfødt interface til arbejde med pakker.
- Beskyttelse mod overskrivning af .meta filer i pakker ved GUID-konflikter.
- Mulighed for versionering.
- Mulighed for distribution af alle typer ressourcer til Unity.
Ulemper:
- Der kan stadig opstå GUID-konflikter.
- Ingen dokumentation til implementering.
Den sidste metode har flere fordele end ulemper. Dog er den i øjeblikket ikke meget populær på grund af manglende dokumentation, derfor vil vi gå i dybden med den.
Unity Package Manager
Unity Package Manager (hereafter UPM) er et værktøj til håndtering af pakker. Det blev tilføjet i Unity 2018.1 og blev kun brugt til pakker, der blev udviklet af Unity Technologies. Men fra version 2018.3 blev det muligt at tilføje brugerdefinerede pakker.

Brugergrænseflade for Unity Package Manager
Pakkerne er ikke inkluderet i projektets kildemappe (Assets-mappen). De findes i en separat mappe %projectFolder%/Library/PackageCache og påvirker ikke projektet, deres eneste omtale i kilden er i filen packages/manifest.json.

Pakker i projektets filsystem
Pakkekilder
UPM kan bruge flere pakkekilder:
1. Filsystemet.
Fordele:
- Implementeringshastighed.
- Krav om tredjeparts værktøjer.
Ulemper:
- Udfordringer omkring versionering.
- Der er behov for delt adgang til filsystemet for alle, der arbejder med projektet.
2. Git-repository.
Fordele:
- Kun et Git-repository er nødvendigt.
Ulemper:
- Kan ikke skifte versioner via UPM-vinduet.
- Fungerer ikke med alle Git-repositories.
3. npm-repository.
Fordele:
- Understøtter fuldt ud funktionaliteten i UPM og bruges til distribution af officielle Unity-pakker.
Ulemper:
- I øjeblikket ignoreres alle strengversioner af pakker, undtagen "-preview".
Nedenfor vil vi se på implementeringen af UPM + npm. Denne kombination er praktisk, da den giver mulighed for at arbejde med alle typer ressourcer og administrere pakkeversioner samt fuldt ud understøtter den native UPM-grænseflade.
Som npm-repository kan man bruge . Der er en detaljeret , og til at starte det kræves der bogstaveligt talt et par kommandoer.
Opsætning af miljøet
Først skal du installere .
Oprettelse af pakke
For at oprette en pakke skal du placere en fil package.json, der vil beskrive den, i mappen med indholdet af denne pakke. Du skal gøre følgende:
Gå til projektmappen, som vi vil gøre til en pakke.
Udfør kommandoen npm init, og indtast de nødvendige værdier under dialogen. For name angiver vi navnet i formatet omvendt domæne, for eksempel com.plarium.somepackage.
For at sikre en pæn visning af pakkenavnet — tilføj egenskaben displayName i package.json og udfyld den.
Da npm er js-orienteret, indeholder filen nogle unødvendige egenskaber som main og scripts, som Unity ikke bruger. Det er bedst at slette dem for ikke at overfylde pakkebeskrivelsen. Filen bør se nogenlunde sådan her ud:
- Gå til projektmappen, som vi vil gøre til en pakke.
- Udfør kommandoen npm init, og indtast de nødvendige værdier under dialogen. For name angiver vi navnet i formatet omvendt domæne, for eksempel com.plarium.somepackage.
- For at sikre en pæn visning af pakkenavnet — tilføj egenskaben displayName i package.json og udfyld den.
- Da npm er js-orienteret, indeholder filen nogle unødvendige egenskaber som main og scripts, som Unity ikke bruger. Det er bedst at slette dem for ikke at overfylde pakkebeskrivelsen. Filen bør se nogenlunde sådan her ud:
{ "name": "com.plarium.somepackage", "displayName": "Nogle Pakke", "version": "1.0.0", "description": "Beskrivelse af nogle pakke", "keywords": [ "Unity", "UPM" ], "author": "FORFATTER", "license": "UNLICENSED" } - Åbn Unity og generer en .meta-fil til package.json (Unity kan ikke se aktiver uden .meta-filer; pakker til Unity er kun skrivebeskyttede).
Send pakke
For at sende pakken skal du udføre følgende kommando: npm publish --registry *adresse til pakkelager*.
Installation og opdatering af pakker via Unity Package Manager
For at tilføje en pakke til Unity-projektet, skal du:
- Tilføje til filen
manifest.jsonoplysninger om pakkekilder. For dette skal du tilføje egenskabenscopedRegistriesog angive scopes og adressen til kilden, hvor de specifikke scopes skal findes."scopedRegistries": [ { "name": "Main", "url": "adresse til pakkelager", "scopes": [ "com.plarium" ] } ] - Gå til Unity og åbne Package Manager-vinduet (arbejde med brugerdefinerede pakker adskiller sig ikke fra arbejdet med de indbyggede).
- Vælg Alle Pakker.
- Find den nødvendige pakke og tilføj den.

Arbejder med kildekoder og fejlfinding
For at tilslutte kildekoderne til projektet skal du oprette en til pakken.
Brug af pakker begrænser ikke mulighederne for fejlfinding. Når du arbejder med pakker i Unity, kan du dog ikke gå til IDE ved at klikke på en fejl i konsollen, hvis fejlen opstod i pakken. Dette skyldes, at Unity ikke ser scripts som separate filer, da de ved brug af Assembly Definition samles i et bibliotek og tilsluttes projektet. Når du arbejder med kilder fra projektet, er der mulighed for at gå til IDE ved at klikke.
Scriptet i projektet med tilsluttet pakke:

Scriptet fra pakken med en fungerende breakpoint:

Hurtige ændringer i pakker
De pakker, der er tilføjet i projektet, er kun skrivebeskyttede, men de kan redigeres i pakkecachen. For dette skal du:
- Gå til pakken i pakkecachen.

- Foretage nødvendige ændringer.
- Opdater versionen i filen
package.json. - Send pakken
npm publish --registry *adresse til pakkelager*. - Opdater pakkeversionen til den rettede gennem UPM-grænsefladen.
Pakkeimportkonflikter
Under import af pakker kan der opstå følgende konflikter med GUID’er:
- Pakke — pakke. Hvis der under import af en pakke opdages, at der i allerede tilføjede pakker er aktiver med den samme GUID, vil aktiverne med overlappende GUID’er fra den importerede pakke ikke blive tilføjet til projektet.
- Pakken er et projekt. Hvis der opdages aktiver med matchende GUID'er under importen af pakken, vil aktiverne fra pakken ikke blive tilføjet til projektet. Dog vil aktiver, der afhænger af dem, begynde at bruge aktiver fra projektet.
Flytning af aktiver fra projekt til pakke
Hvis du flytter et aktiv fra projektet til pakken, mens Unity er åben, vil dets funktionalitet blive bevaret, og referencer i de afhængige aktiver vil begynde at bruge aktivet fra pakken.
Det er vigtigt: ved kopiering af et aktiv fra projektet til pakken vil der opstå en konflikt "Pakken - projekt", som beskrevet i ovenstående afsnit.
Mulige løsninger på konflikter
- Omallokering af GUID'er ved hjælp af egne algoritmer under import af alle aktiver for at undgå kollisioner.
- Tilføjelse af alle aktiver til et enkelt projekt med efterfølgende opdeling i pakker.
- Oprettelse af en database, der indeholder GUID'er for alle aktiver, og validering ved afsendelse af pakker.
Konklusion
UPM er en ny løsning til distribution af delte ressourcer i Unity, som kan blive et værdigt alternativ til eksisterende metoder. Anbefalingerne i artiklen er baseret på virkelige sager. Vi håber, de vil være nyttige for dig.
Kilde: habr.com

