Hei kaikki, AL täällä. Tervetuloa ensimmäiseen kulissikatsaukseen Mortumuksesta.
Samalla kun Fin on haudattuna palvelinkaivoksiin painiessaan tietokantojen, tilausjärjestelmien ja kaiken pelottavan hajautetun järjestelmävelhoilun kanssa, joka pitää maailman hengissä, minä olen toisessa päässä varmistamassa, että jokainen miekaniskua, askeleet, soihdun välähdys ja jokainen haarniskan osa näyttää ja tuntuu oikealta ruudullasi.
Synkän fantasian MMO:n rakentaminen ei ole sellaista, minkä voi raahata ja pudottaa kasaan asset storesta. Se karkea, vanhan koulukunnan tunne, jota tavoittelemme — taistelun painavuus, haarniskan natina, kauhu toisen pelaajan näkemisestä horisontissa — syntyy vain kun alla olevat työkalut on rakennettu nimenomaan sitä varten. Joten tänään raaotan verhoa muutamalta mukautetulta Unity-järjestelmältä, jotka olemme nikkaroineet kasaan asiakaspuolella: niiltä, joita kukaan ei koskaan näe, mutta jotka kaikki tuntevat.
Mennään asiaan.
Visuaalit, lootti ja PvP-yksityisyys
Jos MMO-pelaajista tiedetään yksi totuus, se on tämä: me rakastamme varusteita. Ja full-loot PvP -pelissä kuten Mortumus, varusteet eivät ole pelkkää dopamiinia — ne ovat informaatiota. Se mitä joku yllään kertoo, mitä he voivat tehdä sinulle.
Pidä se salassa, pidä se turvassa — Equipment Visualizer
Varhaisessa vaiheessa tajusimme, että meillä on ongelma, jonka monet MMO:t hiljaisesti sivuuttavat: jos asiakasohjelma tietää jokaisen näkyvissä olevan pelaajan jokaisen varusteosan tarkan item ID:n, päättäväinen huijaaja voi kaivaa sen muistista ja tietää tarkat statsisi ennen kuin päättää gankata sinut.
Joten Equipment Visualizer tekee jotain hieman paranoidia. Omalle hahmollesi se lukee täydestä varustepalvelusta — näet kaiken varusteistasi. Mutta jokaisen muun pelaajan kohdalla se lukee vain riisutun "visuaalisen" tietopaketin, jonka palvelin julkaisee. Näet miekan, et statseja. Tuntemattomien item ID:t eivät yksinkertaisesti koskaan poistu Finin palvelimelta.
Pieni juttu. Se myös tekee muistia kaivavista huijauksista paljon hyödyttömämpiä. Hyvä kauppa.
Animaatiopino
Taitopohjaiset taistelut elävät tai kuolevat animaation varassa. Jos valmistelua ei pysty lukemaan, et voi reagoida. Jos isku ei osu, taistelu tuntuu painottomalta. Jos kuolema näyttää siltä, että malli vain... sammuu, menetät puolet tunnelmasta.
Player Animation Coordinator
Aloitimme kuten useimmat: yksi jättimäinen animaatio-ohjainluokka, joka yritti hallita kaikkea. Liikkuminen, loitsut, kuolema, osumat, idlet — kaikki samassa tiedostossa. Noin kahdessa viikossa se oli sotku.
Joten pilkoimme sen osiin. Nyt Player Animation Coordinator on pieni aloituspiste, joka käynnistää pinon pieniä, erikoistuneita moduuleja: liikkuminen, kääntyminen, hyökkäys, loitsu, osumareaktiot, kuolema, idlet. Jokainen omistaa yhden tehtävän. Jokainen on luettavissa yksinään. Bugien jäljittäminen kestää minuutteja tuntien sijaan.
Siistimpää koodia minulle. Tiukempaa taistelua sinulle.
Taisteluvasteaika — Attack Animator & Spell Animator
Tässä on klassinen MMO-ongelma: palvelin-auktoritatiivinen taistelu on ainoa tapa estää huijaaminen, mutta palvelimen vahvistuksen odottaminen jokaiselle loitsulle tuntuu melassilta.
Spell Animator huijaa hieman — mutta rehellisesti. Kun painat loitsunäppäintä, loitsuanimaatio käynnistyy välittömästi — paikallisesti ennustettu, joten se tuntuu välittömältä. Sitten Finin palvelin validoi, oliko loitsu oikeasti laillinen (cooldown ohi, tarpeeksi manaa, kohde kelvollinen jne.). Jos se vahvistaa, mikään ei muutu. Jos se hylkää, poistumme siististi.
Attack Animator tekee saman tanssin lähitaistelulle, ja se jopa skaalaa iskunopeuden vastaamaan palvelimen ilmoittamaa aseesi hyökkäystahtia. Silmäsi näkevät reagoivan taistelun. Palvelin näkee maailman, jolle ei voi valehdella.
Se suloinen piste "tuntuu hyvältä" ja "pelaa reilusti" välillä on se, missä koko tämä peli elää.
Valtakunnan äänet
Audio on 50% tunnelmasta ja ihmiset aliarvioivat aina kuinka paljon työtä se vaatii.
Tunnelman luominen — Audio Manager & Music Region System
Perinteisissä peleissä musiikki vaihtuu leikkaamalla suoraan, kun ylität näkymättömän rajan. Se on töksähtävää. Me teemme sen 3D-monikulmioalueilla. Music Region System antaa meidän maalata mielivaltaisen muotoisia alueita maailmaan — kummitteleva lehto, kirottu kappeli, bossin lähestymisreitti — ja kun kävelet sisään ja ulos, Audio Manager ristiinhäivyttää äänimaailman pehmeästi. Ei leikkauksia. Ei uudelleenkäynnistyksiä samalla raidalla, jos horjut rajan yli.
Ja koska kaikki tämä pyörii poolattujen äänilähteiden ja mikseriryhmäreitityksen kautta, se ei maksa käytännössä mitään ruudunpäivitysbudjetissa.
Character Audio Manager
Jokainen askel Mortumuksessa on kytketty hahmosi animaatioon ja alla olevaan pintaan — kivi kuulostaa kiveltä, muta mudalta. Loitsuäänet on sidottu kykyyn, aseen heilautukset aseeseen. Character Audio Manager istuu animaatiotapahtumien ja Audio Managerin välissä, joten voimme vaihtaa uusia SFX-paketteja rodun/luokan mukaan koskematta pelilogiikkakoodiin.
Pieniä juttuja. Paljon niitä. Ne kertyvät.
Veden reuna
Jokaisessa synkän fantasian maailmassa on vettä. Soita, jokia, tulvivia raunioita, meri kirotun niemen reunalla. Ja vesi on yksi niistä asioista, jotka näyttävät helposti tekaistuilta — erityisesti siellä missä se kohtaa maan. Se ruma monikulmiovesiviiva, jossa mesh leikkaa maaston, on halvannäköisen pelin tunnusmerkki.
Vesijärjestelmämme pohja
Emme rakentaneet vettämme tyhjästä. Unity toimittaa itse asiassa upean demoprojektin nimeltä Boat Attack, joka sisältää yhden parhaista URP-vesijärjestelmistä; aidot heijastukset, taittuminen, kelluvuus, koko paketti. Joten aloitimme Boat Attackin vedellä pohjana, koska sen pyörän keksiminen uudelleen olisi maksanut meille kuukausia ilman todellista hyötyä.
Mutta Boat Attack rakennettiin, no... veneille. Siistit puhtaat valtameren rantaviivat. Rannikkoefekti, joka näyttää hyvältä hiekkarannalla, näyttää kamalalta Mortumuksen mutaisten, ruohovaltaisten, epäsäännöllisten vesistöjen ympärillä. Joten meidän piti mennä kirurgiseksi.
Mukautettu shader — Water Shoreline
Unity-paketin suoran muokkaamisen sijaan (mikä olisi rikkonut kaiken jokaisen päivityksen yhteydessä), kirjoitimme ohuen mukautetun shaderin "WaterShoreline", joka vaihtaa vain sen osan putkesta, joka vastaa rannasta. Kaikki muu — heijastukset, virtauskartat, kaustiikki — tulee suoraan Boat Attackista. Ohitamme vain sen minkä tarvitsemme.
Kaksi suurta muutosta:
Kova 2 metrin vaahtorajaviiva on poissa. Boat Attackin oletusvaahtokaista on kiinteä syvyysraja, joka antaa tasaisen "valkoisen renkaan" jokaisen rannan ympärille. Korvasimme sen pehmeämmällä häivytyksellä plus rullaavalla kohinakentällä, joten vaahto nyt häipyy vähitellen ja jakautuu orgaanisiksi kielekkeiksi ja sormiksi täydellisen nauhan sijaan.
Pehmeä rantaviivan alpha. Se monikulmioinen vesiviiva-maastoa-vasten-ongelma? Häivytämme itse veden läpinäkyväksi viimeisen puolen metrin syvyydeltä. Vesiviiva katoaa kokonaan. Maasto vain tummenee mennessään veden alle, kuten oikea märkä rantaviiva tekee.
Jokijärjestelmämme
Boat Attackin vedessä on sellainen juttu: sellaisenaan se hoitaa valtameret kauniisti, mutta se ei oikeastaan tiedä mikä joki on. Vesi voi väreillä paikallaan, mutta se ei voi virrata alavirtaan ja mutkan ympäri kuten oikea joki. Se on ongelma kun puolet synkän fantasian maailmastasi pitäisi olla suoista, jokimaista ja vetistä.
Joten rakensimme jokijärjestelmän sen päälle.
Joki Mortumuksessa luodaan virtauspolkuna — yksinkertainen pisteiden murtoviiva, joka piirtää joen selkärangan lähteeltä suulle. Suunnittelijat pudottavat pisteet sinne minne haluavat veden virtaavan, ja shader hoitaa loput: jokaista vesipinnan pikseliä kohden se laskee, mikä virtauspolun segmentti on lähinnä, ja käyttää sen suuntaa paikallisena virtana. Tulos: suoran osuuden lähellä vesi virtaa suoraan, mutkan sisäpuolella vesi kaartuu mutkan mukana, ja kaikki siirtyy pehmeästi niiden välillä.
Tekstuurit, normaalit ja vaahto kaikki rullaavat virtaussuunnan mukaan ajelehtimisen sijaan. Voit oikeasti nähdä mihin suuntaan joki virtaa.
Kaikkea voi säätää livenä ShoreFoamTuner-komponentista, pienestä inspector-komponentista jonka pudotamme mihin tahansa skeneen jossa on vettä. Liukusäätimet vaahdon pehmeydelle, kohinaskaalaukselle, kohinan voimakkuudelle, ajautumisnopeudelle, alpha-häivytykselle. Muuta kokonaisen järven tunnelmaa koskematta materiaaliin.
Yhteisö ja läppä: Chat & sosiaalinen
Vanhan koulukunnan MMO on yhtä paljon ihmisistä kuin pelistä. Jos sosiaaliset työkalut tuntuvat huonoilta, maailma tuntuu tyhjältä.
Overhead Chat System
Teksti ankkuroitu suoraan hahmon pään yläpuolelle, seuraten heitä liikkeessä, häipyen etäisyydellä — se on genren ehdoton peruskallio, ja asia jonka puolesta kuolemme mäellä.
Se muuttaa ryhmät oikeiksi keskusteluiksi. Sen avulla voit heittää läppää jollekulle kesken taistelun. Sen avulla kuolevan pelaajan viimeiset sanat voivat olla jotain tyhmää ja hauskaa järjestelmälogin sijaan. Overhead Chat System hoitaa poolauksen, etäisyyskarsinnan ja ankkuriseurannan, joten se skaalautuu silloinkin kun kaksikymmentä ihmistä huutaa toisilleen ahtaassa luolastossa.
Näytä osalta
Olkaa rehellisiä — tulette viettämään nolostuttavan paljon aikaa hahmoruudussa. Me kaikki teemme niin. Se on pelin hienoin peili.
Hahmon esikatselujärjestelmä
Meidän paperinukkemme ei ole staattinen 2D-renderöinti — se on elävä 3D-skene renderöitynä UI:n render textureen. Täysi valaistus, oikea geometria, jokainen varuste yllään reaaliajassa. Käännä sitä, zoomaa sitä, tuijota sitä. Se on sellainen ominaisuus, joka ei muuta peliä lainkaan, mutta muuttaa täysin miltä peli tuntuu omistaa.
Laukkujen täyttäminen: Icon Studio
Tässä on MMO-kehityksen likainen pieni salaisuus: ikonit. Tarvitset satoja niitä. Jokainen miekka, jokainen taikajuoma, jokainen roskalootti arkusta tarvitsee oman pienen 64x64 neliönsä, joka erottuu selkeästi täydessä inventaariossa. Ja kaikkien täytyy näyttää siltä, että ne kuuluvat samaan peliin.
Et voi vain ottaa kuvakaappausta 3D-mallista ja todeta homman hoidetuksi. Valaistuksen täytyy olla yhtenäinen. Kamerakulman täytyy olla yhtenäinen. Ja — tämä on se kohta jonka kaikki aliarvioivat — rajauksen täytyy vastata ruudukkokokoa, jonka esine vie inventaariossa. 1x1-tikari ja 2x3-suuri miekka tarvitsevat täysin erilaiset sommitelmat tai molemmat näyttävät vääriltä.
Ratkaisumme: Icon Studio
Icon Studio on mukautettu Unity-editori-ikkuna, jonka rakensimme jotta yksi henkilö (yleensä minä, mutisten) voi väsätä sata yhtenäistä ikonia menettämättä järkeään.
Työnkulku: pudota lista item prefabeista. Kerro työkalulle, minkä ruudukkokoon kukin vie inventaariossa — 1x1, 2x2, 2x3, 1x4, mikä tahansa. Rajaa kamera kerran. Tallenna rajaus esiasetukseksi. Paina Generate.
Taika on siinä, että ruudukkokoko ei ole kosmeettinen — se ohjaa varsinaista renderöintiä. 2x3-esine renderöidään 2x leveydellä ja 3x korkeudella (512px pohjalta), joten kun se istuu inventaariossasi, mittasuhteet ovat oikeat, eivät venytettyjä. Pitkämiekka todella täyttää 1x4-paikan diagonaalisesti. Taikajuomapullo todella mahtuu 1x1:een. Inventaario tuntuu siltä kuin järjestelisit oikeita esineitä.
Sen päälle työkalu hoitaa: läpinäkyvät tai mukautetut taustat esinekohtaisesti, luuasentojen tallennuksen jotta luurankopohjaiset esineet voivat tallentaa näyttöasentonsa häiritsemättä pelimekaniikkarunkoa, ja esiasetukset kokonaisille esinekategorioille — kaikki kirveeet renderöidään samalla kameralla, kaikki taikajuomat eri kameralla. Yhtenäisyys ilmaiseksi.
Lopputulos on se, että jokainen ikoni pelissä — ne jotka erottuvat 32 pikselissä tiheässä inventaarioruudukossa — renderöitiin oikeasta pelin sisäisestä mallista, sillä muodolla jonka esine todella vie laukussasi. Ei ulkoistettua 2D-taidetta. Ei ristiriitaista valaistusta. Ei tikaria joka jotenkin näyttää suuremmalta kuin suuri miekka käyttöliittymässä.
Se on sellainen työkalu jota kukaan ei näe. Se on myös syy miksi inventaario ei näytä pussilliselta yhteensopimatonta stock-taidetta.
Seuraavaan kertaan
Mikään näistä järjestelmistä ei ole Mortumuksen otsikko-ominaisuus. Kukaan ei osta peliä koska askeleet kuulostavat hyviltä tai koska luurangot räjähtävät fysiikkapaloiksi. Mutta nämä ovat luut kaiken alla — näkymätön työ joka tekee isoista jutuista oikean tuntuisia kun ne laskeutuvat niiden päälle.
Tämän perustan ollessa paikallaan, Fin ja minä voimme rakentaa sen synkän, brutaalin, full-loot-maailman jota olemme luonnostelleet muistikirjoihin kaksi vuotta — tahdilla joka ei saa meitä haluamaan heittää tietokoneitamme jokeen.
— AL