Ako previesť projekt z Unity 4 do Unity 6

Ako dostať projekt z Unity 4 do Unity 6 bez straty scén: prevod na text cez Unity 2019.4, port UnityScriptu do C# so zachovaním GUID a obnova starého HUD.

Stavba z blokov v leveli Onagera na podlahe z mliečneho skla

Projekt z Unity 4 neotvárajte priamo v Unity 6 a hlavne v ňom nič neukladajte. Unity 6 staré binárne scény načíta len čiastočne a uložením stratu potvrdí; bezpečná cesta vedie cez Unity 2019.4, ktoré starý formát vie prečítať aj zapísať ako text, a až potom do Unity 6.

Týka sa to projektov, ktoré majú scény a prefaby uložené v binárnom formáte a skripty v UnityScripte, jazyku podobnom JavaScriptu, ktorý Unity kedysi podporovalo popri C#. Postup ukážeme na hre Onager, fyzikálnej hre s katapultom napísanej v Unity 4.1.2 a v UnityScripte. Projekt mal 126 skriptov, 75 scén a 78 prefabov, po prevode beží na Unity 6000.5 s URP (Universal Render Pipeline) a je zadarmo na App Store aj Google Play.

Čo sa stane, keď projekt otvoríte v Unity 6

Najjednoduchší prístup je otvoriť projekt v Unity 6 a prepnúť serializáciu na Force Text, teda na ukladanie assetov ako čitateľný YAML. To nie je preklad súborov. Unity každý asset načíta cez svoj importér a zapíše späť ako YAML, takže všetko prejde loaderom Unity 6. Ten pri každej scéne hlási, že našiel Transform bez GameObjectu a „visiaci“ komponent zmaže. Uloženie to spraví natrvalo.

Rozsah straty sa dá zmerať nástrojom binary2text, ktorý je priložený k editoru a číta serializovaný súbor bez importéra. V Onagerovi sme jeho výpis porovnali s výsledným YAML a počítali len komponenty, ktoré zmizli z GameObjectov, ktoré prežili:

Komponent Stratené
Camera 130
ParticleSystem 132
Transform 167
BoxCollider 104
Rigidbody 100
GUITexture / GUIText 303 / 179

Bez straty nebola ani jedna zo 75 scén. Zmizli celé kamery pre HUD a hlavná kamera dostala novú, predvolenú. Dôležité je, že škoda vzniká už pri načítaní, nie pri uložení. Kým projekt nie je prevedený, nesmie ho Unity 6 uložiť, ani jednu scénu, ani jeden prefab.

Krok 1: Zaznamenajte pôvodný stav

Skôr než na niečo siahnete, odfoťte si každú scénu a pre každú scénu si nástrojom binary2text uložte výpis pôvodného súboru. Podľa výpisu budete v kroku 3 kontrolovať kamery a v kroku 5 obnovovať HUD. Pôvodné binárne súbory nechajte v histórii gitu, nemažte ich.

Prvý level v Unity 6 pred remasterom
Prvý level Onagera v Unity 6, ešte so starým renderom a pôvodnými materiálmi. Takýto záznam si spravte z každej scény skôr, než na niečo siahnete.

Krok 2: Prevod na text cez Unity 2019.4

Unity 2019.4 je posledný editor, ktorý formát z Unity 4.1 vie prečítať aj zapísať. Prevod robte so zatvoreným editorom v samostatnej kópii repozitára:

  • Verzia projektu. V súbore s verziou projektu nastavte pôvodnú verziu (v Onagerovi 4.1.2), aby editor zvolil cestu pre starý projekt. Unity ju pri otvorení prepíše, stačí, že platí pri prvom importe.
  • Prázdne balíky. Vyprázdnite zoznam závislostí balíkov. Jedna chyba kompilácie znamená, že nebude fungovať žiadna položka menu z editorových skriptov, a to vyzerá, ako keby sa menu vôbec neobjavilo.
  • Import od nuly. Zmažte priečinok Library a nechajte projekt naimportovať.
  • Force Text a vynútené prepísanie. Unity 2019.4 po zmene na Force Text existujúce súbory samo neprepíše. Treba to vyvolať funkciou na reserializáciu assetov, a to len assetov, nie aj ich meta súborov. Prepísanie všetkých meta súborov spôsobí, že Unity 6 potom importuje stále dokola.

Jedna pasca je v gite. Ak v nastavení atribútov gitu označíte scény ako text s koncom riadku LF, git z binárnych scén pri ukladaní do repozitára vyhodí bajty, ktoré vyzerajú ako koniec riadku. V Onagerovi to poškodilo osem scén. Na assety Unity atribút pre konce riadkov nedávajte, Unity aj tak zapisuje LF.

Krok 3: Výsledok overte v editore, nie čítaním YAML

Čítanie prevedených súborov vedie k sebavedomým a nesprávnym záverom. Skrátené záznamy inštancií prefabov vyzerajú ako strata, rovnako ako kamera, ktorá sa len presunula do prefabu. Rozhoduje to, čo Unity postaví v pamäti. Každú prevedenú scénu otvorte a jej kamery porovnajte s výpisom originálu z kroku 1.

V Onagerovi mali po prevode všetkých 75 scén rovnaké kamery aj ich poradie. Stratilo sa len to, čo žiadny dnešný editor nepozná: 569 GUITexture, 179 GUIText a staré časticové systémy, ktoré Unity odstránilo v roku 2018.

Krok 4: UnityScript do C# s rovnakým GUID

Unity ukončilo UnityScript postupne od verzie 2017.2, takže ručný port do C# je jediná cesta. Scény odkazujú na skripty cez GUID, jedinečný identifikátor, ktorý Unity ukladá do meta súboru každého assetu, a hodnoty polí ukladajú podľa mena poľa. Ak to pri porte dodržíte, všetky odkazy sa pripoja samy:

pre každý skript X v UnityScripte:
  vytvor C# skript s triedou presne menom X
  skopíruj GUID z meta súboru starého skriptu do meta súboru nového
  verejné polia: rovnaké meno, rovnaký typ, aj s preklepmi
  nič nepremenúvaj, kým projekt nebeží

V Onagerovi sa takto po porte všetkých 126 skriptov pripojilo 12 935 komponentov v 73 scénach a v Inspectore zostali všetky nastavené hodnoty.

Textovým hľadaním v projekte sa nedá zistiť, ktoré skripty sa používajú. Binárny prefab má GUID uložený ako bajty, nie ako text. V Onagerovi tak vyzeralo nepoužívaných dvadsaťjeden skriptov a všetky boli živé. Dajte si pozor aj na pozostatky starších pokusov o port: jeden prefab drevenej kocky ukazoval na dva skripty z takého pokusu a len kvôli nemu chýbalo 1 140 komponentov. Ak treba v binárnom súbore zmeniť GUID, vymeňte ho priamo v bajtoch, šestnásť za šestnásť, aby sa súbor neposunul.

Krok 5: Obnovte HUD z pôvodných binárnych scén

GUITexture a GUIText v Unity 6 nie sú a s nimi zmizne celý HUD, ktorý na nich stál. Kresliť ho nanovo netreba. Pôvodné binárne scény z histórie gitu binary2text prečíta bez ohľadu na to, či triedy ešte existujú. Vytiahnite z nich každý obrázok a text HUD s textúrou, farbou, pozíciou a zarovnaním a skriptom ich vráťte na rovnaké objekty v scénach. V Onagerovi to bolo 577 obrázkov a 180 textov.

Takto sa zachránia aj texty, ktoré nikde inde nie sú. V Onagerovi to bolo 111 textov: všetky titulky tutoriálov a celá tabuľa s kreditmi. Pri písaní HUD od nuly by ste si ich museli vymyslieť. Pri prenose farby počítajte s jednou vecou, ktorú dokumentácia nehovorí: staré GUITexture farbu pri vykreslení zdvojnásobovalo. Všetkých 577 obrázkov malo farbu presne 0,5, čiže šedá znamenala bielu.

Po prevode: staré triky nahraďte

Staré projekty často obchádzali obmedzenia vtedajšieho Unity a tieto obchádzky sa po prevode oplatí prerobiť:

  • Odraz v podlahe. Onager mal lesklú podlahu bez skutočného odrazu. Pod podlahou stál druhý, zrkadlovo otočený svet: kópia každého objektu, ktorej pozíciu skript každý tretí snímok skopíroval z originálu, v jednom leveli 50 až 70 klonov. Nahradiť sa dá jednou kamerou navyše, ktorá odraz kreslí v polovičnom rozlíšení. Odrážajú sa potom aj častice a trosky, čo klonovaný svet nevedel.
  • Mierenie. Ak náhľad dráhy predpovedá, kam strelu pošle sila pridaná v prvom fyzikálnom kroku, strela dopadne inde než značka. Spoľahlivejšie je vypočítať rýchlosť raz, náhľad nakresliť presne z nej a strele ju priradiť priamo.
  • Výkon. Merajte na slabom telefóne. Na Motorola G52 klesol Onager z 20 na 6 fps len kvôli shaderu stien, viac než rozlíšenie, tiene a odraz dokopy. Na nízkych a stredných detailoch preto majú steny jednoduchší materiál.
Gravitačná strela v prevedenom Onagerovi: guľa zdvihne bloky, okolo nej krúži vír a modré svetlo.
Dúhová strela: biele body vychádzajú priamo z povrchu zasiahnutého bloku.

Ak riešite fyziku tisícov objektov v súčasnom Unity, pozrite si aj falošný ragdoll pre tisíce nepriateľov v Unity DOTS. Ako po prevode pridať starej 2D hre glow a 2D svetlá v URP, opisuje samostatný návod.

Čo postup nevyrieši

Komponenty, ktoré dnešné Unity nepozná, sa nepripoja. GUITexture a GUIText treba obnoviť ako v kroku 5, staré časticové systémy sa stratia. Mená tried a polí ostanú presne ako v pôvodnom projekte, aj s preklepmi a jazykom, v ktorom ich niekto kedysi napísal. Scény sa na ne viažu menom, takže premenovanie má zmysel robiť len cez editor, ktorý odkazy prepíše sám.

Ak máte starý projekt v Unity a potrebujete ho dostať do súčasnej verzie, napíšte nám.

← Ďalšie v kategórii Onager