Unity Package Manager

Unity er en plattform som har eksistert ganske lenge og er i stadig utvikling. Men når du arbeider i det med flere prosjekter samtidig, kan du fortsatt støte på problemer med å bruke vanlige kilder (.cs), biblioteker (.dll) og andre eiendeler (bilder, lyder, modeller, prefabrikkerte). I denne artikkelen vil vi snakke om vår erfaring med en innfødt løsning på et slikt problem for Unity.

Unity Package Manager

Metoder for distribusjon av delte ressurser

Det er mer enn én måte å bruke delte ressurser på for forskjellige prosjekter, men hver tilnærming har sine fordeler og ulemper.

1. Duplisering - vi dupliserer ressurser mellom prosjekter "for hånd."

Pros:

  • Egnet for alle typer ressurser.
  • Ingen avhengighetsproblemer.
  • Det er ingen problemer med asset GUIDs.

Cons:

  • Gigantiske depoter.
  • Det er ingen mulighet for versjonskontroll.
  • Vanskeligheter med å spore endringer i delte ressurser.
  • Vanskeligheter med å oppdatere delte ressurser.

2. Git undermoduler — fordeling av delte ressurser gjennom eksterne undermoduler.

Pros:

  • Du kan jobbe med kildene.
  • Du kan distribuere eiendeler.
  • Ingen avhengighetsproblemer.

Cons:

  • Git-erfaring kreves.
  • Git er ikke veldig vennlig med binære filer - du må koble til LFS.
  • Tilgangskontroll for depoter.
  • Vanskeligheter med å oppgradere og nedgradere versjoner.
  • GUID-kollisjoner er mulige og det er ingen klar oppførsel fra Unitys side for å løse dem.

3. NuGet - distribusjon av delte biblioteker gjennom NuGet-pakker.

Pros:

  • Praktisk arbeid med prosjekter som ikke er avhengig av Unity.
  • Praktisk versjonskontroll og avhengighetsoppløsning.

Cons:

  • Unity kan ikke fungere med NuGet-pakker ut av esken (på GitHub kan du finne NuGet Package Manager for Unity, som fikser dette, men det er noen nyanser).
  • Vanskeligheter med å fordele andre typer eiendeler.

4. Unity Package Manager - distribusjon av delte ressurser gjennom en innebygd løsning for Unity.

Pros:

  • Innebygd grensesnitt for arbeid med pakker.
  • Beskyttelse mot overskriving av .meta-filer i pakker på grunn av GUID-konflikter.
  • Mulighet for versjonskontroll.
  • Evne til å distribuere alle typer ressurser for Unity.

Cons:

  • GUID-konflikter kan fortsatt forekomme.
  • Det er ingen dokumentasjon for gjennomføring.

Sistnevnte metode har flere fordeler enn ulemper. Imidlertid er det ikke veldig populært nå på grunn av mangel på dokumentasjon, og derfor vil vi dvele ved det i detalj.

Unity Package Manager

Unity Package Manager (UPM) er et pakkeadministrasjonsverktøy. Den ble lagt til i Unity 2018.1 og ble bare brukt for pakker som ble utviklet av Unity Technologies. Fra og med versjon 2018.3 ble det imidlertid mulig å legge til tilpassede pakker.

Unity Package Manager
Unity Package Manager-grensesnitt

Pakkene havner ikke i prosjektkildene (Assets directory). De er i en egen katalog %projectFolder%/Library/PackageCache og ikke påvirker prosjektet på noen måte, deres eneste omtale i kildekoden er i filen packages/manifest.json.

Unity Package Manager
Pakker i prosjektfilsystemet

Pakkekilder

UPM kan bruke flere pakkekilder:

1. Filsystem.

Pros:

  • Gjennomføringshastighet.
  • Krever ikke tredjepartsverktøy.

Cons:

  • Vanskeligheter med versjonering.
  • Delt tilgang til filsystemet er nødvendig for alle som jobber med prosjektet.

2. Git repository.

Pros:

  • Alt du trenger er et Git-depot.

Cons:

  • Du kan ikke bytte mellom versjoner gjennom UPM-vinduet.
  • Fungerer ikke med alle Git-depoter.

3. npm-lager.

Pros:

  • Støtter UPM-funksjonalitet fullt ut og brukes til å distribuere offisielle Unity-pakker.

Cons:

  • Ignorerer for øyeblikket alle strengversjoner av pakker bortsett fra "-preview".

Nedenfor skal vi se på implementeringen av UPM + npm. Denne pakken er praktisk fordi den lar deg jobbe med alle typer ressurser og administrere pakkeversjoner, og støtter også fullt ut det opprinnelige UPM-grensesnittet.

Du kan bruke den som et npm-lager Verdaccio. Det er en detaljert dokumentasjonen, og bare et par kommandoer kreves for å kjøre den.

Miljøoppsett

Først må du installere node.js.

Opprette en pakke

For å opprette en pakke må du plassere filen package.json, som vil beskrive det, til katalogen med innholdet i denne pakken. Du må gjøre følgende:

Gå til prosjektkatalogen som vi vil lage en pakke.

Kjør npm init-kommandoen og skriv inn de nødvendige verdiene under dialogen. For navn, spesifiser navnet i omvendt domeneformat, for eksempel com.plarium.somepackage.
For å enkelt vise pakkenavnet, legg til egenskapen displayName til package.json og fyll den.

Siden npm er js-orientert, inneholder filen hoved- og skriptegenskapene som vi ikke trenger, som Unity ikke bruker. Det er bedre å fjerne dem for ikke å rote pakkebeskrivelsen. Filen skal se omtrent slik ut:

  1. Gå til prosjektkatalogen som vi vil lage en pakke.
  2. Kjør npm init-kommandoen og skriv inn de nødvendige verdiene under dialogen. For navn, spesifiser navnet i omvendt domeneformat, for eksempel com.plarium.somepackage.
  3. For å enkelt vise pakkenavnet, legg til egenskapen displayName til package.json og fyll den.
  4. Siden npm er js-orientert, inneholder filen hoved- og skriptegenskapene som vi ikke trenger, som Unity ikke bruker. Det er bedre å fjerne dem for ikke å rote pakkebeskrivelsen. Filen skal se omtrent slik ut:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. Åpne Unity og generer en .meta-fil for package.json (Unity ser ikke aktiva uten .meta-filer, pakker for Unity åpnes skrivebeskyttet).

Sender en pakke

For å sende pakken må du kjøre kommandoen: npm publish --registry *адрес до хранилища пакетов*.

Installere og oppdatere pakker via Unity Package Manager

For å legge til en pakke til et Unity-prosjekt trenger du:

  1. Legg til i fil manifest.json informasjon om kilden til pakkene. For å gjøre dette må du legge til eiendommen scopedRegistries og angi scopes og kildeadressen der spesifikke scopes vil bli søkt.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Gå til Unity og åpne Pakkebehandling-vinduet (å jobbe med egendefinerte pakker er ikke forskjellig fra å jobbe med innebygde).
  3. Velg Alle pakker.
  4. Finn pakken du trenger og legg den til.

Unity Package Manager

Arbeid med kilder og feilsøking

For at kildene skal kobles til prosjektet, må du opprette Forsamlingsdefinisjon for pakken.

Bruk av pakker begrenser ikke feilsøkingsalternativene dine. Men når du arbeider med pakker i Unity, kan du ikke gå til IDE ved å klikke på en feil i konsollen hvis feilen oppsto i pakken. Dette skyldes det faktum at Unity ikke ser skript som separate filer, siden de ved bruk av Assembly Definition blir samlet inn i et bibliotek og inkludert i prosjektet. Når du arbeider med kilder fra et prosjekt, er klikking til IDE tilgjengelig.

Skript i et prosjekt med en tilkoblet pakke:

Unity Package Manager
Skript fra pakken med et fungerende bruddpunkt:

Unity Package Manager

Haster rettelser til pakker

Unity-pakker lagt til et prosjekt er skrivebeskyttet, men kan redigeres i pakkebufferen. For å gjøre dette trenger du:

  1. Gå til pakke i pakkebufferen.

    Unity Package Manager

  2. Gjør de nødvendige endringene.
  3. Oppdater versjon i fil package.json.
  4. Send pakke npm publish --registry *адрес до хранилища пакетов*.
  5. Oppdater pakkeversjonen til den korrigerte via UPM-grensesnittet.

Pakkeimportkonflikter

Følgende GUID-konflikter kan oppstå ved import av pakker:

  1. Pakke - pakke. Hvis det ved import av en pakke oppdages at allerede lagt til pakker inneholder aktiva med samme GUID, vil ikke aktiva med samsvarende GUID fra den importerte pakken bli lagt til prosjektet.
  2. En pakke er et prosjekt. Hvis det ved import av en pakke oppdages at prosjektet inneholder eiendeler med samsvarende GUID-er, vil ikke eiendelene fra pakken bli lagt til prosjektet. Eiendeler som er avhengige av dem vil imidlertid begynne å bruke eiendeler fra prosjektet.

Overføring av eiendeler fra et prosjekt til en pakke

Hvis du overfører en eiendel fra et prosjekt til en pakke mens Unity er åpen, vil funksjonaliteten bevares, og lenker i avhengige eiendeler vil begynne å bruke ressursen fra pakken.

Det er viktig: Når du kopierer en ressurs fra et prosjekt til en pakke, vil "Pakke - Prosjekt"-konflikten beskrevet i avsnittet ovenfor oppstå.

Mulige løsninger på konflikter

  1. Omtildeling av GUID-er ved hjelp av våre egne algoritmer ved import av alle eiendeler for å eliminere kollisjoner.
  2. Legge til alle eiendeler til ett prosjekt og deretter dele dem inn i pakker.
  3. Opprette en database som inneholder GUIDene til alle eiendeler og utføre validering ved sending av pakker.

Konklusjon

UPM er en ny løsning for distribusjon av delte ressurser i Unity, som kan være et verdig alternativ til eksisterende metoder. Anbefalingene beskrevet i artikkelen var basert på reelle tilfeller. Vi håper du finner dem nyttige.

Kilde: www.habr.com

Legg til en kommentar