Hej allesammen, det er AL. Velkommen til det første kig bag kulisserne på Mortumus.

Mens Fin er begravet i serverminerne og kæmper med databaser, abonnementer og al den skræmmende distributed-systems-trolddom, der holder verdenen i live, er jeg den i den anden ende, der sørger for, at hvert sværdhug, hvert skridt, hver fakkelflimren og hvert stykke rustning rent faktisk ser godt ud og føles rigtigt på din skærm.

At bygge et dark fantasy MMO er ikke den slags, man bare kan trække-og-slippe sammen fra en asset store. Den rå, oldschool-følelse vi jagter — vægten i kampene, knirken fra din rustning, rædslerne ved at se en anden spiller i horisonten — opstår kun, når værktøjerne nedenunder er bygget specifikt til det. Så i dag trækker jeg forhænget til side og viser jer nogle af de specialbyggede Unity-systemer, vi har sammensat på klientsiden: dem, ingen nogensinde vil se, men som alle vil mærke.

Lad os komme i gang.

Visuals, loot og PvP-privatliv

Hvis der er én sandhed om MMO-spillere, er det denne: vi elsker gear. Og i et full-loot PvP-spil som Mortumus er gear ikke bare et dopamindryp — det er information. Hvad nogen har på, fortæller dig, hvad de kan gøre ved dig.

Hold det hemmeligt, hold det sikkert — Equipment Visualizer

Tidligt indså vi, at vi havde et problem, som mange MMO'er stiltiende ignorerer: hvis klienten kender den præcise item-ID på hvert stykke gear på hver spiller i synsfeltet, kan en ihærdig snyder skrabe det ud af hukommelsen og kende dine præcise stats, før de beslutter sig for at ganke dig.

Så vores Equipment Visualizer gør noget en smule paranoid. For din egen karakter læser den fra den fulde equipment-service — du ser alt om dit gear. Men for alle andre spillere læser den kun en strippet "visuals"-blob, som serveren offentliggør. Du ser sværdet, ikke stat-arket. Fremmedes item-ID'er forlader simpelthen aldrig Fins server.

Det er en lille ting. Det gør også memory-scraping-cheats langt mindre brugbare. God handel.

Animation-stakken

Skill-baseret kamp lever eller dør med animationen. Hvis windup'en ikke er læsbar, kan du ikke reagere. Hvis slaget ikke lander, føles kampen vægtløs. Hvis døden ligner, at modellen bare… slukker, mister du halvdelen af stemningen.

Player Animation Coordinator

Vi startede, som de fleste gør: én kæmpestor animation-controller-klasse, der forsøgte at håndtere alt. Bevægelse, trylleformularer, død, hits, idles — alt i samme fil. Efter cirka to uger var det kaos.

Så vi brød det fra hinanden. Nu er Player Animation Coordinator et bitte lille indgangspunkt, der spinner en stak af små, specialiserede moduler op: bevægelse, rotation, angreb, trylleformular, hitreaktioner, død, idles. Hvert modul ejer én opgave. Hvert modul er læsbart i sig selv. Fejl tager minutter i stedet for timer at spore op.

Renere kode for mig. Strammere kamp for jer.

Kampresponsivitet — Attack Animator & Spell Animator

Her er det klassiske MMO-problem: server-autoritativ kamp er den eneste måde at stoppe snyd på, men at vente på, at serveren bekræfter hvert eneste cast, føles som sirup.

Vores Spell Animator snyder en smule — men ærligt. Når du trykker på din spell-tast, spiller cast-animationen med det samme — lokalt forudsagt, så det føles øjeblikkeligt. Derefter validerer Fins server, om castet rent faktisk var lovligt (cooldown overstået, nok mana, gyldigt mål osv.). Bekræfter den, ændrer sig intet. Afviser den, bryder vi rent ud af det.

Attack Animator laver den samme dans for nærkamp, og den skalerer endda svinghastigheden til at matche den kadence, serveren siger, din våben angriber med. Dine øjne ser responsiv kamp. Serveren ser en verden, man ikke kan lyve for.

Det sweetspot mellem "føles godt" og "spiller fair" er der, hele dette spil lever.

Rigets lyde

Lyd udgør 50% af stemningen, og folk undervurderer altid, hvor meget arbejde det kræver.

At sætte atmosfæren — Audio Manager & Music Region System

Traditionelle spil har tendens til at skifte musik med et hårdt klip, når man krydser en usynlig linje. Det er brutalt. Vi gør det med 3D-polygonzoner. Music Region System lader os male vilkårligt formede områder i verdenen — en hjemsøgt lund, et forbandet kapel, tilgangen til en boss — og når du går ind og ud, crossfader Audio Manager soundtracket blødt. Ingen klip. Ingen genstart af samme nummer, hvis du lige tripper over grænsen.

Og fordi alt dette kører gennem poolede lydkilder med mixer-group-routing, koster det praktisk talt ingenting i frame budget.

Character Audio Manager

Hvert fodtrin i Mortumus er koblet til din karakters animation og overfladen under dig — sten lyder som sten, mudder lyder som mudder. Spell-lyde er bundet til evnen, våbensving til våbnet. Character Audio Manager sidder mellem animation-events og Audio Manager, så vi kan bytte nye SFX-pakker ind per race/klasse uden at røre gameplay-kode.

Små ting. Mange af dem. De lægger sig sammen.

Vandkanten

Enhver dark fantasy-verden har vand. Sumpe, floder, oversvømmede ruiner, havet ved kanten af et forbandet forbjerg. Og vand er en af de ting, der meget hurtigt ser falsk ud — især der, hvor det møder land. Den grimme polygonale vandlinje, hvor meshet skærer terrainet, er kendetegnet for et spil, der ser billigt ud.

Vores vandgrundlag

Vi byggede ikke vores vand fra bunden. Unity leverer faktisk et fantastisk demoprojekt kaldet Boat Attack, der inkluderer et af de bedste URP-vandsystemer derude: ægte refleksioner, refraktioner, opdrift, det hele. Så vi startede med Boat Attacks vand som vores fundament, fordi det at genopfinde det hjul ville have kostet os måneder uden reel gevinst.

Men Boat Attack var bygget til, ja… både. Pæne, rene oceankystlinjer. Den kystlinjeopførsel, der ser fantastisk ud på en sandstrand, ser forfærdelig ud omkring de mudrede, sivbevoksede, uregelmæssige vandløb, vi faktisk vil have i Mortumus. Så vi måtte gå kirurgisk til værks.

Den tilpassede shader — Water Shoreline

I stedet for at redigere Unity-pakken direkte (hvilket ville have gået i stykker ved hver opdatering), skrev vi en tynd custom shader "WaterShoreline", der kun bytter den del af pipelinen ud, der er ansvarlig for kysten. Alt andet — refleksioner, flow maps, caustics — kommer direkte fra Boat Attack. Vi tilsidesætter kun det, vi har brug for.

De to store ændringer:

Den hårde 2-meter skum-cutoff er væk. Boat Attacks standard-skumbånd har en fast dybde-cutoff, som giver dig den ensartede "ring af hvidt" rundt om hver kyst. Vi erstattede den med et blødere fald plus et scrollende noise-felt, så skummet nu toner gradvist ud og bryder op i organiske tunger og fingre i stedet for et perfekt bånd.

Blød kystlinje-alpha. Det problem med den polygonale vandlinje mod terrainet? Vi fader selve vandet til gennemsigtigt over den sidste halve meter dybde. Vandlinjen forsvinder helt. Terrainet bliver bare mørkere, jo dybere det går under vand, ligesom en rigtig våd kystlinje gør.

Mortumus water shoreline with soft foam and natural alpha blending

Vores flodsystem

Det er det med Boat Attacks vand: ud af boksen håndterer det oceaner smukt, men det ved ikke rigtig, hvad en flod er. Vand kan krusne på stedet, men det kan ikke flyde nedstrøms og rundt om et sving, som en rigtig flod gør. Det er et problem, når halvdelen af din dark fantasy-verden skal være sumpet, flodpræget og gennemblødt.

Så vi byggede et flodsystem ovenpå det.

En flod i Mortumus er skabt som en flow-sti — en simpel polylinje af punkter, der følger flodens rygrad fra kilde til munding. Designere placerer punkterne, hvor de vil have vand til at flyde, og shaderen klarer resten: for hvert pixel af vandoverfladen finder den ud af, hvilket segment af flow-stien der er tættest, og bruger det segments retning som den lokale strøm. Resultat: vand ved en lige strækning flyder lige, vand på indersiden af et sving kurver med svinget, og alt overgår blødt imellem.

Teksturerne, normalerne og skummet scroller alle langs den flow-retning i stedet for at drive formålsløst rundt. Du kan faktisk se, hvilken vej floden løber.

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

Alt sammen kan justeres live fra ShoreFoamTuner, en lille inspector-komponent, vi dropper på enhver scene med vand. Slidere til skumblødhed, noise-skala, noise-styrke, drift-hastighed, alpha-fald. Skift stemningen i en hel sø uden at røre et materiale.

Community og trash talk: Chat & socialt

Et oldschool MMO handler lige så meget om menneskene som om spillet. Hvis de sociale værktøjer føles dårlige, føles verdenen tom.

Overhead Chat System

Tekst forankret lige over en karakters hoved, der følger dem, når de bevæger sig, og toner ud på afstand — det er en absolut klassiker i genren, og noget vi vil dø på en bakketop for at forsvare.

Det forvandler grupper til rigtige samtaler. Det lader dig trash-talke nogen midt i en kamp. Det lader de sidste ord fra en døende spiller være noget dumt og sjovt i stedet for en systemlogslinje. Overhead Chat System håndterer pooling, distance culling og anchor tracking, så det skalerer selv når tyve mennesker råber ad hinanden i en trang dungeon.

At se godt ud

Vær ærlig — du kommer til at bruge en pinlig mængde tid på karakterskærmen. Det gør vi alle. Det er det pæneste spejl i spillet.

Karakterpreview-systemet

Vores paper doll er ikke et bagt 2D-render — det er en live 3D-scene renderet ind i en UI render texture. Fuld belysning, ægte geometri, hvert stykke gear på dig i realtid. Drej det, zoom ind, stir på det. Det er den slags feature, der slet ikke ændrer gameplay, og absolut ændrer, hvordan spillet føles at eje.

Mortumus character creation screen with live 3D preview

At fylde taskerne: Icon Studio

Her er en lille beskidt hemmelighed ved MMO-udvikling: ikoner. Du har brug for hundredvis af dem. Hvert sværd, hver eliksir, hvert stykke skrald-loot, du finder i en kiste, har brug for sit eget lille 64x64-kvadrat, der er læsbart i et rodet inventar. Og de skal alle se ud, som om de hører til det samme spil.

Du kan ikke bare tage et screenshot af en 3D-model og kalde det en dag. Belysningen skal være konsistent. Kameravinklen skal være konsistent. Og — det er den del, alle undervurderer — kompositionen skal matche den gitterstørrelse, itemmet vil optage i inventaret. En 1x1-dolk og et 2x3-storsværd kræver vidt forskellige kompositioner, ellers ser de begge forkerte ud.

Vores løsning: Icon Studio

Icon Studio er et specialbygget Unity editor-vindue, vi har bygget, så én person (normalt mig, mens jeg mumler) kan churne hundrede konsistente ikoner ud uden at miste forstanden.

Workflowet: smid en liste af item-prefabs ind. Fortæl værktøjet, hvilken gitterstørrelse hvert item optager i inventaret — 1x1, 2x2, 2x3, 1x4, hvad som helst. Indstil kameraet én gang. Gem indstillingen som et preset. Tryk Generer.

Det smarte er, at gitterstørrelsen ikke er kosmetisk — den driver det faktiske render. Et 2x3-item renderes med 2x bredde og 3x højde (af en 512px base), så når det sidder i dit inventar, er proportionerne korrekte, ikke strakte. Et langsværd fylder virkelig et 1x4-slot diagonalt. En eliksirflaske passer virkelig i 1x1. Inventaret føles, som om du organiserer rigtige genstande.

Oven i det håndterer værktøjet: gennemsigtige eller tilpassede baggrunde per item, bone pose capture, så skelet-baserede items kan gemme deres visningspose uden at forstyrre gameplay-rigget, og presets for hele item-kategorier — alle økser renderes med det samme kamera, alle eliksirer med et andet. Konsistens gratis.

Slutresultatet er, at hvert ikon i spillet — dem, der er læsbare ved 32 pixels i et tæt inventar-gitter — blev renderet fra den faktiske in-game model, i den faktiske form, som itemmet optager i din taske. Ingen outsourcet 2D-kunst. Ingen inkonsistent belysning. Ingen dolk, der på en eller anden måde ser større ud end et storsværd i UI'en.

Det er den slags værktøj, ingen ser. Det er også grunden til, at inventaret ikke ligner en pose fuld af sammenblandet stock art.

Indtil næste gang

Ingen af disse systemer er overskriftsfeatures i Mortumus. Ingen kommer til at købe spillet, fordi fodtrinene lyder godt, eller fordi skeletter eksploderer i fysikstyrede stumper. Men det er knoglerne under det hele — det usynlige arbejde, der sørger for, at de store ting føles rigtigt, når de lander ovenpå.

Med dette fundament på plads kan Fin og jeg bygge den faktiske dystre, brutale full-loot-verden, vi har skitseret i notesbøger i to år — i et tempo, der ikke får os til at ville kaste vores computere i en flod.

— AL