Hej allihopa, AL här. Välkomna till den första titt bakom kulisserna på Mortumus.
Medan Fin är begravd i servergruvorna och brottas med databaser, prenumerationer och all den skrämmande distribuerade-system-magin som håller världen vid liv, är jag den i andra änden som ser till att varje svärdssvingning, varje steg, varje fackelflimmer och varje rustningsdel faktiskt ser ut och känns rätt på din skärm.
Att bygga ett dark fantasy-MMO är inte något man drar och släpper ihop från en asset store. Den råa, oldschool-känslan vi jagar (tyngden i striden, knarrandet av din rustning, skräcken av att se en annan spelare vid horisonten) uppstår bara när verktygen under är byggda specifikt för det. Så idag drar jag undan ridån för några av de anpassade Unity-systemen vi har skruvat ihop på klientsidan: de som ingen någonsin kommer se, men som alla kommer känna.
Kör igång.
Grafik, Loot och PvP-integritet
Om det finns en sanning om MMO-spelare så är det den här: vi älskar utrustning. Och i ett full loot PvP-spel som Mortumus är utrustning inte bara en dopaminkick, det är information. Vad någon har på sig berättar vad de kan göra med dig.
Håll det hemligt, håll det säkert: Equipment Visualizer
Tidigt insåg vi att vi hade ett problem som många MMOs tyst ignorerar: om klienten vet det exakta item-ID:t för varje utrustningsdel på varje synlig spelare, kan en bestämd fuskare skrapa ut det ur minnet och veta dina exakta stats innan de bestämmer sig för att bakhålla dig.
Så vår Equipment Visualizer gör något lite paranoid. För din egen karaktär läser den från den fulla utrustningsservicen: du ser allt om din utrustning. Men för varje annan spelare läser den bara en nedbantad "visuals"-blob som servern publicerar. Du ser svärdet, inte stat-bladet. Okändas item-ID:n lämnar helt enkelt aldrig Fins server.
Det är en liten sak. Den gör också memory scraping-fusk mycket mindre användbara. Bra byte.
Animationsstacken
Skicklighetsbaserad strid lever eller dör med animationen. Om windupen inte är läsbar kan du inte reagera. Om träffen inte landar känns striden viktlös. Om döden ser ut som att modellen bara... stängs av, förlorar du halva stämningen.
Player Animation Coordinator
Vi började som de flesta gör: en gigantisk animation controller-klass som försökte hantera allt. Rörelse, trollformler, död, träffar, idle, allt i samma fil. Inom ungefär två veckor var det kaos.
Så vi bröt isär det. Nu är Player Animation Coordinator en pytteliten ingångspunkt som startar en stack av små, specialiserade moduler: rörelse, rotation, attack, trollformel, träffreaktioner, död, idle. Var och en äger ett jobb. Var och en är läsbar för sig. Buggar tar minuter istället för timmar att spåra.
Renare kod för mig. Stramare strid för er.
Stridsrespons: Attack Animator & Spell Animator
Här är det klassiska MMO-problemet: server-authoritativ strid är enda sättet att stoppa fusk, men att vänta på att servern bekräftar varje cast känns som sirap.
Vår Spell Animator fuskar lite, men ärligt. När du trycker på din trollformelsknapp spelas cast-animationen omedelbart, lokalt förutspådd, så den känns instant. Sen validerar Fins server om casten faktiskt var laglig (cooldown klar, tillräckligt med mana, giltigt mål, osv.). Om den godkänner ändras ingenting. Om den avvisar backar vi ut snyggt.
Attack Animator gör samma dans för närstrid, och skalar till och med svingningshastigheten för att matcha den kadens servern anger för ditt vapen. Dina ögon ser responsiv strid. Servern ser en värld man inte kan ljuga för.
Den där sweet spot mellan "känns bra" och "spelar rättvist" är där hela det här spelet lever.
Rikets ljud
Ljud är 50% av stämningen, och folk underskattar alltid hur mycket jobb det tar.
Sätta atmosfären: Audio Manager & Music Region System
Traditionella spel brukar byta musik med ett hårt klipp när du korsar en osynlig linje. Det är störande. Vi gör det med 3D-polygonzoner. Music Region System låter oss måla godtyckligt formade områden i världen (en hemsökt lund, ett förbannat kapell, vägen mot en boss), och när du går in och ut tonar Audio Manager soundtracket mjukt. Inga klipp. Ingen omstart av samma spår om du kliver över gränsen.
Och eftersom allt det här körs genom poolade ljudkällor med mixer-group-routing kostar det i princip ingenting i frame budget.
Character Audio Manager
Varje steg i Mortumus är kopplat till din karaktärs animation och ytan under dig: sten låter som sten, lera låter som lera. Trollformelsljud är kopplade till förmågan, vapensvingar till vapnet. Character Audio Manager sitter mellan animationshändelserna och Audio Manager så att vi kan byta in nya SFX-paket per ras/klass utan att röra gameplay-kod.
Små saker. Massor av dem. De adderar upp.
Vattnets kant
Varje dark fantasy-värld har vatten. Träsk, floder, översvämnade ruiner, havet vid kanten av en förbannad udde. Och vatten är en av de sakerna som ser falskt ut väldigt lätt, speciellt där det möter land. Den fula polygonala vattenlinjen där meshen korsar terrängen är kännetecknet för ett billigt utseende spel.
Vår vattenbas
Vi byggde inte vårt vatten från grunden. Unity levererar faktiskt ett fantastiskt demoprojekt som heter Boat Attack som inkluderar ett av de bästa URP-vattensystemen som finns: riktiga reflektioner, refraktioner, flytkraft, hela paketet. Så vi började med Boat Attacks vatten som grund, eftersom det hade kostat oss månader att uppfinna hjulet på nytt utan verklig vinst.
Men Boat Attack byggdes för, ja... båtar. Fina rena havsstrandlinjer. Strandlinjebeteendet som ser bra ut på en sandstrand ser hemskt ut kring de leriga, vass-fyllda, oregelbundna vattenvägarna vi faktiskt vill ha i Mortumus. Så vi fick vara kirurgiska.
Den anpassade shadern: Water Shoreline
Istället för att redigera Unity-paketet direkt (vilket hade gått sönder vid varje uppdatering) skrev vi en tunn anpassad shader "WaterShoreline" som byter ut bara den del av pipelinen som ansvarar för stranden. Allt annat (reflektioner, flow maps, caustics) kommer rakt från Boat Attack. Vi skriver bara över det vi behöver.
De två stora ändringarna:
Den hårda 2-meters skumgränsen är borta. Boat Attacks standardskumband har en fast djupgräns, som ger dig den där uniforma "vita ringen" runt varje strand. Vi ersatte den med en mjukare falloff plus ett rullande brusfält, så skummet nu tonar ut gradvis och bryts upp i organiska tungor och fingrar istället för ett perfekt band.
Mjuk strandlinje-alpha. Det där problemet med polygonal vattenlinje mot terräng? Vi tonar själva vattnet till transparent över den sista halvmetern av djup. Vattenlinjen försvinner helt. Terrängen blir bara mörkare när den går under vattnet, precis som en riktig blöt strandlinje gör.
Vårt flodsystem
Grejen med Boat Attacks vatten är att det ur lådan hanterar oceaner vackert, men det vet inte riktigt vad en flod är. Vatten kan krusas på plats, men det kan inte flöda nedströms och runt en kurva som en riktig flod gör. Det är ett problem när halva din dark fantasy-värld ska vara sumpig, flodrik och genomblöt.
Så vi byggde ett flodsystem ovanpå.
En flod i Mortumus skapas som en flödesväg: en enkel polylinje av punkter som spårar flodens ryggrad från källa till mynning. Designers placerar punkterna där de vill att vatten ska flöda, och shadern gör resten: för varje pixel av vattenyta räknar den ut vilket segment av flödesvägen som är närmast och använder det segmentets riktning som lokal ström. Resultat: vatten nära en rak sektion flödar rakt, vatten på insidan av en kurva kurvar med kurvan, och allt övergår mjukt däremellan.
Texturerna, normalerna och skummet scrollar alla längs den flödesriktningen istället för att driva planlöst. Du kan faktiskt se åt vilket håll floden rinner.
Allt är justerbart live från ShoreFoamTuner, en liten inspector-komponent vi lägger på vilken scen som helst med vatten. Sliders för skummjukhet, brusskala, brusstyrka, drifthastighet, alpha-falloff. Ändra stämningen i en hel sjö utan att röra ett material.
Community och trash talk: Chat & Socialt
Ett oldschool-MMO handlar lika mycket om människorna som om spelet. Om de sociala verktygen känns dåliga känns världen tom.
Overhead Chat System
Text förankrad rakt ovanför en karaktärs huvud, som följer med när de rör sig, som tonar ut på avstånd: det är en absolut klassiker i genren, och något vi kommer försvara till döden.
Det förvandlar grupper till riktiga konversationer. Det låter dig snacka skit med någon mitt i en fight. Det låter en döende spelares sista ord vara något dumt och roligt istället för en systemlogg-rad. Overhead Chat System hanterar pooling, distance culling och anchor tracking så att det skalar även när tjugo personer skriker på varandra i en trång dungeon.
Se bra ut
Var ärlig: du kommer spendera en pinsamt stor mängd tid på karaktärsskärmen. Vi gör alla det. Det är den finaste spegeln i spelet.
Karaktärsförhandsvisningssystemet
Vår paper doll är inte en förrenderad 2D-bild: det är en live 3D-scen renderad till en UI-render texture. Full belysning, riktig geometri, varje utrustningsdel på dig i realtid. Rotera den, zooma in, stirra på den. Det är den sortens feature som inte ändrar gameplay alls, och absolut ändrar hur det känns att äga spelet.
Fylla väskorna: Icon Studio
Här är en liten smutsig hemlighet inom MMO-utveckling: ikoner. Du behöver hundratals av dem. Varje svärd, varje dryck, varje skräp-loot du hittar i en kista behöver sin egen lilla 64x64-ruta som är läsbar i ett fullpackat inventory. Och de måste alla se ut som att de hör till samma spel.
Du kan inte bara ta en screenshot av en 3D-modell och kalla det klart. Belysningen måste vara konsekvent. Kameravinkeln måste vara konsekvent. Och (det här är biten alla underskattar) inramningen måste matcha den gridstorlek som föremålet tar upp i inventoryt. En 1x1-dolk och ett 2x3-storsvärd behöver vilt olika kompositioner, annars ser båda fel ut.
Vår lösning: Icon Studio
Icon Studio är ett anpassat Unity-editorfönster vi byggde så att en person (oftast jag, muttrande) kan producera hundra konsekventa ikoner utan att tappa förståndet.
Arbetsflödet: släpp in en lista med item-prefabs. Tala om för verktyget vilken gridstorlek varje föremål tar upp i inventoryt: 1x1, 2x2, 2x3, 1x4, vad som helst. Rama in kameran en gång. Spara inramningen som preset. Tryck Generera.
Magin är att gridstorleken inte är kosmetisk: den styr den faktiska rendern. Ett 2x3-föremål renderas med 2x bredd och 3x höjd (av en 512px-bas), så när det sitter i ditt inventory är proportionerna korrekta, inte utsträckta. Ett långsvärd fyller genuint en 1x4-slot diagonalt. En dryckeflaska ryms genuint i 1x1. Inventoryt känns som att du organiserar riktiga föremål.
Utöver det hanterar verktyget: transparenta eller anpassade bakgrunder per föremål, bone pose-fångst så att skelettbaserade föremål kan spara sin visningspose utan att störa gameplay-riggen, och presets för hela föremålskategorier: alla yxor renderas med samma kamera, alla drycker med en annan. Konsekvens gratis.
Slutresultatet är att varje ikon i spelet (de som är läsbara vid 32 pixlar i ett tätt inventory-grid) renderats från den faktiska modellen i spelet, i den faktiska formen som föremålet tar upp i din väska. Ingen outsourcad 2D-konst. Ingen inkonsekvent belysning. Ingen dolk som på något vis ser större ut än ett storsvärd i UI:t.
Det är den sortens verktyg som ingen ser. Det är också anledningen till att inventoryt inte ser ut som en påse blandad stock art.
Tills nästa gång
Inget av dessa system är en rubrikfeature i Mortumus. Ingen kommer köpa spelet för att stegen låter bra eller för att skelett exploderar i fysikbitar. Men det här är benen under allt: det osynliga arbetet som gör att de stora sakerna känns rätt när de landar ovanpå.
Med den här grunden på plats kan Fin och jag bygga den faktiska dystra, brutala full loot-världen vi har klottrat i anteckningsböcker i två år, i en takt som inte gör att vi vill kasta våra datorer i en flod.
— AL