Unity Package Manager

Unity är en plattform som har funnits ganska länge och som ständigt utvecklas. Men när du arbetar i det med flera projekt samtidigt, kan du fortfarande stöta på svårigheter med att använda vanliga källor (.cs), bibliotek (.dll) och andra tillgångar (bilder, ljud, modeller, prefabs). I den här artikeln kommer vi att prata om vår erfarenhet av en inbyggd lösning på ett sådant problem för Unity.

Unity Package Manager

Metoder för distribution av delade resurser

Det finns mer än ett sätt att använda delade resurser för olika projekt, men varje tillvägagångssätt har sina för- och nackdelar.

1. Duplicering - vi duplicerar resurser mellan projekt "för hand."

Fördelar:

  • Lämplig för alla typer av resurser.
  • Inga beroendeproblem.
  • Det finns inga problem med tillgångs-GUID.

Nackdelar:

  • Jätteförråd.
  • Det finns ingen möjlighet till versionshantering.
  • Svårigheter att spåra ändringar i delade resurser.
  • Svårigheter att uppdatera delade resurser.

2. Git undermoduler — Fördelning av delade resurser genom externa undermoduler.

Fördelar:

  • Du kan arbeta med källorna.
  • Du kan distribuera tillgångar.
  • Inga beroendeproblem.

Nackdelar:

  • Git-erfarenhet krävs.
  • Git är inte särskilt vänlig med binära filer - du måste ansluta LFS.
  • Åtkomstkontroll för arkiv.
  • Svårigheter med att uppgradera och nedgradera versioner.
  • GUID-kollisioner är möjliga och det finns inget tydligt beteende från Unitys sida för att lösa dem.

3. NuGet - distribution av delade bibliotek genom NuGet-paket.

Fördelar:

  • Bekvämt arbete med projekt som inte är beroende av Unity.
  • Bekväm versionshantering och beroendeupplösning.

Nackdelar:

  • Unity kan inte fungera med NuGet-paket direkt (på GitHub kan du hitta NuGet Package Manager for Unity, som fixar detta, men det finns några nyanser).
  • Svårigheter att fördela andra typer av tillgångar.

4. Unity Package Manager - distribution av delade resurser genom en inbyggd lösning för Unity.

Fördelar:

  • Inbyggt gränssnitt för att arbeta med paket.
  • Skydd mot överskrivning av .meta-filer i paket på grund av GUID-konflikter.
  • Möjlighet till versionering.
  • Möjlighet att distribuera alla typer av resurser för Unity.

Nackdelar:

  • GUID-konflikter kan fortfarande uppstå.
  • Det finns ingen dokumentation för implementering.

Den senare metoden har fler fördelar än nackdelar. Men det är inte särskilt populärt nu på grund av bristen på dokumentation, och därför kommer vi att uppehålla oss i detalj.

Unity Package Manager

Unity Package Manager (UPM) är ett pakethanteringsverktyg. Det lades till i Unity 2018.1 och användes endast för paket som utvecklats av Unity Technologies. Från och med version 2018.3 blev det dock möjligt att lägga till anpassade paket.

Unity Package Manager
Unity Package Manager-gränssnitt

Paketen hamnar inte i projektkällorna (Asset-katalogen). De finns i en separat katalog %projectFolder%/Library/PackageCache och påverkar inte projektet på något sätt, deras enda omnämnande i källkoden finns i filen packages/manifest.json.

Unity Package Manager
Paket i projektfilsystemet

Paketkällor

UPM kan använda flera paketkällor:

1. Filsystem.

Fördelar:

  • Implementeringshastighet.
  • Kräver inga verktyg från tredje part.

Nackdelar:

  • Svårigheter med versionering.
  • Delad åtkomst till filsystemet krävs för alla som arbetar med projektet.

2. Git repository.

Fördelar:

  • Allt du behöver är ett Git-förråd.

Nackdelar:

  • Du kan inte växla mellan versioner genom UPM-fönstret.
  • Fungerar inte med alla Git-förråd.

3. npm-förråd.

Fördelar:

  • Stöder UPM-funktionalitet fullt ut och används för att distribuera officiella Unity-paket.

Nackdelar:

  • För närvarande ignorerar alla strängversioner av paket förutom "-preview".

Nedan kommer vi att titta på implementeringen av UPM + npm. Det här paketet är praktiskt eftersom det låter dig arbeta med alla typer av resurser och hantera paketversioner, och stöder även fullt ut det inbyggda UPM-gränssnittet.

Du kan använda det som ett npm-förråd Verdaccio. Det finns en detaljerad dokumentationen, och bara ett par kommandon krävs för att köra det.

Att sätta upp miljön

Först måste du installera node.js.

Skapa ett paket

För att skapa ett paket måste du placera filen package.json, som kommer att beskriva det, till katalogen med innehållet i detta paket. Du måste göra följande:

Gå till projektkatalogen som vi vill göra ett paket.

Kör kommandot npm init och ange de nödvändiga värdena under dialogrutan. För namn, ange namnet i omvänt domänformat, till exempel com.plarium.somepackage.
För att enkelt visa paketnamnet, lägg till egenskapen displayName i package.json och fyll i den.

Eftersom npm är js-orienterad innehåller filen huvud- och skriptegenskaperna som vi inte behöver, vilket Unity inte använder. Det är bättre att ta bort dem för att inte röra paketbeskrivningen. Filen ska se ut ungefär så här:

  1. Gå till projektkatalogen som vi vill göra ett paket.
  2. Kör kommandot npm init och ange de nödvändiga värdena under dialogrutan. För namn, ange namnet i omvänt domänformat, till exempel com.plarium.somepackage.
  3. För att enkelt visa paketnamnet, lägg till egenskapen displayName i package.json och fyll i den.
  4. Eftersom npm är js-orienterad innehåller filen huvud- och skriptegenskaperna som vi inte behöver, vilket Unity inte använder. Det är bättre att ta bort dem för att inte röra paketbeskrivningen. Filen ska se ut ungefär så här:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. Öppna Unity och generera en .meta-fil för package.json (Unity ser inte tillgångar utan .meta-filer, paket för Unity öppnas skrivskyddat).

Skickar ett paket

För att skicka paketet måste du köra kommandot: npm publish --registry *адрес до хранилища пакетов*.

Installera och uppdatera paket via Unity Package Manager

För att lägga till ett paket till ett Unity-projekt behöver du:

  1. Lägg till i fil manifest.json information om källan till paketen. För att göra detta måste du lägga till egenskapen scopedRegistries och ange scopes och källadressen där specifika scopes kommer att sökas i.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Gå till Unity och öppna fönstret Pakethanterare (att arbeta med anpassade paket skiljer sig inte från att arbeta med inbyggda).
  3. Välj Alla paket.
  4. Hitta paketet du behöver och lägg till det.

Unity Package Manager

Arbeta med källor och felsökning

För att källorna ska kunna kopplas till projektet behöver du skapa Monteringsdefinition för paketet.

Att använda paket begränsar inte dina felsökningsalternativ. Men när du arbetar med paket i Unity kan du inte gå till IDE genom att klicka på ett fel i konsolen om felet uppstod i paketet. Detta beror på att Unity inte ser skript som separata filer, eftersom de när man använder Assembly Definition samlas in i ett bibliotek och ingår i projektet. När du arbetar med källor från ett projekt är det tillgängligt att klicka till IDE.

Skript i ett projekt med ett anslutet paket:

Unity Package Manager
Skript från paketet med en fungerande brytpunkt:

Unity Package Manager

Brådskande korrigeringar av paket

Unity-paket som läggs till i ett projekt är skrivskyddade, men kan redigeras i paketcachen. För att göra detta behöver du:

  1. Gå till paket i paketcache.

    Unity Package Manager

  2. Gör nödvändiga ändringar.
  3. Uppdatera version i filen package.json.
  4. Skicka paket npm publish --registry *адрес до хранилища пакетов*.
  5. Uppdatera paketversionen till den korrigerade via UPM-gränssnittet.

Paketimportkonflikter

Följande GUID-konflikter kan uppstå vid import av paket:

  1. Paket - paket. Om det vid import av ett paket upptäcks att redan tillagda paket innehåller tillgångar med samma GUID, kommer tillgångar med matchande GUID från det importerade paketet inte att läggas till projektet.
  2. Ett paket är ett projekt. Om det vid import av ett paket upptäcks att projektet innehåller tillgångar med matchande GUID, kommer tillgångarna från paketet inte att läggas till i projektet. Tillgångar som är beroende av dem kommer dock att börja använda tillgångar från projektet.

Överföra tillgångar från ett projekt till ett paket

Om du överför en tillgång från ett projekt till ett paket medan Unity är öppet, kommer dess funktionalitet att bevaras, och länkar i beroende tillgångar kommer att börja använda tillgången från paketet.

Det är viktigt: När du kopierar en tillgång från ett projekt till ett paket kommer konflikten "Paket - Projekt" som beskrivs i avsnittet ovan att uppstå.

Möjliga lösningar på konflikter

  1. Omtilldelning av GUID med våra egna algoritmer vid import av alla tillgångar för att eliminera kollisioner.
  2. Lägga till alla tillgångar till ett projekt och sedan dela upp dem i paket.
  3. Skapar en databas som innehåller GUID för alla tillgångar och utför validering när paket skickas.

Slutsats

UPM är en ny lösning för att distribuera delade resurser i Unity, som kan vara ett värdigt alternativ till befintliga metoder. Rekommendationerna som beskrivs i artikeln baserades på verkliga fall. Vi hoppas att du finner dem användbara.

Källa: will.com

Lägg en kommentar