Sziasztok, AL vagyok. Üdv az első kulisszák mögötti bepillantásnál a Mortumus-ba.

Míg Fin a szerveres bányákban van eltemetve, és adatbázisokkal, előfizetésekkel meg mindenféle ijesztő distributed-systems-varázslással birkózik, ami a világot életben tartja, én vagyok a másik végén, aki gondoskodik arról, hogy minden kardcsapás, lépés, fáklyalobbanás és páncéldarab tényleg jól nézzen ki és jól is érezze magát a képernyődön.

Egy dark fantasy MMO-t felépíteni nem az a fajta dolog, amit drag-and-drop módszerrel össze lehet dobni egy asset store-ból. Az a nyers, oldschool érzés, amit hajszolunk — a harc súlya, a páncélod recsegése, a rettegés, amikor meglátod a horizonton egy másik játékost — csak akkor jön létre, ha az alatta lévő eszközök kifejezetten erre vannak építve. Szóval ma félrehúzom a függönyt néhány egyedi Unity-rendszerről, amiket a kliensoldalon barkácsoltunk össze: azok, amiket senki sem fog látni, de mindenki érezni fog.

Vágjunk bele.

Vizuálok, loot és PvP-magánélet

Ha van egy igazság az MMO-játékosokról, az ez: imádjuk a geart. És egy full-loot PvP-játékban, mint a Mortumus, a gear nem csak dopamincsepegtetés — hanem információ. Amit valaki visel, elárulja, mit tud veled csinálni.

Tartsd titokban, tartsd biztonságban — Equipment Visualizer

Korán rájöttünk, hogy van egy problémánk, amit sok MMO csendben figyelmen kívül hagy: ha a kliens ismeri minden látható játékos minden felszerelésdarabjának pontos item-ID-jét, egy eltökélt csaló kinyerheti a memóriából, és tudhatja a pontos statjaidat, mielőtt eldönti, hogy meggankel.

Szóval az Equipment Visualizer-ünk csinál valami kicsit paranoiásat. A saját karakterednél a teljes equipment-szolgáltatásból olvas — mindent látsz a gearedről. De minden más játékosnál csak egy lecsupaszított "visuals" blobot olvas, amit a szerver közzétesz. Látod a kardot, nem a stat lapot. Az idegenek item-ID-jei egyszerűen soha nem hagyják el Fin szerverét.

Apróság. De a memory-scraping cheateket jóval kevésbé hasznossá teszi. Jó üzlet.

Az animációs stack

A skill-alapú harc az animáción áll vagy bukik. Ha a windup nem olvasható, nem tudsz reagálni. Ha a találat nem ül, a harc súlytalannak érződik. Ha a halál úgy néz ki, mintha a modell egyszerűen… kikapcsolna, a hangulat felét elveszíted.

Player Animation Coordinator

Úgy kezdtük, ahogy a legtöbben: egyetlen hatalmas animation controller osztály, ami mindent próbált kezelni. Mozgás, varázslatok, halál, találatok, idle-ök — mind egy fájlban. Kb. két hét után káosz volt.

Szóval szétszedeztük. Most a Player Animation Coordinator egy apró belépési pont, ami felhoz egy rakás kis, specializált modult: mozgás, forgatás, támadás, varázslat, találatreakciók, halál, idle-ök. Mindegyik egy feladatot birtokol. Mindegyik önmagában olvasható. A bugok percek alatt felderíthetők, nem órák alatt.

Tisztább kód nekem. Feszesebb harc nektek.

Harcresponsivitás — Attack Animator & Spell Animator

Itt a klasszikus MMO-probléma: a szerver-autoritatív harc az egyetlen módja a csalás megállításának, de minden egyes cast szerveres megerősítésére várni olyan, mint a melasz.

A Spell Animator-unk kicsit csal — de becsületesen. Amikor megnyomod a spell billentyűt, a cast animáció azonnal lejátszódik — lokálisan prediktálva, szóval azonnalinak érződik. Aztán Fin szervere validálja, hogy a cast tényleg legális volt-e (cooldown lejárt, elég mana, érvényes target stb.). Ha megerősíti, semmi sem változik. Ha elutasítja, tisztán kilépünk belőle.

Az Attack Animator ugyanezt a táncot csinálja közelharccal, és még a csapássebességet is skálázza, hogy illeszkedjen ahhoz a tempóhoz, amit a szerver mond a fegyvered támadási sebességéről. A szemed responsív harcot lát. A szerver egy világot lát, aminek nem lehet hazudni.

Az a sweetspot a "jól érződik" és a "fair játék" között — ott él ez az egész játék.

A birodalom hangjai

A hang a hangulat 50%-a, és az emberek mindig alábecsülik, mennyi munka van benne.

Az atmoszféra felépítése — Audio Manager & Music Region System

A hagyományos játékok hajlamosak a zenét kemény vágással váltani, amikor átlépsz egy láthatatlan vonalat. Zavaró. Mi 3D-poligonzónákkal csináljuk. A Music Region System lehetővé teszi, hogy tetszőleges alakú területeket fessünk a világban — egy kísérteties liget, egy elátkozott kápolna, egy bosshoz vezető út — és ahogy besétálsz és kisétálsz, az Audio Manager simán crossfadeli a zenét. Nincs vágás. Nincs újraindítás ugyanazon a számon, ha épp átbillensz a határon.

És mivel mindez poololt hangforrásokon fut mixer-group routinggal, gyakorlatilag semmibe sem kerül a frame budgetből.

Character Audio Manager

Minden lépés a Mortumus-ban a karaktered animációjához és az alattad lévő felülethez van kötve — a kő úgy szól, mint a kő, a sár úgy szól, mint a sár. A spell hangok a képességhez kötöttek, a fegyvercsapások a fegyverhez. A Character Audio Manager az animációs események és az Audio Manager között ül, így új SFX csomagokat cserélhetünk faj/kaszt szerint anélkül, hogy gameplay kódhoz nyúlnánk.

Apróságok. Sok belőlük. Összeadódnak.

A vízpart

Minden dark fantasy világban van víz. Mocsarak, folyók, elárasztott romok, a tenger egy elátkozott fok szélén. És a víz egyike azoknak a dolgoknak, amik nagyon könnyen néznek ki hamisnak — különösen ott, ahol a szárazfölddel találkoznak. Az a csúnya poligonális vízszél, ahol a mesh metszi a terepet, egy olcsó kinézetű játék védjegye.

A mi vízalapunk

Nem a semmiből építettük a vizünket. A Unity valójában szállít egy fantasztikus demóprojektet Boat Attack néven, ami az egyik legjobb URP vízrendszert tartalmazza: valódi tükröződések, fénytörések, felhajtóerő, minden. Szóval a Boat Attack vizével kezdtünk alapként, mert azt a kereket újrafeltalálni hónapokba került volna valódi haszon nélkül.

De a Boat Attack-et, hát… hajókra építették. Szép, tiszta óceáni partvonalak. Az a partvonal-viselkedés, ami egy homokos tengerparton remekül néz ki, szörnyen néz ki a sáros, nádas, szabálytalan vízfolyások körül, amiket a Mortumus-ban tényleg akarunk. Szóval sebészi pontossággal kellett eljárnunk.

Az egyedi shader — Water Shoreline

Ahelyett, hogy közvetlenül a Unity csomagot szerkesztettük volna (ami minden frissítésnél elromlott volna), írtunk egy vékony custom shadert "WaterShoreline" néven, ami csak a pipeline azon részét cseréli ki, ami a partért felelős. Minden más — tükröződések, flow map-ek, kausztikák — egyenesen a Boat Attack-ből jön. Csak azt írjuk felül, amire szükségünk van.

A két nagy változás:

A kemény 2 méteres hab-cutoff eltűnt. A Boat Attack alapértelmezett habsávja fix mélységi cutoffal rendelkezik, ami azt az egyenletes "fehér gyűrűt" adja minden part körül. Ezt egy lágyabb lecsengéssel és egy scrollozó noise mezővel cseréltük le, így a hab most fokozatosan elhalványul, és organikus nyelvekre és ujjakra bomlik egy tökéletes szalag helyett.

Lágy partvonal-alpha. A poligonális vízszél-terep probléma? Magát a vizet halványítjuk átlátszóvá az utolsó fél méter mélységben. A vízszél teljesen eltűnik. A terep egyszerűen sötétebb lesz, ahogy a víz alá kerül, ahogy egy valódi nedves partvonal is teszi.

Mortumus water shoreline with soft foam and natural alpha blending

A folyórendszerünk

A helyzet a Boat Attack vizével az, hogy gyárilag gyönyörűen kezeli az óceánokat, de valójában nem tudja, mi az a folyó. A víz fodrozódhat helyben, de nem tud lefelé folyni és egy kanyar körül úgy, ahogy egy igazi folyó teszi. Ez probléma, ha a dark fantasy világ fele mocsaras, folyóvizes és átázott kell legyen.

Szóval építettünk rá egy folyórendszert.

Egy folyó a Mortumus-ban flow-útvonalként van megalkotva — egy egyszerű polyvonal pontokból, ami a folyó gerincét követi a forrástól a torkolatig. A designerek oda helyezik a pontokat, ahol vizet akarnak folyatni, és a shader elvégzi a többit: a vízfelszín minden pixeléhez megállapítja, melyik szegmense a flow-útvonalnak van legközelebb, és annak a szegmensnek az irányát használja lokális áramlatként. Eredmény: az egyenes szakasznál lévő víz egyenesen folyik, a kanyar belső oldalán lévő víz kanyarodik a kanyarral, és minden simán megy át a kettő között.

A textúrák, normálok és a hab mind ebbe a flow-irányba scrolloznak ahelyett, hogy céltalanul sodródnának. Tényleg láthatod, merre folyik a folyó.

Mortumus river with directional water flow Unity editor showing the river flow path authoring system

Mindez élőben hangolható a ShoreFoamTuner-ből, egy apró inspector komponens, amit bármelyik vizes jelenetbe betehetünk. Sliderek a hab lágyságához, noise skálához, noise erősséghez, sodródási sebességhez, alpha lecsengéshez. Változtasd meg egy egész tó hangulatát anélkül, hogy anyaghoz nyúlnál.

Közösség és trash talk: Chat & közösségi funkciók

Egy oldschool MMO legalább annyira szól az emberekről, mint a játékról. Ha a közösségi eszközök rosszul működnek, a világ üresnek érződik.

Overhead Chat System

Szöveg közvetlenül egy karakter feje fölé rögzítve, követi őket mozgás közben, távolodva elhalványul — a műfaj abszolút alapeleme, és olyasmi, amiért hajlandók vagyunk egy dombon meghalni.

Valódi beszélgetéssé alakítja a csoportokat. Lehetővé teszi, hogy harc közben trash-talkolj. Lehetővé teszi, hogy egy haldokló játékos utolsó szavai valami hülye és vicces legyen egy rendszernaplósor helyett. Az Overhead Chat System kezeli a poolingot, a distance cullingot és az anchor trackingot, így skálázódik még akkor is, ha húsz ember ordít egymásra egy szűk dungeonben.

Jól kinézni

Legyél őszinte — kínosan sok időt fogsz tölteni a karakterképernyőn. Mindannyian így vagyunk ezzel. Ez a legszebb tükör a játékban.

A karakter-előnézeti rendszer

A paper doll-unk nem egy sütött 2D render — hanem egy élő 3D jelenet, ami egy UI render texture-be van renderelve. Teljes megvilágítás, valódi geometria, minden felszerelésdarab rajtad valós időben. Forgasd, zoomolj, bámuld. Ez az a fajta feature, ami egyáltalán nem változtatja meg a gameplay-t, de abszolút megváltoztatja, hogyan érződik a játék.

Mortumus character creation screen with live 3D preview

Táskák megtöltése: Icon Studio

Íme az MMO-fejlesztés egy kis piszkos titka: ikonok. Százak kellenek belőlük. Minden kard, minden bájital, minden szemét loot, amit egy ládában találsz, saját kis 64x64-es négyzettel kell rendelkezzen, ami egy zsúfolt inventoryban is tisztán olvasható. És mindet úgy kell kinézniük, mintha ugyanahhoz a játékhoz tartoznának.

Nem elég lescreenelni egy 3D modellt és kész. A megvilágításnak konzisztensnek kell lennie. A kameraszögnek konzisztensnek kell lennie. És — ez az a rész, amit mindenki alábecsül — a kompozíciónak illeszkednie kell ahhoz a rácsmérethez, amit a tárgy elfoglal az inventoryban. Egy 1x1-es tőrnek és egy 2x3-as nagykardnak teljesen más kompozíció kell, különben mindkettő rosszul néz ki.

A mi megoldásunk: Icon Studio

Az Icon Studio egy egyedi Unity editor ablak, amit azért építettünk, hogy egy ember (általában én, motyogva) ki tudjon pörgetni száz konzisztens ikont anélkül, hogy megőrülne.

A workflow: dobj be egy listát item prefabokból. Mondd meg az eszköznek, milyen rácsméretet foglal el mindegyik az inventoryban — 1x1, 2x2, 2x3, 1x4, bármi. Állítsd be a kamerát egyszer. Mentsd el presetként. Nyomd meg a Generálást.

A varázslat az, hogy a rácsméret nem kozmetikai — a tényleges rendert vezérli. Egy 2x3-as tárgy 2x szélességben és 3x magasságban renderelődik (egy 512px-es alapból), így amikor az inventorydban ül, a proporciók helyesek, nem nyújtottak. Egy hosszúkard tényleg kitölt egy 1x4-es slotot átlósan. Egy bájitalüveg tényleg belefér 1x1-be. Az inventory úgy érződik, mintha valódi tárgyakat rendeznél.

Ezen felül az eszköz kezeli: átlátszó vagy egyedi hátteret tárgyankét, bone pose capture-t, hogy csontváz-alapú tárgyak elmenthessék a megjelenítési pózukat anélkül, hogy a gameplay riget zavarnák, és preseteket egész tárgy-kategóriákhoz — minden fejsze ugyanazzal a kamerával renderelődik, minden bájital egy másikkal. Konzisztencia ingyen.

A végeredmény az, hogy minden ikon a játékban — azok, amik 32 pixelen is olvashatók egy sűrű inventory rácsban — a tényleges in-game modellből lett renderelve, abban a tényleges formában, amit a tárgy a táskádban elfoglal. Nincs kiszervezett 2D művészet. Nincs inkonzisztens megvilágítás. Nincs tőr, ami valahogy nagyobbnak néz ki, mint egy nagykard a UI-ban.

Ez az a fajta eszköz, amit senki sem lát. Ez az oka annak is, hogy az inventory nem úgy néz ki, mint egy zacskó összevissza stock art.

Legközelebb

Ezen rendszerek egyike sem a Mortumus főcím-featureje. Senki sem fogja megvenni a játékot, mert a lépések jól szólnak, vagy mert a csontvázak fizikás darabokra robbannak. De ezek a csontok minden alatt — a láthatatlan munka, amitől a nagy dolgok jól érződnek, amikor rájuk épülnek.

Ezzel az alappal a helyén Fin és én megépíthetjük azt a tényleges komor, brutális full-loot világot, amit két éve firkálunk füzetekbe — olyan tempóban, ami nem vált ki belőlünk késztetést, hogy a számítógépeinket egy folyóba hajítsuk.

— AL