Γεια σε όλους, ο AL εδώ. Καλωσορίσατε στην πρώτη ματιά πίσω από τις σκηνές του Mortumus.
Ενώ ο Fin είναι θαμμένος στα ορυχεία του server παλεύοντας με βάσεις δεδομένων, subscriptions και όλη τη τρομακτική μαγεία distributed systems που κρατάει τον κόσμο ζωντανό, εγώ είμαι στην άλλη άκρη φροντίζοντας κάθε χτύπημα σπαθιού, κάθε βήμα, κάθε τρεμόπαιγμα δαυλού και κάθε κομμάτι πανοπλίας να φαίνεται και να νιώθεται σωστά στην οθόνη σας.
Το χτίσιμο ενός dark fantasy MMO δεν είναι κάτι που μπορείς να συναρμολογήσεις με drag-and-drop από ένα asset store. Η σκληρή, oldschool αίσθηση που κυνηγάμε (το βάρος της μάχης, ο τριγμός της πανοπλίας σου, ο τρόμος όταν βλέπεις άλλον παίκτη στον ορίζοντα) βγαίνει μόνο όταν τα εργαλεία από κάτω είναι φτιαγμένα ειδικά γι' αυτό. Οπότε σήμερα τραβάω την κουρτίνα και σας δείχνω μερικά από τα custom Unity συστήματα που φτιάχνουμε στην πλευρά του client: αυτά που κανείς δεν θα δει ποτέ, αλλά που όλοι θα νιώσουν.
Πάμε λοιπόν.
Visuals, Loot και Ιδιωτικότητα PvP
Αν υπάρχει μία αλήθεια για τους παίκτες MMO, είναι αυτή: λατρεύουμε το gear. Και σε ένα full-loot PvP παιχνίδι σαν το Mortumus, το gear δεν είναι απλά μια δόση ντοπαμίνης, είναι πληροφορία. Αυτό που φοράει κάποιος σου λέει τι μπορεί να σου κάνει.
Κράτα το μυστικό, κράτα το ασφαλές: Equipment Visualizer
Νωρίς συνειδητοποιήσαμε ότι είχαμε ένα πρόβλημα που πολλά MMO αγνοούν σιωπηλά: αν ο client ξέρει το ακριβές item ID κάθε κομματιού εξοπλισμού σε κάθε ορατό παίκτη, ένας αποφασισμένος cheater μπορεί να το τραβήξει από τη μνήμη και να ξέρει τα ακριβή stats σου πριν αποφασίσει να σε σκοτώσει.
Οπότε ο Equipment Visualizer μας κάνει κάτι ελαφρώς παρανοϊκό. Για τον δικό σου χαρακτήρα, διαβάζει από το πλήρες equipment service, βλέπεις τα πάντα για τον εξοπλισμό σου. Αλλά για κάθε άλλο παίκτη, διαβάζει μόνο ένα stripped-down "visuals" blob που δημοσιεύει ο server. Βλέπεις το σπαθί, όχι το stat sheet. Τα item IDs των ξένων απλά δεν φεύγουν ποτέ από τον server του Fin.
Είναι μικρό πράγμα. Επίσης κάνει τα memory-scraping cheats πολύ λιγότερο χρήσιμα. Καλή ανταλλαγή.
Η Στοίβα Animation
Η μάχη βασισμένη σε skill ζει ή πεθαίνει από το animation. Αν το windup δεν είναι ευανάγνωστο, δεν μπορείς να αντιδράσεις. Αν το χτύπημα δεν πέφτει σωστά, η μάχη νιώθεται χωρίς βάρος. Αν ο θάνατος μοιάζει σαν το model απλά... να σβήνει, χάνεις τη μισή ατμόσφαιρα.
Player Animation Coordinator
Ξεκινήσαμε όπως οι περισσότεροι: μια γιγαντιαία κλάση animation controller που προσπαθούσε να διαχειριστεί τα πάντα. Κίνηση, ξόρκια, θάνατος, χτυπήματα, idles, όλα στο ίδιο αρχείο. Μέσα σε δύο βδομάδες ήταν χάος.
Οπότε το σπάσαμε. Τώρα ο Player Animation Coordinator είναι ένα μικροσκοπικό σημείο εισόδου που ξεκινάει μια στοίβα από μικρά, εξειδικευμένα modules: κίνηση, περιστροφή, επίθεση, ξόρκια, αντιδράσεις χτυπήματος, θάνατος, idles. Κάθε ένα κάνει μία δουλειά. Κάθε ένα είναι ευανάγνωστο μόνο του. Τα bugs βρίσκονται σε λεπτά αντί για ώρες.
Πιο καθαρός κώδικας για μένα. Πιο σφιχτή μάχη για εσάς.
Ανταπόκριση μάχης: Attack Animator & Spell Animator
Να το κλασικό πρόβλημα MMO: η server-authoritative μάχη είναι ο μόνος τρόπος να σταματήσεις το cheating, αλλά η αναμονή για επιβεβαίωση από τον server σε κάθε cast νιώθεται σαν μελάσα.
Ο Spell Animator μας κλέβει λίγο, αλλά τίμια. Όταν πατάς το πλήκτρο ξορκιού, η cast animation παίζει αμέσως, locally predicted, ώστε να νιώθεται instant. Μετά ο server του Fin επικυρώνει αν το cast ήταν πράγματι νόμιμο (cooldown τελειωμένο, αρκετό mana, στόχος έγκυρος κ.λπ.). Αν επιβεβαιώσει, τίποτα δεν αλλάζει. Αν απορρίψει, βγαίνουμε καθαρά.
Ο Attack Animator κάνει τον ίδιο χορό για melee, και μάλιστα κλιμακώνει την ταχύτητα swing ώστε να ταιριάζει με τη ρυθμιστική αναλογία που ορίζει ο server για το όπλο σου. Τα μάτια σου βλέπουν responsive μάχη. Ο server βλέπει έναν κόσμο στον οποίο δεν μπορείς να πεις ψέματα.
Εκείνο το γλυκό σημείο ανάμεσα στο "νιώθεται σωστά" και "παίζεται δίκαια" είναι εκεί που ζει ολόκληρο το παιχνίδι.
Οι Ήχοι του Βασιλείου
Ο ήχος είναι το 50% της ατμόσφαιρας και ο κόσμος πάντα υποτιμάει πόση δουλειά χρειάζεται.
Στήνοντας την ατμόσφαιρα: Audio Manager & Music Region System
Τα παραδοσιακά παιχνίδια τείνουν να αλλάζουν μουσική με απότομο cut όταν περνάς μια αόρατη γραμμή. Είναι απότομο. Εμείς το κάνουμε με 3D πολυγωνικές ζώνες. Το Music Region System μας αφήνει να ζωγραφίσουμε περιοχές αυθαίρετου σχήματος στον κόσμο (ένα στοιχειωμένο άλσος, ένα καταραμένο παρεκκλήσι, η προσέγγιση σε ένα boss), και καθώς μπαίνεις και βγαίνεις, ο Audio Manager κάνει crossfade στο soundtrack ομαλά. Χωρίς cuts. Χωρίς restart στο ίδιο track αν πατήσεις πάνω στο όριο.
Και επειδή όλα αυτά τρέχουν μέσω pooled audio sources με mixer-group routing, κοστίζει πρακτικά τίποτα στο frame budget.
Character Audio Manager
Κάθε βήμα στο Mortumus είναι συνδεδεμένο με το animation του χαρακτήρα σου και την επιφάνεια κάτω από σένα: η πέτρα ακούγεται σαν πέτρα, η λάσπη ακούγεται σαν λάσπη. Οι ήχοι ξορκιών είναι δεμένοι με την ικανότητα, τα swings του όπλου με το όπλο. Ο Character Audio Manager κάθεται ανάμεσα στα animation events και τον Audio Manager, ώστε να μπορούμε να αλλάζουμε SFX packs ανά φυλή/κλάση χωρίς να αγγίξουμε κώδικα gameplay.
Μικρά πράγματα. Πολλά. Μαζεύονται.
Η Άκρη του Νερού
Κάθε dark fantasy κόσμος έχει νερό. Βάλτοι, ποτάμια, πλημμυρισμένα ερείπια, η θάλασσα στην άκρη ενός καταραμένου ακρωτηρίου. Και το νερό είναι ένα από αυτά τα πράγματα που φαίνονται ψεύτικα πολύ εύκολα, ειδικά εκεί που συναντάει τη στεριά. Εκείνη η άσχημη πολυγωνική γραμμή νερού όπου το mesh τέμνει το terrain είναι το σήμα κατατεθέν ενός φτηνοφτιαγμένου παιχνιδιού.
Η βάση νερού μας
Δεν φτιάξαμε το νερό μας από το μηδέν. Η Unity στέλνει ένα φανταστικό demo project που λέγεται Boat Attack, το οποίο περιλαμβάνει ένα από τα καλύτερα URP water systems εκεί έξω: αληθινές αντανακλάσεις, διαθλάσεις, πλευστότητα, τα πάντα. Οπότε ξεκινήσαμε με το νερό του Boat Attack ως βάση, γιατί η ανακάλυψη του τροχού θα μας κόστιζε μήνες χωρίς πραγματικό κέρδος.
Αλλά το Boat Attack φτιάχτηκε για, λοιπόν... βάρκες. Ωραίες καθαρές ωκεάνιες ακτογραμμές. Η συμπεριφορά ακτογραμμής που φαίνεται τέλεια σε μια αμμώδη παραλία φαίνεται χάλια γύρω από τα λασπώδη, καλαμωδη, ακανόνιστα ποτάμια που θέλουμε στο Mortumus. Οπότε έπρεπε να γίνουμε χειρουργικοί.
Ο custom shader: WaterShoreline
Αντί να επεξεργαστούμε το Unity package απευθείας (κάτι που θα χαλούσε σε κάθε update), γράψαμε έναν λεπτό custom shader "WaterShoreline" που αντικαθιστά μόνο το κομμάτι του pipeline υπεύθυνο για την ακτή. Όλα τα άλλα (αντανακλάσεις, flow maps, caustics) έρχονται κατευθείαν από το Boat Attack. Κάνουμε override μόνο σε ό,τι χρειαζόμαστε.
Οι δύο μεγάλες αλλαγές:
Το σκληρό cutoff αφρού στα 2 μέτρα εξαφανίστηκε. Η default ζώνη αφρού του Boat Attack έχει ένα σταθερό cutoff βάθους, που σου δίνει εκείνο το ομοιόμορφο "λευκό δαχτυλίδι" γύρω από κάθε ακτή. Το αντικαταστήσαμε με ένα πιο μαλακό falloff συν ένα scrolling noise field, ώστε ο αφρός τώρα σβήνει σταδιακά και σπάει σε οργανικές γλώσσες και δάχτυλα αντί για μια τέλεια κορδέλα.
Μαλακό alpha ακτογραμμής. Το πρόβλημα με την πολυγωνική γραμμή νερού πάνω στο terrain; Κάνουμε fade στο νερό ίδιο σε διαφανές στο τελευταίο μισό μέτρο βάθους. Η γραμμή νερού εξαφανίζεται εντελώς. Το terrain απλά γίνεται πιο σκούρο καθώς πάει κάτω από το νερό, όπως κάνει μια πραγματική βρεγμένη ακτή.
Το σύστημα ποταμών μας
Να η φάση με το νερό του Boat Attack: out of the box χειρίζεται τους ωκεανούς όμορφα, αλλά δεν ξέρει πραγματικά τι είναι ποτάμι. Το νερό μπορεί να κυματίζει επιτόπου, αλλά δεν μπορεί να ρέει κατάντη και γύρω από μια στροφή όπως ένα πραγματικό ποτάμι. Αυτό είναι πρόβλημα όταν η μισή dark fantasy κόσμος σου πρέπει να είναι βαλτώδης, ποτάμιος και μουσκεμένος.
Οπότε χτίσαμε ένα σύστημα ποταμών πάνω του.
Ένα ποτάμι στο Mortumus δημιουργείται ως μονοπάτι ροής, μια απλή polyline από σημεία που χαράζει τη σπονδυλική στήλη του ποταμού από την πηγή ως τις εκβολές. Οι designers βάζουν τα σημεία εκεί που θέλουν να ρέει νερό, και ο shader κάνει τα υπόλοιπα: για κάθε pixel επιφάνειας νερού, βρίσκει ποιο τμήμα του μονοπατιού ροής είναι πιο κοντά και χρησιμοποιεί τη κατεύθυνση εκείνου του τμήματος ως τοπικό ρεύμα. Αποτέλεσμα: το νερό κοντά σε ευθεία ρέει ίσια, το νερό στο εσωτερικό μιας στροφής καμπυλώνει με τη στροφή, και τα πάντα μεταβαίνουν ομαλά μεταξύ τους.
Οι textures, τα normals και ο αφρός κυλάνε όλα προς τη κατεύθυνση ροής αντί να παρασύρονται άσκοπα. Μπορείς πράγματι να δεις προς τα πού πηγαίνει το ποτάμι.
Τα πάντα ρυθμίζονται live από τον ShoreFoamTuner, ένα μικροσκοπικό inspector component που βάζουμε σε κάθε scene με νερό. Sliders για μαλακότητα αφρού, κλίμακα noise, ένταση noise, ταχύτητα drift, falloff alpha. Άλλαξε τη διάθεση μιας ολόκληρης λίμνης χωρίς να αγγίξεις material.
Κοινότητα και Trash Talk: Chat & Social
Ένα oldschool MMO αφορά εξίσου τους ανθρώπους και το παιχνίδι. Αν τα social εργαλεία νιώθονται χάλια, ο κόσμος νιώθεται άδειος.
Overhead Chat System
Κείμενο αγκυρωμένο ακριβώς πάνω από το κεφάλι ενός χαρακτήρα, να τον ακολουθεί καθώς κινείται, να σβήνει σταδιακά στην απόσταση: ένα απόλυτο στολίδι του είδους και κάτι που θα υπερασπιστούμε μέχρι τέλους.
Μετατρέπει τα party σε πραγματικές συζητήσεις. Σε αφήνει να κάνεις trash talk σε κάποιον στη μέση της μάχης. Αφήνει τα τελευταία λόγια ενός πεθαμένου παίκτη να είναι κάτι χαζό και αστείο αντί για μια γραμμή system log. Το Overhead Chat System χειρίζεται pooling, distance culling και anchor tracking ώστε να κλιμακώνεται ακόμα κι όταν είκοσι άτομα φωνάζουν ο ένας στον άλλο σε ένα στενό dungeon.
Να φαίνεσαι καλά
Να είσαι ειλικρινής: θα περάσεις ντροπιαστικά πολύ χρόνο στην οθόνη χαρακτήρα. Όλοι το κάνουμε. Είναι ο ωραιότερος καθρέφτης στο παιχνίδι.
Το σύστημα προεπισκόπησης χαρακτήρα
Το paper doll μας δεν είναι ένα baked 2D render, είναι μια live 3D σκηνή rendered σε ένα UI render texture. Πλήρης φωτισμός, πραγματική γεωμετρία, κάθε κομμάτι εξοπλισμού πάνω σου σε πραγματικό χρόνο. Περίστρεψέ το, κάνε zoom, κοίτα το. Είναι το είδος feature που δεν αλλάζει καθόλου το gameplay, και αλλάζει απόλυτα πώς νιώθεται το παιχνίδι.
Γεμίζοντας τις τσάντες: Icon Studio
Να ένα μικρό βρώμικο μυστικό της ανάπτυξης MMO: τα εικονίδια. Χρειάζεσαι εκατοντάδες. Κάθε σπαθί, κάθε φίλτρο, κάθε κομμάτι σκουπίδι-loot που βρίσκεις σε ένα σεντούκι χρειάζεται το δικό του μικρό τετράγωνο 64x64 που διαβάζεται καθαρά σε ένα γεμάτο inventory. Και όλα πρέπει να φαίνονται σαν να ανήκουν στο ίδιο παιχνίδι.
Δεν μπορείς απλά να κάνεις screenshot ένα 3D model και τέλος. Ο φωτισμός πρέπει να είναι συνεπής. Η γωνία κάμερας πρέπει να είναι συνεπής. Και (αυτό είναι το κομμάτι που όλοι υποτιμούν) το πλαίσιο πρέπει να ταιριάζει με το μέγεθος grid που θα καταλάβει το item στο inventory. Ένα στιλέτο 1x1 και ένα μεγάλο σπαθί 2x3 χρειάζονται τελείως διαφορετικές συνθέσεις, αλλιώς και τα δύο φαίνονται λάθος.
Η λύση μας: Icon Studio
Το Icon Studio είναι ένα custom Unity editor window που φτιάξαμε ώστε ένα άτομο (συνήθως εγώ, μουρμουρίζοντας) να μπορεί να βγάλει εκατό συνεπή εικονίδια χωρίς να χάσει τα λογικά του.
Η ροή εργασίας: ρίξε μια λίστα από item prefabs. Πες στο εργαλείο τι μέγεθος grid καταλαμβάνει το καθένα στο inventory: 1x1, 2x2, 2x3, 1x4, ό,τι να 'ναι. Πλαισίωσε την κάμερα μια φορά. Σώσε το πλαίσιο ως preset. Πάτα Δημιουργία.
Η μαγεία είναι ότι το μέγεθος grid δεν είναι καλλωπιστικό, οδηγεί το πραγματικό render. Ένα 2x3 item κάνει render σε 2x πλάτος και 3x ύψος (μιας βάσης 512px), ώστε οι αναλογίες να είναι σωστές όταν κάθεται στο inventory, όχι τεντωμένο. Ένα longsword πραγματικά γεμίζει ένα slot 1x4 διαγώνια. Ένα μπουκαλάκι φίλτρου πραγματικά χωράει σε 1x1. Το inventory νιώθεται σαν να οργανώνεις πραγματικά αντικείμενα.
Πέρα από αυτά, το εργαλείο χειρίζεται: διαφανές ή custom background ανά item, bone pose capture ώστε τα skeleton-based items να αποθηκεύουν τη display pose τους χωρίς να ενοχλούν το gameplay rig, και presets για ολόκληρες κατηγορίες item: όλα τα τσεκούρια κάνουν render με την ίδια κάμερα, όλα τα φίλτρα με διαφορετική. Συνέπεια δωρεάν.
Το τελικό αποτέλεσμα είναι ότι κάθε εικονίδιο στο παιχνίδι (αυτά που διαβάζονται καλά στα 32 pixels σε ένα πυκνό inventory grid) κάνεται render από το πραγματικό in-game model, στο πραγματικό σχήμα που παίρνει το item στην τσάντα σου. Χωρίς εξωτερική 2D τέχνη. Χωρίς ασύμβατο φωτισμό. Χωρίς στιλέτο που κάπως φαίνεται μεγαλύτερο από ένα μεγάλο σπαθί στο UI.
Είναι το είδος εργαλείου που κανείς δεν βλέπει. Είναι επίσης ο λόγος που το inventory δεν μοιάζει με σακούλα γεμάτη ανάμεικτο stock art.
Μέχρι την επόμενη φορά
Κανένα από αυτά τα συστήματα δεν είναι headline feature του Mortumus. Κανείς δεν θα αγοράσει το παιχνίδι επειδή τα βήματα ακούγονται ωραία ή επειδή οι σκελετοί εκρήγνυνται σε κομμάτια φυσικής. Αλλά αυτά είναι τα κόκαλα κάτω από τα πάντα: η αόρατη δουλειά που κάνει τα μεγάλα πράγματα να νιώθονται σωστά όταν πέφτουν πάνω τους.
Με αυτή τη βάση στη θέση της, ο Fin κι εγώ μπορούμε να χτίσουμε τον πραγματικό σκοτεινό, βάναυσο, full-loot κόσμο που σχεδιάζουμε σε τετράδια εδώ και δύο χρόνια, σε ρυθμό που δεν μας κάνει να θέλουμε να πετάξουμε τους υπολογιστές μας σε ένα ποτάμι.
-- AL