World of Warcraft

Hinter den Kulissen: Die Entwicklung der WoW Companion App

Hinter den Kulissen: Die Entwicklung der WoW Companion App

Eines der größten technischen Upgrades, die wir für Shadowlands an der WoW Companion App vorgenommen haben, ist die Unterstützung mehrerer Erweiterungen. Viele Spieler haben um dieses Feature gebeten, weshalb wir heute über einige der Herausforderungen und Entscheidungen sprechen wollen, die mit einer so umfassenden technischen Änderung einhergehen.

Ein paar historische Fakten

Die Companion App wurde ursprünglich zur Unterstützung einer Erweiterung entwickelt: Legion. Vor der Veröffentlichung von Battle for Azeroth beschlossen wir, mehrere große Backend-Verbesserungen zu priorisieren, darunter die Möglichkeit, Code zwischen App und PC-Client zu teilen. Dadurch ist es uns möglich, zahlreiche Features und Tools der Benutzeroberfläche des Hauptspiels zu nutzen, auf die die App vorher nicht zugreifen konnte. Der Nachteil war, dass wir nicht die Art von Framework entwickeln konnten, die zur Unterstützung von mehr als einer Erweiterung gleichzeitig nötig gewesen wäre. Deshalb ersetzten wir Legion als einzige Erweiterung, die die App unterstützte, durch die neueste Erweiterung Battle for Azeroth.

Wir wissen, dass Spieler enttäuscht darüber waren, nach der Umstellung den Zugriff auf Legion-Inhalte über die App zu verlieren. Deshalb haben wir uns für Shadowlands vorgenommen, mehr als eine Erweiterung auf einmal zu unterstützen. Zusätzlich war das Team für Mobilgeräte bestrebt, der Community die Inhalte von Legion zurückzugeben.

Wir haben kurz die Option erwogen, nur einen Teil der Funktionen aus vorherigen Erweiterungen zu unterstützen, um uns auf die Inhalte für Shadowlands konzentrieren zu können. Doch wir haben uns schnell entschieden, dass wir einen möglichst großen Teil der Funktionalität wiederherstellen wollten. Wir wussten auch, dass Spieler mit Shadowlands die Option haben würden, mit ihren Nebencharakteren bis Legion über Zeitwanderungskampagnen Stufen aufzusteigen. Also wollten wir sicherstellen, dass diesen Spielern dafür eine vollständige mobile Unterstützung zur Verfügung steht.

Wählt eure Erweiterung
Mit der Companion App können Spieler sich ab dem Vorbereitungspatch für Shadowlands zwischen Legion und Battle for Azeroth entscheiden. Inhalte von Shadowlands werden ab der Veröffentlichung der Erweiterung verfügbar sein.

Ein zweischneidiges Schwert war, dass ein Großteil des Legion-spezifischen Codes immer noch in der App vorhanden war und wir die ursprünglichen Legion-Assets noch in unserer Quellkontrolle hatten. Dadurch wurde das erneute Hinzufügen der Legion-Inhalte zum perfekten Test für unser neues Framework für mehrere Erweiterungen. Zwar musste nicht mehr viel implementiert werden, aber wir hatten einiges an Arbeit vor uns, um Legion und Battle for Azeroth sauber voneinander zu trennen.

Für das Framework für mehrere Erweiterungen mussten drei Voraussetzungen erfüllt werden:

  1. Die App musste alle Daten für die Inhalte eurer aktuellen Erweiterung löschen und Daten einer neuen Erweiterung vom Server abfragen.
  2. Zur Trennung der Funktionalität mussten wir erweiterungsspezifischen Benutzeroberflächencode auftrennen.
  3. Wir mussten erweiterungsspezifische Assets aufbrechen, um die Ressourcennutzung der App zu minimieren.

Erweiterungsdaten

Als die Legion Companion App ursprünglich entwickelt wurde, war ein Großteil des Servercodes zum Bearbeiten von Anfragen aus der App speziell für die Ausgabe von Legion-Daten entwickelt. Als es Zeit für die Umstellung auf Battle for Azeroth wurde, änderten wir diese Funktionen, damit sie stattdessen Battle for Azeroth-Daten ausgaben. Diesmal benötigten wir allerdings die Möglichkeit, Daten für jede ausgewählte Erweiterung abzurufen. Also mussten wir alle Serverfunktionen für Anfragen von Mobilgeräten durchgehen und so ändern, dass sie Parameter akzeptieren, die angeben, für welche Erweiterung Daten abgerufen werden sollen. Beispielsweise musste die Anforderung von Anhängerdaten einen Anhängertyp angeben können (z. B. Legion-Anhänger oder Battle for Azeroth-Anhänger) und die Anforderung von Weltquests musste die Information enthalten, für welche Zonen Questdaten benötigt werden.

Auch in der App selbst wurden einige Stellen speziell zur Unterstützung von Battle for Azeroth erweitert. In Legion fragte die App konkret nach euren Ordensressourcen. Für Battle for Azeroth haben wir einfach Kriegsressourcen zu dieser Nachricht hinzugefügt. Anstatt für Shadowlands einfach weitere Währungen zur gleichen Nachricht hinzuzufügen, haben wir beschlossen, das Währungssystem des PC-Clients in das neue Framework mit gemeinsam genutztem Code zu portieren, das für Battle for Azeroth entwickelt wurde. Somit kann jetzt jede Erweiterung automatisch ihre eigenen Währungstypen anfordern, statt manuell anzugeben, welche Währungen benötigt werden.

Währungsdatenabfrage vorher
Vorher: Die App fragte konkrete Währungen vom Server ab.
Währungsdatenabfrage nachher
Nachher: Jede Erweiterung kann ihre eigenen Währungen abfragen. Wenn ihr Add-ons betrachtet, die das Währungssystem in Shadowlands nutzen, erscheint euch der Code vielleicht vertraut. Das liegt am Framework mit gemeinsam genutztem Code, welches es der WoW Companion App ermöglicht, Features mit dem Hauptspiel zu teilen.

Benutzeroberflächencode

Ein großer Teil des Codes zur Unterstützung der Erweiterung Battle for Azeroth wurde zusätzlich zum bestehenden Legion-Code geschrieben, wodurch es schwierig nachzuvollziehen war, welcher Code gerade aktiv genutzt wurde. Beispielsweise hatte die Anhängerliste in Battle for Azeroth weiterhin die Möglichkeit, Waffen anzuzeigen, allerdings war die Waffenschaltfläche versteckt, sodass der Code niemals aufgerufen wurde. Die Funktionalität der Erweiterungen Legion und Battle for Azeroth war ähnlich genug, sodass dies kein großes Problem war. Allerdings wussten wir, dass es mit den neuen Features für Shadowlands nicht machbar sein würde, diese Art von Architektur beizubehalten. Wenn Code, der mit Legion und Battle for Azeroth gemeinsam genutzt wurde, plötzlich Dinge wie Seelenbande und Pakte unterstützen müsste, würde er nur noch komplexer werden, als er ohnehin schon war.

Stattdessen gingen wir alle Skripte durch und stellten fest, welche Funktionen gemeinsam genutzt wurden und welche nur zu einer bestimmten Erweiterung gehörten. Wir teilten erweiterungsspezifischen Code in Teilklassen oder komplett neue Komponenten auf, behielten nur die gemeinsam genutzte Basisfunktionalität in den übergeordneten Klassen und erstellten mithilfe dieser neuen Teilklassen neue Spielobjekte für jede Erweiterung. Obwohl sie auf dem gleichen System basieren und einen Großteil ihrer Funktionen gemeinsam nutzen, benötigt jetzt nur die Missionen-Liste in Legion eine Kampfgefährten-Schaltfläche und die Abenteuerliste in Shadowlands kommt jetzt ohne das in Legion und Battle for Azeroth verwendete Design mit zwei Reitern aus und zeigt Porträts von Gegnern statt der Symbole von Missionstypen an.

Vergleich zwischen der Missionsliste von Legion und der Abenteuerliste von Shadowlands
Direkter Vergleich zwischen der Missionsliste von Legion und der Abenteuerliste von Shadowlands.

Eine weitere wesentliche Änderung, die wir für Shadowlands hinter den Kulissen an der App vorgenommen haben, ist die Art und Weise, wie wir Datenbankdateien generieren. Die Companion App baut Ihren Datenbankcode und Datendateien jetzt unter Verwendung der gleichen Pipeline auf wie der PC. Das hat sich unter anderem bei dem Code als praktisch erwiesen, der bestimmt, auf welcher Karte jede Weltquest angezeigt wird. Die App traf diese Entscheidung ursprünglich anhand manueller Logik für jede Karten-ID, was kein Problem war, wenn nur Argus und die Verheerten Inseln unterstützt werden mussten. Nachdem wir allerdings weitere Zonen für Battle for Azeroth hinzugefügt haben, wurde es schnell mühselig. Statt diesen Code für Shadowlands beizubehalten, konnten wir einfach die Datenbanktabellen der Benutzeroberflächenkarte heranziehen, die wir benötigten, um das System vollständig dynamisch zu machen. Wir konvertierten ein großes Codestück, das Zonen für alle drei Erweiterungen handhaben musste, zu einer einzigen schlanken Funktion, die jede Weltquest automatisch ohne erweiterungsspezifische Logik handhaben kann.

Asset-Dateien

Ein großer Unterschied zwischen der Entwicklung für Mobilgeräte und für PCs besteht darin, dass wir bei Mobilgeräten daran denken müssen, dass Nutzer der App möglicherweise begrenztes Datenvolumen oder eine schlechte Verbindung haben. Wir müssen den Spaß und die Frustfreiheit der Spieler gewährleisten, wenn sie die App verwenden, und zwar unabhängig von ihrer Internetverbindung. Unter anderem bewerkstelligen wir das, indem wir die Datenmenge begrenzen, die Spieler herunterladen müssen, um die App zu verwenden.

Jede Erweiterung ist mit zahlreichen Asset-Dateien verbunden, die sich sehr schnell summieren können. Da wir die App von einer Erweiterung mit Legion und Battle for Azeroth auf die Unterstützung von drei Erweiterungen mit Shadowlands erweitern, würde das die dreifache Menge an Daten bedeuten, die von der App benötigt werden. Allerdings werden viele Assets von nur einer Erweiterung verwendet, z. B. hochauflösende Weltkartentexturen, Hintergründe von Missionsorten sowie Porträts von Anhängern und Gegnern. Daher haben wir beschlossen, diese Assets für jede Erweiterung in unterschiedliche Pakete aufzuteilen. Somit muss die App nur solche Assets in den Arbeitsspeicher laden, die von der derzeit aktiven Erweiterung genutzt werden. Dadurch wird die Menge des von der App genutzten Arbeitsspeichers reduziert.

Wir haben außerdem schon früh beschlossen, alle Erweiterungen in ihre eigenen Spielszenen aufzuteilen, wodurch wir eine saubere Trennung der Funktionalität zwischen den Erweiterungen beibehalten können. Die Spielszene für Legion benötigt keine Seiten für Pakte und die Spielszene für Shadowlands hat kein Fenster zur Versendung von Truppen. Wie mit den Änderungen, die wir am Code vorgenommen haben, wird es auch damit einfacher zu begreifen, was zu jeder Zeit in der App geschieht. Durch die Auftrennung der Assets und der Spielszenen auf diese Weise ist jede Erweiterung eigenständig, wodurch auch einige benutzerfreundlichere Download-Optionen ermöglicht wurden.

Wir wollten Spielern mehr Kontrolle darüber geben, wann sie Assets für die App herunterladen müssen. Ihr könnt entweder alles gleichzeitig herunterladen, wenn ihr eine stabile Verbindung habt, oder Assets für andere Erweiterungen später herunterladen, damit ihr die App schneller nutzen könnt. Und wenn ihr beschließt, mit einer bestimmten Erweiterung nicht zu interagieren, werden ihr auch nie gezwungen, Assets für sie herunterzuladen. Bei 30 bis 40 MB pro Erweiterung ist das eine erhebliche Datenmenge, die ihr nicht herunterladen müsst!

Auswählbarer Download für jede Erweiterung
Durch die Trennung der einzelnen Erweiterungen habt ihr einen kleineren Download und könnt schneller anfangen zu spielen!

Änderungen an der Pipeline

Die Aufteilung unserer Assets nach Erweiterung erforderte Änderungen an zwei Stücken unserer Pipeline: Unser Tool zur Asset-Kuration musste wissen, welche Assets zu welcher Erweiterung gehören, und unser Tool zur Erstellung von Asset-Paketen musste diese Assets bei der Erstellung der finalen Pakete gruppieren können. Das Tool zur Asset-Kuration war ein weiterer Aspekt, der stark für die Unterstützung von Legion und dann für Battle for Azeroth spezialisiert war. Deshalb mussten wir es umschreiben, um es weniger erweiterungsabhängig zu machen. Die neue Version des Tools geht die Liste der Erweiterungen mit Inhalten durch, die die Companion App benötigen könnte (durch Iterationen der GarrisonType-Nummerierung), und gibt Assets für jede Erweiterung in separaten Ordnern aus. Die Modifizierung des Kurationstools für die Nutzung der gesamten Liste der Erweiterungen bedeutet auch, dass es automatisch Werte aufnimmt, die in Zukunft zu dieser Liste hinzugefügt werden. Dadurch wird es einfacher, der Companion App neue Inhalte hinzuzufügen, ohne kontinuierlich Updates an unseren Tools vornehmen zu müssen.

Unsere Erstellung von Asset-Dateien und das Laden während der Laufzeit machen starken Gebrauch von der AssetBundle-Variantenfunktion von Unity, die es der App ermöglicht, unterschiedliche Versionen einer einzelnen Paketdatei zu behandeln, als handelte es sich um dasselbe Paket. Die Paketerstellungs-Pipeline erstellt eine eigene Variante jedes Pakets für jede Erweiterung auf Basis der erweiterungsspezifischen Ordnerausgabe des Kurationstools. Diese Asset-Pakete werden während der Laufzeit ausgetauscht, wenn ihr die Erweiterungen in der App wechselt. Da alle Varianten eines Pakets auf die gleiche Weise behandelt werden können, kann beispielsweise jeder Code zum Abrufen von Anhängerporträts diese abrufen, ohne dass man sich darum sorgen muss, welcher konkrete Satz von Anhängerporträts aktuell geladen ist. Dadurch müssen wir uns bei unserem Feature-Code keine Gedanken über die praktischen Grundlagen des Ladens und Löschens von Assets machen – jede Erweiterung kann so tun, als wäre sie die einzige Erweiterung in der App.

Auf in die Schattenlande

Ganz gleich, ob ihr die neuen Abenteuer-Inhalte in Shadowlands spielt oder einen frischen Nebencharakter auf die Stufe von Legion bringt – wir freuen uns sehr darauf, euch mehr World of Warcraft-Inhalte für unterwegs mitzugeben! Wir hoffen, dass dies ein interessanter Einblick in unsere Arbeit und einige der Entscheidungen war, die in die Entwicklung von Frameworks einfließen, die nicht nur aktuelle Inhalte unterstützen können, sondern auch alles, was World of Warcraft in Zukunft noch zu bieten haben könnte.

Nächster Beitrag

Empfohlene Artikel