Preskočiť na obsah
← Všetky devlogy

3 min čítaniaVerzia hry 0.0.1M12

Z Blenderu do Unrealu bez jediného kliknutia (a prečo exit code 0 klame)

Naše 3D modely putujú zo skriptu v Blenderi až do assetu v Unreali bez toho, aby niekto otvoril Blender alebo editor. Cestou sme sa naučili jedno pravidlo, ktoré stojí za to odovzdať ďalej: nástroj bez okna, ktorý skončí s exit code 0, ešte nič nedokázal.

Dostať 3D model do našej hry nestojí ani jedno kliknutie. Stojí to reťaz skriptov. Generátor v Pythone postaví model v Blenderi, ktorý beží na pozadí. Validátor skontroluje názvy, mierku, materiálové sloty a montážne body. Modelovací krok pridá UV a konvexný kolízny obal. Exportér zapíše FBX. Potom PowerShell obal spustí UnrealEditor-Cmd s importným skriptom v Pythone. Nikto nemusí otvoriť Blender ani editor Unrealu. Jeden krok je stále ručný a povieme to rovno: vloženie hotového assetu do levelu.

Čerstvý príklad je kancelársky notebook, ktorý sa musí dať otvoriť. Tvoria ho dva meshe: spodok s rozmermi 355 × 245 × 14 mm a 6 mm hrubé veko, ktorého počiatok leží presne na osi pántu. Hra tak môže veko otáčať bez akéhokoľvek prepočítavania posunu. Generátor si výsledok sám premeria a beh zlyhá, ak sa ktorýkoľvek rozmer odchýli o viac ako 0,5 mm. Odchýlka vyšla 0,00 mm. Validátor hlásil 0 chýb a jedno očakávané varovanie: v tej fáze ešte chýbali UV. Kolízny obal vyšiel s rovnakým objemom ako mesh (pomer 1,00 pri oboch dieloch). Export skončil s 0 varovaniami a 0 chybami a oba diely pristáli v Unreali ako samostatné assety. Čo sme ešte neurobili: na vlastné oči v editore overiť, že sa veko otáča okolo správnej osi. Dovtedy je to len predpoklad.

Znie to hladko. Nebolo to tak. 14. augusta importný skript hrdo vypísal „HOTOVO: asset naimportovany“ – a nenaimportoval nič. UnrealEditor-Cmd totiž v ceste ku skriptu, ktorú dostane, spracúva escape sekvencie so spätnou lomkou. Takže \t na začiatku \tools\ doňho dorazilo ako skutočný tabulátor a súbor v Pythone sa vôbec nenačítal. Editor aj tak skončil s exit code 0 a skript mu uveril.

Opravy boli dve. Cesta sa teraz odovzdáva s lomkami dopredu. A čo je dôležitejšie, obal už exit code neverí. Pozrie sa do cieľového priečinka a zlyhá, ak sa tam neobjavil .uasset novší než okamih, keď import začal. Táto poistka hneď pri prvom behu chytila ďalšiu chybu. Jedna voľba importu zlúčila sedem samostatných dielov našich šachtových dverí do jedného assetu s 84 trojuholníkmi. Technicky sa to naimportovalo. Len to nebolo to, čo úloha chcela. Táto voľba je teraz predvolene vypnutá.

Blender má tú istú pascu. blender --background --python script.py skončí s kódom 0, aj keď skript spadne na chybe – pokiaľ nepridáte --python-exit-code. Overili sme si to na Blenderi 5.2. U nás to bolo ešte horšie, pretože krok exportu sa podľa výsledku validácie rozhoduje, či je bezpečné exportovať. Pád vo vnútri validátora sa preto tváril ako „validácia prešla“. Naše obaly tento prepínač teraz odovzdávajú vždy.

Ešte jedna, lebo je najzákernejšia. Zdrojový .blend súbor dverí je v Git LFS zamykateľný súbor, takže ostáva len na čítanie, kým nedržíte jeho zámok. Blender ho nemohol prepísať, napriek tomu skončil s kódom 0 a build skript skontroloval, či výstupný súbor existuje. Existoval: ten starý. Dva dni tak každý beh vygeneroval v pamäti sedem meshov, nepodarilo sa mu ich zapísať a ohlásil úspech. Takže ani „súbor existuje“ nestačí. Musí byť novší než začiatok behu.

Čo by sme odkázali každému, kto automatizuje Blender alebo Unreal: exit code 0 z nástroja bežiaceho bez okna nie je dôkaz, že sa práca naozaj vykonala. Skontrolujte výsledok. Je súbor na mieste, je novší než začiatok behu a obsahuje to, čo ste chceli?

Čo ešte automatizované nie je: Blender nespúšťa žiadna CI úloha, validácia neprebehne naraz nad celou knižnicou assetov, nemáme kontrolu rozpočtu trojuholníkov a umiestnenie do levelu sa stále robí ručne. Keď sa to zmení, napíšeme o tom.