Wie man verteilte Autorität für Multiplayer-Coop-Spiele nutzt

Als Arcane Alpacas die erste Demo ihres fesselnden FPS-Shooters Dagger Directive Anfang dieses Jahres auf Steam veröffentlichte, war das allgemeine Feedback großartig – aber die Community machte deutlich, dass sie dieses Spiel gemeinsam spielen wollte. Basierend auf dieser Rückmeldung entschied sich das Team, Multiplayer-Funktionalität in das Spiel einzufügen. Sie testeten einige verschiedene Lösungen, bevor sie sich letztendlich für die Suite der integrierten Multiplayer-Lösungen entschieden, die in Unity 6 enthalten sind. Wir setzten uns mit Programmierer und Designer Daniel Fowler zusammen, um zu erfahren, wie sie Unitys Netcode für GameObjects, Relay und andere Netzwerkdienste nutzten, um Spieler zu verbinden, und wie Distributed Authority (DA) den gesamten Betrieb mit schlanker, skalierbarer Serverunterstützung antreibt.
Fangen wir mit ein wenig darüber an, wie Arcane Alpacas begann und was ihr erschaffen wolltet.
Daniel Fowler, Programmierer und Designer: Ich gründete das Unternehmen vor ein paar Jahren. Davor arbeiteten wir – Wade Hribar, Cody Rowland und ich – bei Oculus an Onward, einem VR-FPS-Spiel, und wir wollten weg von der Arbeit für große Unternehmen.
Ich begann dieses Projekt selbst und holte die anderen beiden nach und nach dazu, als wir es benötigten. Ich erhielt einen Verlagsvertrag mit MicroProse und veröffentlichte dann eine Demo. Die Demo lief wirklich gut, und wir wollten Multiplayer hinzufügen, da dies unser größter Punkt des Feedbacks aus der Community war. Seitdem läuft das Spiel gut. Wir haben gestartet und stehen kurz vor der Veröffentlichung eines Inhalts-Pakets.
Vor ein paar Wochen veröffentlichten wir ein Netzwerk-Update, nachdem wir mit dem Unity-Team gesprochen hatten – sie gaben uns einige Rückmeldungen, und wir teilten auch einige mit, und wir bekamen viele gute Ideen, die wir durchgingen und umsetzten. Der Multiplayer ist jetzt viel stabiler, und wir haben größtenteils positives Feedback von der Community erhalten, obwohl es natürlich noch einige Probleme zu lösen gibt.
Das ist großartig! Was gibt es sonst noch zu diesem Projekt?
Ich begann dieses Projekt vor viereinhalb Jahren. Zu der Zeit portierten wir Onward zur Quest, also versuchten wir, ein hochklassiges PC-VR-Spiel auf ein Handy zu bringen. Dabei mussten wir eine Menge Zeug entfernen – besonders Gras, und wir konnten keine Compute-Shader auf dem Oculus verwenden. Also wollte ich ein Projekt starten und sehen, wie ich eine riesige Menge Gras erzeugen und es recht effizient laufen lassen kann. Am Ende habe ich ein benutzerdefiniertes Grassesystem gebaut, das den Burst-Compiler verwendet, um Millionen von Polygonen aus Gras, kleinen Pflanzen und Blumen zu generieren, während sich der Spieler auf der Karte bewegt.
Spieler können zu jeder Tageszeit ihre Missionen starten, und die Zeit vergeht, während sie spielen – wenn man also um 6 Uhr morgens eine Mission startet und eine Stunde wartet, wird sich die Position der Sonne entsprechend bewegen. Wir haben vollständig Echtzeit-Beleuchtung verwendet und unseren eigenen Himmelshader erstellt. Die Nachbearbeitung wird ebenfalls davon beeinflusst, unterstützt durch Scriptable Objects, die alle Werte halten und wie sie sich im Laufe des Tages ändern, und Beleuchtung sowie Tageszeit beeinflussen das Verhalten und die Sensoren der KI.
Ich habe die Tageszeit hinzugefügt, weil ich auch mit der Echtzeit-Beleuchtung experimentieren wollte, da wir auch auf ein zweites Spiel hinarbeiteten. Das war mein unterhaltsames Wochenendprojekt. Und nach einer Weile begann ich, einige Charaktere hinzuzufügen, und es begann sich so anzufühlen, als hätte ich ein ganzes Spiel hier. Ich habe das ein wenig weiter ausgebaut und einige Leute bei der Arbeit spielen lassen, und sie hatten Spaß daran.
Die Echtzeit-Beleuchtung und Millionen von Polygonen aus Gras sind möglich, weil wir Universal Render Pipeline (URP) und Forward+ Rendering verwenden, zusammen mit dem GPU Resident Drawer und GPU Occlusion Culling. Wir hatten den SRP-Batcher verwendet, bevor wir von Unity 2021.3 auf Unity 6 aktualisiert haben. Der Resident Drawer und das Occlusion Culling verbesserten die Leistung um etwa 20 % im Vergleich zum SRP-Batcher. Die weniger komplexen Shader und Texturen trugen ebenfalls zur Leistungsverbesserung bei. Wir haben überprüft, dass alles funktioniert, indem wir mit RenderDoc Proben genommen haben, während wir vorankamen, und Probleme behoben haben, als sie auftraten. Am Ende kann man auf dem SteamDeck mit 30-60 fps bei mittleren Grafikeinstellungen spielen.
Ich wollte wirklich eine große offene Umgebung schaffen, die es den Spielern ermöglicht, zu tun, was sie wollen. Es ist mehr ein Sandbox-Spiel als etwas wie Call of Duty, wo man einfach denselben Flur mit denselben Gegnern entlanggeht, die an ihren Positionen erscheinen. Ich wollte dem Spieler die Freiheit geben, zu wählen, wie er verschiedene Ziele angeht, und die Tageszeit einbeziehen. Und dann mit dem Koop-Spiel ermöglicht es ihnen, sich in Einzelpersonen oder Teams von zwei aufzuteilen oder einfach in einer großen Gruppe von vier zu bleiben – das hat viel hinzugefügt.
Wir werden das Spiel erweitern – wir haben fünf weitere Missionen in Arbeit. Wir haben gerade unser erstes Inhalts-Paket abgeschlossen, das weitere 12 Waffen, 14 oder 16 Uniformoptionen und eine Menge neuer Ausrüstung hinzufügt.
Ich habe die alten Delta Force und Ghost Recon Spiele wirklich genossen, also wollte ich etwas Ähnliches bauen. Ich musste den Kunststil einfach halten, weil ich Ingenieur bin, nicht wirklich ein Künstler. Ich konzentrierte mich darauf, Kunst zu machen, die ich machen konnte – also wenn ich das ganze Spiel selbst machen müsste, könnte ich das. Das ist der Ursprung des Stils des Spiels. Aber ich denke, es hat ziemlich gut funktioniert, die Echtzeit-Lichteffekte und die Nachbearbeitung mit alt aussehenden Texturen und Low-Poly-Modellen zu mischen. Es fügt irgendwie viele Dinge zusammen.
Ich denke, Valheim hat mir viel Inspiration gegeben, als es herauskam, denn vorher hatte ich nicht wirklich all die Nachbearbeitung und Lichteffekte, es sah viel mehr wie ein Spiel aus den 90ern aus. Dann sah ich, was sie mit vielen der Effekte gemacht haben, die sie hatten, und ich dachte, ich könnte das auch machen.
Wann bist du zu Unity 6 gewechselt?
Das Projekt begann in Unity 2019, dann habe ich auf Unity 2021.3 aktualisiert. Ich habe das bis Ende letzten Jahres liegen lassen, als ich auf Unity 6 aktualisierte, nur um das GPU Occlusion Culling auszuprobieren. Und das gab uns einen guten Leistungszuwachs von 15 bis 20%.
Vorher verwendete ich den SRP Batcher mit URP und ein paar anderen Dingen, und ich konnte all das ausschalten und nur mit dem GPU Occlusion Culling arbeiten. Ich benutze keine LODs, aber es hat die Einstellung, um basierend auf der Bildschirmgröße zu cullen, also habe ich das alles aktiviert, und wieder war es eine Verbesserung der Leistung um 15 bis 20%. Und wir haben das Spiel jetzt auf dem Steam Deck am Laufen. Ich bin nicht zurückgegangen, seit ich die Leistungssteigerungen gesehen habe.

Lass uns ein bisschen mehr über die Netzwerkseite sprechen – wie verwendest du Relay?
Es ist hauptsächlich für Spieler, damit sie nicht eine Menge Dinge an ihrem Router einrichten müssen. Ich habe Portweiterleitung ausprobiert, als ich ein paar Tage damit verbrachte, eine Menge Multiplayer-Systeme zu testen und zu sehen, was gut funktionierte. Wir haben es anfangs ziemlich schnell eingerichtet, aber als wir uns entschieden haben, Unity 6 Multiplayer für das Networking zu verwenden, habe ich einfach Relay eingerichtet, und wir haben seitdem auf diese Weise getestet.
Für die Leistung haben wir den Netzwerk-Simulator verwendet, der gut funktioniert hat. Allein die Verbindung zu einem Handy über einen Hotspot hat uns bei den Leistungstests sehr geholfen.
Du hast auch Distributed Authority verwendet. Wie kam es dazu?
Ich habe darüber nachgedacht, Multiplayer für dieses Spiel zu machen, nachdem wir die Demo veröffentlicht hatten. Der größte Punkt des Feedbacks war, dass die Leute Koop-Spiel wollten – wir wussten, dass das wichtig sein würde, aber wir dachten daran, es für das zweite Spiel aufzusparen.
Aber aufgrund des Feedbacks und nach Gesprächen mit unserem Publisher haben wir beschlossen, uns hinzusetzen und zu sehen, wie lange es dauert. Ich habe Photon ausprobiert und dann Photons Fusion-System und dann ein paar andere Bibliotheken angesehen. Ich habe darüber nachgedacht, einfach mein eigenes zu bauen, und dann habe ich beschlossen, den Netcode for GameObjects auszuprobieren. Ich habe mich entschieden, Distributed Authority auszuprobieren, weil das ganze Spiel im Grunde fertig war – ich wollte mich nicht mit der Anfrage und Genehmigung von Eigentumsänderungen von GameObjects beschäftigen.
Da es sich um ein Koop-Spiel handelt, ist das Schummeln der Spieler kein wirkliches Problem für uns – wenn sie mit ihren Freunden schummeln, liegt es an ihnen. Wir haben auch Cheats im Spiel, sodass sie unendliche Munition und mehr aktivieren können – wenn sie Objekte duplizieren, spielt das also keine Rolle.
Das hat mir geholfen, mich für DA zu entscheiden. Wir konnten diese Dinge schnell einrichten, sodass die anderen beiden Mitglieder an der Fertigstellung des Inhalts arbeiten konnten, während ich mich auf das gesamte Networking konzentrierte. Ich schätzte, dass es 12 oder 13 Wochen dauern würde, um alles fertigzustellen, und es dauerte letztendlich etwa 14.

Ihr habt Relay verwendet, also nehme ich an, manchmal läuft es im Direktverbindungsmodus?
Ja. Ich habe auch die Direktverbindung eingerichtet, damit die Spieler es selbst ausführen können und ihre Freunde sich direkt mit ihnen verbinden können. Sie müssen das Port-Forwarding auf ihrem Router einrichten, aber ich habe Anweisungen, wie man das macht. Aber dann gibt es keine Host-Migration, also wenn der Host aussteigt, endet das Spiel einfach für alle.
Diese Funktionalität ist mehr für den Fall, dass wir als Studio jemals schließen oder wenn Unity die Relay-Server oder so etwas abschaltet, können die Spieler zumindest weiterhin Direktverbindungs-Spiele spielen, hoffentlich eine Weile.
Das macht Sinn. Das ist sehr zukunftsorientiert und auch gut für die Spieler, also ist es großartig, das zu hören.
Fast jedes Spiel, an dem ich in den letzten 15 Jahren gearbeitet habe, war Multiplayer, und das war überall ein Problem, wo ich war – etwas schaltet sich unerwartet ab und dann müssen wir uns beeilen, um etwas zu reparieren. Ich wollte diesen Dingen zuvor kommen.
Du hast Host-Migration und Eigentumsübertragungen in Diskussionen erwähnt. Wie fühlst du dich über den Wert, den DA bringt? Ist es eine gute Ergänzung für dein Spiel und hilft es bei der Entwicklung?
Die Host-Migration war besonders nahezu nahtlos. Wieder einmal ist das eines dieser Dinge, die immer ein Problem in Spielen waren, an denen ich in der Vergangenheit gearbeitet habe, wo der Host plötzlich weg ist und wir dann eine Menge Dinge umschalten und entscheiden müssen, wer was besitzt und all das.
Aber es gab viele Dinge, die einfach funktioniert haben. Ich mache das schon ewig, also sehe ich das passieren und bin anfangs sehr misstrauisch. Aber wir hatten auch keine Probleme, oder wenn wir auf ein kleines Problem stoßen, schaue ich mir einfach die Dokumentation an und es ist normalerweise so: „Oh, ich habe vergessen, ein Kästchen zu aktivieren, das besagt, dass dieses Spielobjekt automatisch an die nächste Person übertragen werden soll“, oder was auch immer. Es war nur eine Frage, sicherzustellen, dass ich die Dinge richtig einstelle, damit ich, wenn ich auf Probleme stoße, sie schnell mit diesem System beheben kann.
Schau dir Dagger Directive im Early Access auf Steam an und sieh dir das neueste Update des Teams hier an. Erfahre mehr über Distributed Authority und andere Unity Multiplayer-Lösungen und finde Geschichten von Unity-Entwicklern auf unserer Ressourcenseite.
