Hej wszystkim, tu AL. Witajcie przy pierwszym spojrzeniu za kulisy Mortumus.

Podczas gdy Fin siedzi po uszy w serwerowych kopalniach, walczac z bazami danych, subskrypcjami i cala ta przerazajaca magia systemow rozproszonych, ktora utrzymuje swiat przy zyciu, ja jestem po drugiej stronie i dbam o to, zeby kazde machniecie mieczem, kazdy krok, migotanie pochodni i kazdy element zbroi faktycznie wygladal i dzialal dobrze na waszym ekranie.

Budowanie dark fantasy MMO to nie jest cos, co mozna sobie po prostu posklejac z asset store'a. To surowe, oldschoolowe uczucie, do ktorego dazymy (ciezar walki, skrzypienie zbroi, przerazenie na widok innego gracza na horyzoncie) pojawia sie tylko wtedy, gdy narzedzia pod spodem sa zbudowane specjalnie pod to. Wiec dzisiaj odsloniam zaslone nad kilkoma customowymi systemami Unity, ktore sklecilismy po stronie klienta: tymi, ktorych nikt nigdy nie zobaczy, ale ktore kazdy poczuje.

Zaczynajmy.

Wizualia, Loot i Prywatnosc PvP

Jesli jest jedna prawda o graczach MMO, to ta: kochamy ekwipunek. A w grze full-loot PvP takiej jak Mortumus ekwipunek to nie tylko zastrzyk dopaminy, to informacja. To, co ktos nosi, mowi ci, co moze ci zrobic.

Trzymaj w Sekrecie, Trzymaj w Bezpieczenstwie: Equipment Visualizer

Na poczatku zdalismy sobie sprawe, ze mamy problem, ktory wiele MMO po cichu ignoruje: jesli klient zna dokladne item ID kazdego elementu ekwipunku kazdego gracza w zasiegu wzroku, zdeterminowany cheater moze to wyciagnac z pamieci i znac twoje dokladne staty, zanim zdecyduje sie cie zgankowac.

Nasz Equipment Visualizer robi wiec cos lekko paranoidalnego. Dla twojej wlasnej postaci czyta z pelnego serwisu ekwipunku: widzisz wszystko o swoim sprzecie. Ale dla kazdego innego gracza czyta tylko okrojony blob "visuals", ktory publikuje serwer. Widzisz miecz, nie kartke ze statami. Item ID obcych po prostu nigdy nie opuszczaja serwera Fina.

To mala rzecz. Sprawia tez, ze cheaty oparte na memory-scrapingu sa duzo mniej uzyteczne. Dobry uklad.

Stos Animacji

Skill-based combat zyje albo umiera na animacji. Jesli zamach nie jest czytelny, nie mozesz zareagowac. Jesli trafienie nie laduje, walka wydaje sie niewazona. Jesli smierc wyglada, jakby model po prostu... sie wylaczyl, tracisz polowe klimatu.

Player Animation Coordinator

Zaczelismy tak jak wiekszosc: jedna gigantyczna klasa kontrolera animacji, ktora probowala zarzadzac wszystkim. Ruch, czary, smierc, trafienia, idle. Wszystko w jednym pliku. W ciagu dwoch tygodni byl balagan.

Wiec rozbilismy to. Teraz Player Animation Coordinator to maly punkt wejscia, ktory uruchamia stos malych, wyspecjalizowanych modulow: ruch, rotacja, atak, czar, reakcje na trafienia, smierc, idle. Kazdy z nich odpowiada za jedno zadanie. Kazdy jest czytelny sam w sobie. Bledy zajmuja minuty zamiast godzin, zeby je namierzyc.

Czystszy kod dla mnie. Ostrzejsza walka dla ciebie.

Responsywnosc Walki: Attack Animator & Spell Animator

Oto klasyczny problem MMO: server-authoritative combat to jedyny sposob na powstrzymanie cheatowania, ale czekanie, az serwer potwierdzi kazdy cast, czuje sie jak brnac przez melase.

Nasz Spell Animator troche oszukuje, ale uczciwie. Kiedy wciskasz klawisz zaklecia, animacja casta odtwarza sie natychmiast, lokalnie przewidziana, wiec czuje sie natychmiastowo. Potem serwer Fina sprawdza, czy cast byl faktycznie legalny (czy cooldown minal, czy jest dost mana, czy cel jest poprawny, itd.). Jesli potwierdzi, nic sie nie zmienia. Jesli odrzuci, czysto z tego wychodzimy.

Attack Animator robi ten sam taniec dla melee i nawet skaluje predkosc zamachu do tempa, ktore serwer wyznacza dla twojej broni. Twoje oczy widza responsywna walke. Serwer widzi swiat, ktoremu nie mozna klamac.

Ta rownowaga miedzy "dobrze sie czuje" a "gra fair" to miejsce, w ktorym cala ta gra zyje.

Dzwieki Krainy

Audio to 50% klimatu, a ludzie zawsze nie doceniaja, ile pracy to wymaga.

Budowanie Atmosfery: Audio Manager & Music Region System

Tradycyjne gry zmieniaja muzyke twardym cieciem, kiedy przekraczasz niewidzialna linie. To razi. My robimy to za pomoca stref 3D polygon. Music Region System pozwala nam malowac obszary o dowolnych ksztaltach w swiecie (nawiedzony gaj, przekleta kaplice, podejscie do bossa) i kiedy wchodzisz i wychodzisz, Audio Manager plynnie przenikla sciezke dzwiekowa. Zadnych ciec. Zadnych restartow tej samej sciezki, jesli przypadkiem przekroczysz granice.

A poniewaz to wszystko dziala przez poolowane zrodla audio z mixer-group routing, kosztuje to praktycznie nic z budzetu klatek.

Character Audio Manager

Kazdy krok w Mortumus jest podlaczony do animacji twojej postaci i powierzchni pod toba. Kamien brzmi jak kamien, bloto brzmi jak bloto. Dzwieki zakliniec sa powiazane z umiejetnoscia, machniecia broni z bronia. Character Audio Manager siedzi miedzy eventami animacji a Audio Manager, wiec mozemy podmienic nowe paczki SFX na rase/klase bez dotykania kodu rozgrywki.

Male rzeczy. Duzo ich. Sumuja sie.

Krawedz Wody

Kazdy dark fantasy swiat ma wode. Bagna, rzeki, zatopione ruiny, morze na krancu przeklctego przyladka. A woda to jedna z tych rzeczy, ktore latwo wygladaja sztucznie, zwlaszcza tam, gdzie spotyka sie z ladem. Ta brzydka poligonalna linia wody, gdzie mesh przecina teren, to znak rozpoznawczy tanio wygladajacej gry.

Nasza Baza Wodna

Nie budowalismy naszej wody od zera. Unity dostarcza fantastyczny projekt demo o nazwie Boat Attack, ktory zawiera jeden z najlepszych systemow wody URP: prawdziwe odbicia, refrakcje, plywanie, wszystko. Wiec zaczelismy od wody Boat Attack jako fundament, bo wymyslanie tego kola od nowa kosztowaloby nas miesiace bez realnych korzysci.

Ale Boat Attack zostal zbudowany pod... no, lodzie. Ladne, czyste linie brzegowe oceanu. Zachowanie linii brzegowej, ktore wyglada swietnie na piaszczystej plazy, wyglada fatalnie wokol blotnych, trzcinowych, nieregularnych ciekow wodnych, jakich chcemy w Mortumus. Wiec musielismy dzialac chirurgicznie.

Custom Shader: Water Shoreline

Zamiast edytowac pakiet Unity bezposrednio (co lamaloby sie przy kazdej aktualizacji), napisalismy cienki custom shader "WaterShoreline", ktory podmienia tylko ten kawalek pipeline odpowiedzialny za brzeg. Cala reszta (odbicia, flow mapy, kaustyka) pochodzi prosto z Boat Attack. Nadpisujemy tylko to, czego potrzebujemy.

Dwie duze zmiany:

Sztywny 2-metrowy prog piany zniknal. Domyslny pas piany Boat Attack ma staly prog glebokosci, co daje ten jednolity "biale kolo" wokol kazdego brzegu. Zastapilismy go lagodniejszym zanikaniem plus przewijanym polem szumu, wiec piana teraz zanika stopniowo i rozpada sie w organiczne jezyki i palce zamiast idealnej wstazki.

Miekka alpha linii brzegowej. Ten problem z poligonalna linia wody na tle terenu? Wygaszamy sama wode do przezroczystosci na ostatnim pol metrze glebokosci. Linia wody znika calkowicie. Teren po prostu ciemnieje w miare jak schodzi pod wode, tak jak prawdziwy mokry brzeg.

Mortumus water shoreline with soft foam and natural alpha blending

Nasz System Rzeczny

Jest taka rzecz z woda Boat Attack: prosto z pudelka obsluguje oceany pieknie, ale tak naprawde nie wie, czym jest rzeka. Woda moze falowac w miejscu, ale nie moze plynac w dol i wokol zakreta tak jak prawdziwa rzeka. To problem, kiedy polowa twojego dark fantasy swiata ma byc bagnista, rzeczna i przesiakniec woda.

Wiec zbudowalismy na tym system rzeczny.

Rzeka w Mortumus jest tworzona jako sciezka przeplywu: prosta polilinia punktow, ktora wyznacza kregoslup rzeki od zrodla do ujscia. Projektanci umieszczaja punkty tam, gdzie chca, zeby woda plynela, a shader robi reszte: dla kazdego piksela powierzchni wody oblicza, ktory segment sciezki przeplywu jest najblizej, i uzywa kierunku tego segmentu jako lokalnego pradu. Rezultat: woda przy prostym odcinku plynie prosto, woda po wewnetrznej stronie zakreta zakrecz sie z zakretem, a wszystko przechodzi plynnie miedzy nimi.

Tekstury, normale i piana przewijaja sie wzdluz tego kierunku przeplywu zamiast dryfowac bez celu. Mozesz faktycznie zobaczyc, w ktora strone plynie rzeka.

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

Wszystko mozna dostrajac na zywo z ShoreFoamTuner, malego komponentu inspektora, ktory umieszczamy na kazdej scenie z woda. Suwaki na miekkosc piany, skale szumu, sile szumu, predkosc dryfu, zanikanie alpha. Zmien klimat calego jeziora bez dotykania materialu.

Spolecznosc i Trashtalk: Chat & Interakcje Spoleczne

Oldschoolowe MMO to tyle samo ludzie, co gra. Jesli narzedzia spoleczne dzialaja zle, swiat wydaje sie pusty.

Overhead Chat System

Tekst zakotwiczony tuza nad glowa postaci, podazajacy za nia w ruchu, zanikajacy z odlegloscia. To absolutny filar gatunku i cos, za co bedziemy walczyc do smierci.

Zamienia druzyny w prawdziwe rozmowy. Pozwala ci obrzucac kogos wyzwiskami w srodku walki. Sprawia, ze ostatnie slowa umierajacego gracza to cos glupiego i smiesznego zamiast linii logu systemowego. Overhead Chat System obsluguje pooling, distance culling i sledzenie zakotwiczen, wiec skaluje sie nawet kiedy dwadziescia osob krzyczy na siebie w ciasnym dungeonie.

Wyglad ma Znaczenie

Badz szczery: spedzisz zenujaco duzo czasu na ekranie postaci. Wszyscy to robimy. To najladniejsze lustro w grze.

System Podgladu Postaci

Nasz papierowy model to nie jest upieczony render 2D. To zywa scena 3D renderowana do UI render texture. Pelne oswietlenie, prawdziwa geometria, kazdy element ekwipunku na tobie w czasie rzeczywistym. Obroc, przybliz, wpatruj sie. To typ funkcji, ktory w ogole nie zmienia rozgrywki, ale absolutnie zmienia to, jak gra sie czuje na wlasnosc.

Mortumus character creation screen with live 3D preview

Wypelnianie Plecakow: Icon Studio

Oto brudny sekreik tworzenia MMO: ikony. Potrzebujesz ich setek. Kazdy miecz, kazdy eliksir, kazdy smieci, ktore znajdziesz w skrzyni, potrzebuje wlasnego malego kwadratu 64x64, ktory jest czytelny w zatloczonej inwentarzu. I wszystkie musza wygladac, jakby nalezaly do tej samej gry.

Nie mozesz po prostu zrobic screenshota modelu 3D i na tym zakonczyc. Oswietlenie musi byc spojne. Kat kamery musi byc spojny. I to jest ten element, ktory kazdy niedocenia: kadrowanie musi pasowac do rozmiaru siatki, ktory przedmiot zajmie w inwentarzu. Sztylet 1x1 i wielki miecz 2x3 potrzebuja radykalnie roznych kompozycji, bo inaczej obydwa wygladaja zle.

Nasze Rozwiazanie: Icon Studio

Icon Studio to customowe okno edytora Unity, ktore zbudowalismy, zeby jedna osoba (zwykle ja, mamroczac) mogla wyprodukowac setke spojnych ikon bez zwariowania.

Workflow: wrzuc liste prefabow przedmiotow. Powiedz narzedziu, jaki rozmiar siatki kazdy przedmiot zajmuje w inwentarzu: 1x1, 2x2, 2x3, 1x4, cokolwiek. Wykadruj kamere raz. Zapisz kadrowanie jako preset. Kliknij Generate.

Magia polega na tym, ze rozmiar siatki nie jest kosmetyczny: napedza faktyczny render. Przedmiot 2x3 jest renderowany w 2x szerokosci i 3x wysokosci (z bazy 512px), wiec kiedy siedzi w inwentarzu, proporcje sa poprawne, nie rozciagniete. Dlugim miecz naprawde wypelnia slot 1x4 po przekatnej. Buteleczka z eliksirem naprawde miesci sie w 1x1. Inwentarz czuje sie, jakbys organizowal prawdziwe przedmioty.

Oprocz tego narzedzie obsluguje: przezroczyste lub niestandardowe tla per przedmiot, bone pose capture, dzieki czemu przedmioty oparte na szkielecie moga zrobic snapshot swojej pozy wyswietlania bez zaklocania gameplay rig, oraz presety dla calych kategorii przedmiotow. Wszystkie topory renderowane z ta sama kamera, wszystkie mikstury z inna. Spojnosc za darmo.

Efekt koncowy jest taki, ze kazda ikona w grze (te, ktore sa czytelne przy 32 pikselach w gestej siatce inwentarza) zostala wyrenderowana z faktycznego modelu in-game, w faktycznym ksztalcie, ktory ten przedmiot zajmuje w twoim plecaku. Zadnej zleconej na zewnatrz sztuki 2D. Zadnego niedopasowanego oswietlenia. Zaden sztylet, ktory w jakis sposob wyglada wiekszy niz wielki miecz w UI.

To typ narzedzia, ktorego nikt nie widzi. To tez powod, dla ktorego inwentarz nie wyglada jak torba pelna niedopasowanej sztuki ze stockow.

Do Nastepnego Razu

Zaden z tych systemow nie jest czolowa funkcja Mortumus. Nikt nie kupi gry, bo kroki ladnie brzmia albo bo szkielety eksploduja na fizyczne kawalki. Ale to sa kosci pod wszystkim: niewidzialna praca, ktora sprawia, ze duze rzeczy dobrze sie czuja, kiedy laduja na wierzchu.

Z tym fundamentem na miejscu, Fin i ja mozemy budowac faktyczny ponury, brutalny swiat full-loot, ktory od dwoch lat szkicujemy w notatnikach, w tempie, ktore nie sprawia, ze chcemy wrzucic nasze komputery do rzeki.

-- AL