Unity Package Manager

Unity er en platform, der har eksisteret i et stykke tid og er i konstant udvikling. Men når du arbejder i det med flere projekter på samme tid, kan du stadig støde på vanskeligheder med at bruge almindelige kilder (.cs), biblioteker (.dll) og andre aktiver (billeder, lyde, modeller, præfabrikater). I denne artikel vil vi tale om vores erfaring med en indfødt løsning på et sådant problem for Unity.

Unity Package Manager

Metoder til distribution af delte ressourcer

Der er mere end én måde at bruge delte ressourcer på til forskellige projekter, men hver tilgang har sine fordele og ulemper.

1. Duplikering - vi dublerer ressourcer mellem projekter "i hånden."

Teknikere:

  • Velegnet til alle typer ressourcer.
  • Ingen afhængighedsproblemer.
  • Der er ingen problemer med aktiv-GUID'er.

Ulemper:

  • Kæmpe depoter.
  • Der er ingen mulighed for versionering.
  • Svært ved at spore ændringer af delte ressourcer.
  • Svært ved at opdatere delte ressourcer.

2. Git undermoduler — fordeling af delte ressourcer gennem eksterne undermoduler.

Teknikere:

  • Du kan arbejde med kilderne.
  • Du kan fordele aktiver.
  • Ingen afhængighedsproblemer.

Ulemper:

  • Git erfaring påkrævet.
  • Git er ikke særlig venlig med binære filer - du bliver nødt til at forbinde LFS.
  • Adgangskontrol til depoter.
  • Vanskeligheder med at opgradere og nedgradere versioner.
  • GUID-kollisioner er mulige, og der er ingen klar adfærd fra Unitys side til at løse dem.

3. NuGet - distribution af delte biblioteker gennem NuGet-pakker.

Teknikere:

  • Praktisk arbejde med projekter, der ikke er afhængige af Unity.
  • Praktisk versionering og afhængighedsløsning.

Ulemper:

  • Unity kan ikke arbejde med NuGet-pakker ud af boksen (på GitHub kan du finde NuGet Package Manager for Unity, som løser dette, men der er nogle nuancer).
  • Vanskeligheder med at fordele andre typer aktiver.

4. Unity Package Manager - distribution af delte ressourcer gennem en native løsning til Unity.

Teknikere:

  • Native grænseflade til at arbejde med pakker.
  • Beskyttelse mod overskrivning af .meta-filer i pakker på grund af GUID-konflikter.
  • Mulighed for versionering.
  • Evne til at distribuere alle typer ressourcer til Unity.

Ulemper:

  • GUID-konflikter kan stadig forekomme.
  • Der er ingen dokumentation for implementering.

Sidstnævnte metode har flere fordele end ulemper. Det er dog ikke særlig populært nu på grund af den manglende dokumentation, og derfor vil vi dvæle ved det i detaljer.

Unity Package Manager

Unity Package Manager (UPM) er et pakkehåndteringsværktøj. Det blev tilføjet i Unity 2018.1 og blev kun brugt til pakker, der blev udviklet af Unity Technologies. Fra version 2018.3 blev det dog muligt at tilføje brugerdefinerede pakker.

Unity Package Manager
Unity Package Manager Interface

Pakkerne ender ikke i projektkilderne (Assets directory). De er i en separat mappe %projectFolder%/Library/PackageCache og ikke påvirker projektet på nogen måde, deres eneste omtale i kildekoden er i filen packages/manifest.json.

Unity Package Manager
Pakker i projektfilsystemet

Pakkekilder

UPM kan bruge flere pakkekilder:

1. Filsystem.

Teknikere:

  • Implementeringshastighed.
  • Kræver ikke tredjepartsværktøjer.

Ulemper:

  • Svært ved versionering.
  • Delt adgang til filsystemet er påkrævet for alle, der arbejder med projektet.

2. Git repository.

Teknikere:

  • Alt du behøver er et Git-lager.

Ulemper:

  • Du kan ikke skifte mellem versioner gennem UPM-vinduet.
  • Virker ikke med alle Git repositories.

3. npm-lager.

Teknikere:

  • Understøtter fuldt ud UPM-funktionalitet og bruges til at distribuere officielle Unity-pakker.

Ulemper:

  • Ignorerer i øjeblikket alle strengversioner af pakker undtagen "-preview".

Nedenfor vil vi se på implementeringen af ​​UPM + npm. Denne pakke er praktisk, fordi den giver dig mulighed for at arbejde med enhver form for ressourcer og administrere pakkeversioner, og den understøtter også fuldt ud den native UPM-grænseflade.

Du kan bruge det som et npm-lager Verdaccio. Der er en detaljeret dokumentation, og der kræves kun et par kommandoer for at køre det.

Miljøopsætning

Først skal du installere node.js.

Oprettelse af en pakke

For at oprette en pakke skal du placere filen package.json, som vil beskrive det, til mappen med indholdet af denne pakke. Du skal gøre følgende:

Gå til den projektmappe, som vi vil lave en pakke.

Kør kommandoen npm init og indtast de nødvendige værdier under dialogen. For navn, angiv navnet i omvendt domæneformat, for eksempel com.plarium.somepackage.
For bekvemt at vise pakkenavnet skal du tilføje egenskaben displayName til package.json og udfylde det.

Da npm er js-orienteret, indeholder filen hoved- og scriptegenskaberne, som vi ikke har brug for, som Unity ikke bruger. Det er bedre at fjerne dem for ikke at rode i pakkebeskrivelsen. Filen skulle se sådan ud:

  1. Gå til den projektmappe, som vi vil lave en pakke.
  2. Kør kommandoen npm init og indtast de nødvendige værdier under dialogen. For navn, angiv navnet i omvendt domæneformat, for eksempel com.plarium.somepackage.
  3. For bekvemt at vise pakkenavnet skal du tilføje egenskaben displayName til package.json og udfylde det.
  4. Da npm er js-orienteret, indeholder filen hoved- og scriptegenskaberne, som vi ikke har brug for, som Unity ikke bruger. Det er bedre at fjerne dem for ikke at rode i pakkebeskrivelsen. Filen skulle se sådan ud:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. Åbn Unity og generer en .meta-fil til package.json (Unity ser ikke aktiver uden .meta-filer, pakker til Unity åbnes skrivebeskyttet).

Sender en pakke

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

Installation og opdatering af pakker via Unity Package Manager

For at tilføje en pakke til et Unity-projekt skal du:

  1. Tilføj til fil manifest.json oplysninger om kilden til pakkerne. For at gøre dette skal du tilføje ejendommen scopedRegistries og angiv scopes og kildeadressen, hvor specifikke scopes vil blive søgt.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Gå til Unity og åbn vinduet Pakkehåndtering (at arbejde med brugerdefinerede pakker er ikke anderledes end at arbejde med indbyggede).
  3. Vælg Alle pakker.
  4. Find den pakke, du skal bruge, og tilføj den.

Unity Package Manager

Arbejde med kilder og fejlretning

For at kilderne kan forbindes med projektet, skal du oprette Forsamlingsdefinition for pakken.

Brug af pakker begrænser ikke dine fejlfindingsmuligheder. Men når du arbejder med pakker i Unity, kan du 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 inkluderes i projektet. Når du arbejder med kilder fra et projekt, er det muligt at klikke til IDE.

Script i et projekt med en forbundet pakke:

Unity Package Manager
Script fra pakken med et fungerende breakpoint:

Unity Package Manager

Haster rettelser til pakker

Unity-pakker tilføjet til et projekt er skrivebeskyttet, men kan redigeres i pakkecachen. For at gøre dette skal du bruge:

  1. Gå til pakke i pakkecache.

    Unity Package Manager

  2. Foretag de nødvendige ændringer.
  3. Opdater version i fil package.json.
  4. Send pakke npm publish --registry *адрес до хранилища пакетов*.
  5. Opdater pakkeversionen til den rettede via UPM-grænsefladen.

Pakkeimportkonflikter

Følgende GUID-konflikter kan opstå ved import af pakker:

  1. Pakke - Pakke. Hvis det ved import af en pakke opdages, at allerede tilføjede pakker indeholder aktiver med samme GUID, vil aktiver med matchende GUID'er fra den importerede pakke ikke blive tilføjet til projektet.
  2. En pakke er et projekt. Hvis det ved import af en pakke opdages, at projektet indeholder aktiver med matchende GUID'er, vil aktiverne fra pakken ikke blive tilføjet til projektet. Imidlertid vil aktiver, der afhænger af dem, begynde at bruge aktiver fra projektet.

Overførsel af aktiver fra et projekt til en pakke

Hvis du overfører et aktiv fra et projekt til en pakke, mens Unity er åben, vil dets funktionalitet blive bevaret, og links i afhængige aktiver vil begynde at bruge aktivet fra pakken.

Det er vigtigt: Når du kopierer et aktiv fra et projekt til en pakke, vil "Pakke - Projekt"-konflikten beskrevet i afsnittet ovenfor opstå.

Mulige løsninger på konflikter

  1. Gentildeling af GUID'er ved hjælp af vores egne algoritmer ved import af alle aktiver for at eliminere kollisioner.
  2. Tilføjelse af alle aktiver til ét projekt og derefter opdeling af dem i pakker.
  3. Oprettelse af en database, der indeholder GUID'erne for alle aktiver og udfører validering ved afsendelse af pakker.

Konklusion

UPM er en ny løsning til distribution af delte ressourcer i Unity, som kan være et værdigt alternativ til eksisterende metoder. Anbefalingerne beskrevet i artiklen var baseret på virkelige cases. Vi håber du finder dem nyttige.

Kilde: www.habr.com

Tilføj en kommentar