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.

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.

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.
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.


