Hallo allemaal, AL hier. Welkom bij de eerste blik achter de schermen van Mortumus.
Terwijl Fin diep in de servermijnen zit te worstelen met databases, abonnementen en al die enge distributed-systems-magie die de wereld draaiende houdt, ben ik degene aan de andere kant die ervoor zorgt dat elke zwaardslag, voetstap, fakkelvlam en elk stuk wapenrusting er daadwerkelijk goed uitziet en goed aanvoelt op je scherm.
Een dark fantasy MMO bouwen is niet iets wat je even in elkaar klikt vanuit een asset store. Dat ruwe, oldschool-gevoel waar we naar streven (het gewicht van het gevecht, het kraken van je wapenrusting, de angst als je een andere speler aan de horizon ziet) ontstaat alleen als het gereedschap eronder specifiek daarvoor gebouwd is. Dus vandaag trek ik het gordijn open voor een paar van de custom Unity-systemen die we aan de clientzijde in elkaar hebben geknutseld: de systemen die niemand ooit zal zien, maar die iedereen zal voelen.
Laten we beginnen.
Visuals, Loot en PvP-privacy
Als er een waarheid is over MMO-spelers, dan is het deze: we houden van uitrusting. En in een full-loot PvP-game als Mortumus is uitrusting niet alleen een dopamine-druppel, het is informatie. Wat iemand draagt vertelt je wat diegene met je kan doen.
Houd het Geheim, Houd het Veilig: Equipment Visualizer
AL vroeg beseften we dat we een probleem hadden dat veel MMO's stilletjes negeren: als de client het exacte item-ID kent van elk stuk uitrusting van elke speler in zicht, kan een vastberaden cheater dat uit het geheugen schrapen en je exacte stats kennen voordat ze besluiten je te ganken.
Onze Equipment Visualizer doet daarom iets lichtelijk paranoide. Voor je eigen personage leest hij uit de volledige equipment-service: je ziet alles over je uitrusting. Maar voor elke andere speler leest hij alleen een gestripte "visuals"-blob die de server publiceert. Je ziet het zwaard, niet het stat-overzicht. De item-ID's van vreemden verlaten Fin's server simpelweg nooit.
Het is een klein ding. Het maakt memory-scraping cheats ook een stuk minder bruikbaar. Goede deal.
De Animatie-stack
Skill-based combat staat of valt met animatie. Als de aanloop niet leesbaar is, kun je niet reageren. Als de klap niet landt, voelt het gevecht gewichtloos. Als de dood eruitziet alsof het model gewoon... uitgeschakeld wordt, verlies je de helft van de sfeer.
Player Animation Coordinator
We begonnen zoals de meesten: een gigantische animation-controller-klasse die alles probeerde te beheren. Beweging, spreuken, dood, treffers, idles, alles in hetzelfde bestand. Binnen twee weken was het een puinhoop.
Dus braken we het op. Nu is de Player Animation Coordinator een klein startpunt dat een stapel kleine, gespecialiseerde modules opstart: beweging, rotatie, aanval, spreuk, treffer-reacties, dood, idles. Elk onderdeel beheert een taak. Elk onderdeel is op zichzelf leesbaar. Bugs kosten minuten in plaats van uren om op te sporen.
Schonere code voor mij. Strakker gevecht voor jou.
Responsiviteit in Gevecht: Attack Animator & Spell Animator
Dit is het klassieke MMO-probleem: server-authoritative combat is de enige manier om cheaten te stoppen, maar wachten tot de server elke cast bevestigt voelt als stroop.
Onze Spell Animator smokkelt een beetje, maar eerlijk. Als je op je spreuktoets drukt, speelt de cast-animatie onmiddellijk af, lokaal voorspeld, zodat het instant aanvoelt. Dan valideert Fin's server of de cast daadwerkelijk legaal was (off cooldown, genoeg mana, geldig doel, enzovoort). Als het bevestigt, verandert er niets. Als het afwijst, breken we er netjes uit.
Attack Animator doet dezelfde dans voor melee, en schaalt zelfs de zwaaisnelheid naar welk tempo de server zegt dat je wapen aanvalt. Jouw ogen zien responsief gevecht. De server ziet een wereld waar niet tegen gelogen kan worden.
Die sweet spot tussen "voelt goed" en "speelt eerlijk" is waar deze hele game leeft.
De Geluiden van het Rijk
Audio is 50% van de sfeer en mensen onderschatten altijd hoeveel werk het kost.
De Atmosfeer Neerzetten: de Audio Manager & Music Region System
Traditionele games wisselen muziek door hard te cutten als je een onzichtbare lijn oversteekt. Dat is schokkerig. Wij doen het met 3D-polygoonzones. Het Music Region System laat ons willekeurig gevormde gebieden in de wereld schilderen (een spookachtig bos, een vervloekte kapel, de aanloop naar een boss) en terwijl je erin en eruit loopt, crossfadet de Audio Manager de soundtrack vloeiend. Geen cuts. Geen herstart van dezelfde track als je net over de grens stapt.
En omdat dit allemaal draait via gepoolde audiobronnen met mixer-group-routing, kost het praktisch niets aan framebudget.
De Character Audio Manager
Elke voetstap in Mortumus is gekoppeld aan de animatie van je personage en het oppervlak onder je. Steen klinkt als steen, modder klinkt als modder. Spreukgeluiden zijn gekoppeld aan de vaardigheid, wapenzwaaien aan het wapen. De Character Audio Manager zit tussen de animatie-events en de Audio Manager, zodat we nieuwe SFX-packs per ras/klasse kunnen inwisselen zonder gameplay-code aan te raken.
Kleine dingen. Veel ervan. Ze tellen op.
De Waterkant
Elke dark fantasy-wereld heeft water. Moerassen, rivieren, overstroomde ruines, de zee aan de rand van een vervloekte kaap. En water is een van die dingen die er heel snel nep uitzien, vooral waar het land raakt. Die lelijke polygonale waterlijn waar het mesh het terrein kruist is het kenmerk van een goedkoop ogende game.
Onze Water-basis
We hebben ons water niet vanaf nul gebouwd. Unity levert eigenlijk een fantastisch demoproject genaamd Boat Attack dat een van de beste URP-watersystemen bevat: echte reflecties, refracties, drijfvermogen, alles erop en eraan. Dus begonnen we met het water van Boat Attack als onze basis, want dat wiel opnieuw uitvinden had ons maanden gekost zonder echt voordeel.
Maar Boat Attack was gebouwd voor, nou ja... boten. Mooie strakke oceaankustlijnen. Het kustlijngedrag dat er geweldig uitziet op een zandstrand ziet er verschrikkelijk uit rond de modderige, rietige, onregelmatige waterwegen die we in Mortumus willen. Dus moesten we chirurgisch te werk gaan.
De Custom Shader: Water Shoreline
In plaats van het Unity-pakket direct te bewerken (wat bij elke update zou breken), schreven we een dunne custom shader "WaterShoreline" die alleen het stuk van de pipeline vervangt dat verantwoordelijk is voor de kust. AL het andere (reflecties, flow maps, caustics) komt rechtstreeks van Boat Attack. We overschrijven alleen wat we nodig hebben.
De twee grote veranderingen:
De harde 2-meter schuimgrens is weg. Het standaard schuimband van Boat Attack heeft een vaste dieptegrens, wat je die uniforme "ring van wit" rond elke kust geeft. We hebben het vervangen door een zachtere afname plus een scrollend ruisveld, zodat het schuim nu geleidelijk vervaagt en opbreekt in organische tongen en vingers in plaats van een perfect lint.
Zachte kustlijn-alpha. Dat probleem van de polygonale waterlijn tegen het terrein? We laten het water zelf naar transparant vervagen over de laatste halve meter diepte. De waterlijn verdwijnt helemaal. Het terrein wordt gewoon donkerder naarmate het onder water gaat, zoals een echte natte kustlijn doet.
Ons Rivierensysteem
Het punt met het water van Boat Attack: standaard werkt het prachtig voor oceanen, maar het weet eigenlijk niet wat een rivier is. Water kan ter plekke rimpelen, maar het kan niet stroomafwaarts en om een bocht stromen zoals een echte rivier doet. Dat is een probleem als de helft van je dark fantasy-wereld moerassig, rivierachtig en doorweekt hoort te zijn.
Dus bouwden we er een rivierensysteem bovenop.
Een rivier in Mortumus wordt vormgegeven als een stroompad: een simpele polylijn van punten die de ruggengraat van de rivier volgt van bron tot monding. Ontwerpers plaatsen de punten waar ze water willen laten stromen, en de shader doet de rest: voor elke pixel van het wateroppervlak berekent hij welk segment van het stroompad het dichtst bij is en gebruikt de richting van dat segment als de lokale stroming. Resultaat: water bij een recht stuk stroomt recht, water aan de binnenkant van een bocht buigt mee met de bocht, en alles gaat er vloeiend tussen over.
De texturen, normals en het schuim scrollen allemaal mee in die stroomrichting in plaats van doelloos te drijven. Je kunt daadwerkelijk zien welke kant de rivier op gaat.
Dit alles is live afstembaar via ShoreFoamTuner, een klein inspector-component dat we op elke scene met water plaatsen. Schuifbalken voor schuimzachtheid, ruisschaal, ruissterkte, driftsnelheid, alpha-afname. Verander de sfeer van een heel meer zonder een materiaal aan te raken.
Community en Trashtalk: Chat & Sociaal
Een oldschool MMO draait net zoveel om de mensen als om de game. Als de sociale tools slecht aanvoelen, voelt de wereld leeg.
Overhead Chat System
Tekst verankerd recht boven het hoofd van een personage, meebewegend terwijl ze lopen, vervagend op afstand. Het is een absoluut kenmerk van het genre, en iets waar we tot de dood voor strijden.
Het maakt groepen tot echte gesprekken. Het laat je iemand uitdagen midden in een gevecht. Het zorgt ervoor dat de laatste woorden van een stervende speler iets doms en grappigs zijn in plaats van een systeemlogregel. Het Overhead Chat System regelt pooling, distance culling en anchor tracking zodat het schaalt, zelfs als twintig mensen tegen elkaar schreeuwen in een krappe dungeon.
Er Goed Uitzien
Wees eerlijk: je gaat een genant lange tijd doorbrengen op het personagescherm. We doen het allemaal. Het is de mooiste spiegel in de game.
Het Character Preview Systeem
Onze papieren pop is geen gebakken 2D-render, het is een live 3D-scene gerenderd in een UI render texture. Volledige belichting, echte geometrie, elk stuk uitrusting op je in real time. Draai het, zoom erin, staar ernaar. Het is het soort feature dat gameplay helemaal niet verandert, maar absoluut verandert hoe de game aanvoelt om te bezitten.
De Tassen Vullen: Icon Studio
Hier is een vuil geheimpje van MMO-ontwikkeling: iconen. Je hebt er honderden nodig. Elk zwaard, elke trank, elk stuk rotzooi dat je in een kist vindt heeft zijn eigen kleine 64x64 vierkantje nodig dat goed leesbaar is in een rommelige inventaris. En ze moeten er allemaal uitzien alsof ze bij dezelfde game horen.
Je kunt niet zomaar een screenshot van een 3D-model maken en het daarbij laten. De belichting moet consistent zijn. De camerahoek moet consistent zijn. En dit is het stuk dat iedereen onderschat: de kadrering moet passen bij het rasterformaat dat het item inneemt in de inventaris. Een 1x1 dolk en een 2x3 tweehander hebben totaal verschillende composities nodig, anders zien ze er allebei verkeerd uit.
Onze Oplossing: Icon Studio
Icon Studio is een custom Unity editor-venster dat we hebben gebouwd zodat een persoon (meestal ik, mompelend) honderd consistente iconen kan produceren zonder gek te worden.
De workflow: gooi er een lijst item-prefabs in. Vertel de tool welk rasterformaat elk item inneemt in de inventaris: 1x1, 2x2, 2x3, 1x4, wat dan ook. Kadreer de camera een keer. Sla de kadrering op als preset. Klik op Generate.
De magie is dat het rasterformaat niet cosmetisch is: het stuurt de daadwerkelijke render aan. Een 2x3 item wordt gerenderd op 2x breedte en 3x hoogte (van een 512px basis), zodat wanneer het in je inventaris zit de verhoudingen kloppen, niet uitgerekt. Een longsword vult oprecht een 1x4 slot diagonaal. Een drankflesje past oprecht in een 1x1. De inventaris voelt alsof je echte voorwerpen organiseert.
Daarbovenop handelt de tool: transparante of aangepaste achtergronden per item, bone pose capture zodat skeleton-based items hun displaypose kunnen vastleggen zonder de gameplay-rig te verstoren, en presets voor hele itemcategorieen. Alle bijlen renderen met dezelfde camera, alle drankjes met een andere. Consistentie gratis.
Het eindresultaat is dat elk icoon in de game (de iconen die goed leesbaar zijn op 32 pixels in een dicht inventarisraster) gerenderd is van het daadwerkelijke in-game model, in de daadwerkelijke vorm die dat item inneemt in je tas. Geen uitbestede 2D-kunst. Geen verkeerde belichting. Geen dolk die er op de een of andere manier groter uitziet dan een tweehander in de UI.
Het is het soort tool dat niemand ziet. Het is ook de reden dat de inventaris er niet uitziet als een tas vol bij elkaar geraapte stockart.
Tot de Volgende Keer
Geen van deze systemen zijn de koppen van Mortumus. Niemand gaat de game kopen omdat de voetstappen lekker klinken of omdat skeletten exploderen in physics-brokken. Maar dit zijn de botten onder alles: het onzichtbare werk dat ervoor zorgt dat de grote dingen goed aanvoelen als ze erop landen.
Met deze fundering op zijn plek kunnen Fin en ik de daadwerkelijke grimmige, brutale full-loot wereld bouwen die we al twee jaar in notitieboeken schetsen, in een tempo dat ons niet doet overwegen onze computers in een rivier te gooien.
-- AL