Systeme, die Ökosysteme schaffen: Aufstrebendes Spieldesign

EDUARDO ORIZ / UNITY TECHNOLOGIESSenior Content Marketing Manager
Dec 7, 2021|10 Min.
Systeme, die Ökosysteme schaffen: Aufstrebendes Spieldesign
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Mit einfachen Skripten können Spieldesigner Systeme in ihren Spielen erstellen, die zu einem interessanten und unerwarteten Gameplay führen - eine Art organisiertes Chaos, das die Spieler begeistert und fesselt. Wir haben uns mit dem Spieldesigner Christo Nobbs zusammengesetzt, der seinen Ansatz für die Entwicklung von emergentem Gameplay mit Hilfe einiger wichtiger Unity-Funktionen erläutert.

Aus jahrelangen Gesprächen mit einzelnen Entwicklern und Spielestudios wissen wir, dass Spieldesigner, die Gameplay und Designmechaniken in Unity erstellen, dem Rest des Teams ihre Vision für das Spiel klar und detailliert darlegen können.

Wir haben ein neues E-Book mit dem Titel "The Unity game designer playbook" für Spieldesigner erstellt, die lernen möchten, wie man in Unity Prototypen erstellt, Spiele entwickelt und testet. Neue und erfahrene Spieleentwickler können diesen Leitfaden nutzen, um ihr Profil um Unity-Kenntnisse zu erweitern.

Christo Nobbs, ein leitender technischer Spieldesigner, der sich auf die Entwicklung von Systemspielen und Unity (C#) spezialisiert hat, hat zu diesem E-Book beigetragen. In diesem Blog-Beitrag, dem ersten einer Serie für Spieldesigner, geht er auf einige der Tipps und Beispiele für die Gestaltung von Systemen ein, die er in seinem E-Book gegeben hat.

Test-Projekt
Bild aus einem Testprojekt zur Veranschaulichung eines Brandausbreitungssystems und des möglichen Chaos, das daraus entstehen könnte.

Bei der Spieleentwicklung sollte ein nützliches System eine klare Funktion haben, Daten enthalten und modular sein. Auf diese Weise kann es nicht nur mit einem anderen System interagieren, sondern auch mit sich selbst auf anderen GameObjects auf unterschiedliche Weise. Wenn man über ein systemisches Spielsystem nachdenkt, ist es oft hilfreich, es sich nicht als komplette Architektur vorzustellen, sondern als einen Teil der Funktionalität, der sich rekursiv durch das Spiel ziehen kann.

Durch die Kombination solcher Systeme können Sie einzigartige Ökosysteme schaffen, die auf die Aktionen des Spielers reagieren und durch "Designhebel" (im Gegensatz zu versteckten, fest kodierten Werten) ausbalanciert sind. Diese Hebel werden eingesetzt, um ihre Daten zu manipulieren, was zu systemischen Spielchen führt.

Die meisten Spiele haben mindestens ein System in sich, sei es eine einzelne Mechanik mit Werten, die durch das Spiel angepasst werden können, oder ein Netzwerk von Systemen. In einem Strategiespiel wie Age of Empires, in dem der Spieler lernen muss, wie er Ressourcen nutzen und manipulieren kann, um voranzukommen und seine Gegner zu besiegen, sind es komplexe Ökosysteme, die das Spielgeschehen bestimmen.

Letztendlich ist es Sache der Spieldesigner selbst, zu entscheiden, wie sie den Spieler durch ein Spiel führen wollen. Soll das Spiel auf einem geführten, linearen Weg ablaufen, oder soll es von einem oder einer Kombination von Systemen gesteuert werden, die organische, sich entwickelnde Ergebnisse ermöglichen?

Modulare Systeme können zu interessantem Gameplay führen

Bei der Entwicklung eines kleinen Systems sollten seine Modularität und seine Fähigkeit, mit sich selbst und anderen Systemen in Verbindung zu treten, im Vordergrund stehen, da diese Eigenschaften interessante Spielabläufe fördern können. Sie möchten über die möglichen Reaktionsketten nachdenken, die sich ergeben können, wenn ein System über ein anderes Objekt mit sich selbst kollidiert oder wenn zwei einfache Systeme ein Nebeneinander bilden, um darin zu spielen. Versuchen Sie immer, Systeme zu schaffen, deren Funktion für den Spieler klar ist, so dass er eine vernünftige Chance hat, zu lernen, wie ein bestimmtes System funktioniert, um sich einen Vorteil zu verschaffen.

Sauerstoff nicht inbegriffen
Sauerstoff nicht inbegriffen von Klei

Ein Beispiel für eine Kettenreaktion ist das Spiel Oxygen Not Included, bei dem das Ziel der Hauptschleife darin besteht, eine Reihe von Systemen auszubalancieren, um einen Zustand der symbiotischen Utopie zu erreichen und weiter voranzukommen. Ein weiteres Beispiel stammt aus Divinity Original Sin 2 von Larian Studios, wo Mobs, die explodieren, um anzugreifen, dies nicht mehr tun können, wenn der Spieler sie nass macht, wodurch der Kampf einfacher wird. Oder der Spieler kann den Boden in Brand setzen, um sich vor dem Mob zu schützen, wenn dieser auf ihn zustürmt.

Ein modulares System kann Ihrem Spiel mehr Wert verleihen, weil Sie Teile eines Systems verwenden können, um ein anderes, anderes System zu schaffen. Eine Funktion von Unity, die Christo für fast alles verwendet, sind Animationskurven. Er sagt: "Die Verarbeitung ihrer Daten ist fast immer die gleiche. Sie bieten mehr Kontrolle als ein einziger Wert zum Ausgleich. Und Sie können die Mechanik erleichtern oder sogar die Systemgrenzen außer Kraft setzen, um ein Detail zu optimieren.

Ein modularer Ansatz für das Design ermöglicht es Ihnen auch, die Programmierer so genau wie möglich zu instruieren, so dass sie die Spielsysteme effizienter bearbeiten und debuggen und sie in verschiedenen Konfigurationen im Spiel wiederverwenden können.

Design-Hebel

Designhebel sind nützlich, um Werte anzupassen, um ein Ergebnis zu manipulieren, z. B. um den Schwierigkeitsgrad des Spiels zu erhöhen oder zu verringern, damit es lohnend ist und den gewünschten Grad an Komplexität bietet. Mit Designhebeln können Sie immer wieder testen und anpassen, bis Sie das gewünschte Ergebnis erhalten.

Design-Hebel können in der Konzept- und Prototyp-Phase der Spielentwicklung bis hin zum Feinschliff nach der Produktion eingesetzt werden. Christo sagt, dass er Design-Hebel hinzufügt, wenn er seine Ideen in einem Flussdiagramm festhält. Überlegen Sie sich schon in einem frühen Stadium Ihres Projekts, welche Schalter und Hebel Ihr System braucht, damit Sie die Feinabstimmung vornehmen und Spielmöglichkeiten erforschen können, ohne sich später auf die Überarbeitung des Codes verlassen zu müssen.

Das folgende Bild zeigt ein Diagramm, das ein einfaches Gameplay darstellt, bei dem die Feinde beim Start vor Ort sind und der Spieler das Spiel mit geladenen Waffen betritt. Im Wesentlichen müssen sie Feinde töten, aber durch Manipulationen an den Designhebeln können Sie das Gameplay verändern und den Schwerpunkt verlagern. In einem Fall liegt der Schwerpunkt auf dem schnellen Töten vieler Feinde innerhalb eines Zeitlimits, während in einem anderen Fall der Schwerpunkt auf dem Töten einer bestimmten Anzahl von Feinden in kürzerer Zeit liegt, so dass den Spielern Zeit bleibt, fallen gelassene Beute einzusammeln, bevor sie abgezogen werden.

Ein einfaches Diagramm zum Spielablauf
Ein einfaches Gameplay-Design

Dieses System könnte auch verwendet werden, um ein komplettes Geschossgewitter mit hervorragenden Tropfen und verschiedenen Munitionstypen mit eigenen Eigenschaften zu erzeugen. Durch das Hinzufügen weiterer Gestaltungshebel, wie z. B. eine Zeitüberschreitung für den Respawn, können Sie das System weiter ausbauen.

Ein System zur Herstellung von Waffen in Escape from Tarkov

Escape from Tarkov von Battlestate Games ist ein weiteres gutes Beispiel für systemisches Spieldesign in Unity. Das Spiel verfügt über ein Crafting-System, mit dem eine Waffe mit einem eigenen Datensatz erstellt werden kann, wie auf dem Bild unten zu sehen. Dieser Datensatz wirkt sich ähnlich wie die Gesundheit des Spielers auf die Eigenschaften der Waffe und das gesamte Gameplay der Waffe aus. Wenn der Spieler eine gebrochene Gliedmaße oder ein Gebrechen erleidet, ist seine Waffe schwieriger zu benutzen, während ein gesunder Spieler die Waffe besser kontrollieren kann.

Waffe aus Escape from Tarkov
Das System zur Herstellung von Waffen in Escape from Tarkov

Die Beziehung zwischen dem einen System, den Waffen, und dem anderen, der Gesundheit, ermutigt den Spieler, nicht nur sein Leben, sondern auch leistungsfähigere Waffen zu schätzen. Niemand möchte, dass eine AK ohne Staubschutzhülle oder Schaft herumspringt, wenn sie einen Schuss nach dem anderen verpassen, ein klares Zeichen dafür, dass die Waffe in ihrer derzeitigen Konfiguration eine schlechte Option ist.

Außerdem gibt es eine große Auswahl an Munitionstypen mit unterschiedlichen Eigenschaften sowie an Rüstungen. Die Art der Munition und der Rüstung des Gegners bestimmt, an welcher Stelle des Körpers man auf ihn schießen muss, um den größten Schaden anzurichten, wodurch ein Meta-Gameplay entsteht. Diese Systeme mit ihren jeweiligen visuellen Merkmalen sind so aufeinander abgestimmt, dass sie die von ihren Entwicklern angestrebte "Essenz" des Spiels vermitteln.

Flucht aus Tarkow
Die Escape from Tarkov-Systeme sind auf Realismus ausgelegt.
ScriptableObjects als Gestaltungshebel

Eine Möglichkeit, Designhebel in Unity einzurichten, ist die Verwendung von ScriptableObjects. Diese können als Container für Daten verwendet werden, die als Assets gespeichert und von Skripten aus referenziert werden, ohne dass Abhängigkeiten zu anderen Objekten in einer Szene entstehen.

Sie können mehrere ScriptableObject-Assets erstellen, die verschiedene Wertesätze enthalten, die Sie gemeinsam nutzen und austauschen können, um ganze Abschnitte des Gameplays zu verändern, ähnlich wie bei Voreinstellungen. Ihre Änderungen werden im Spielmodus mit ScriptableObjects gespeichert, so dass Sie nach dem Verlassen des Spielmodus nicht mehr zu den Notizen zurückkehren und Änderungen vornehmen müssen.

Beim Prototyping eines Charakters können Sie beispielsweise das Gefühl des Charakters ändern, indem Sie das ScriptableObject-Asset durch ein Asset mit einem anderen Satz von Werten ersetzen. Dies ist ein möglicher Einstieg in das Prototyping von Buffs und Debuffs oder die Verknüpfung der Charakterauswahl mit Profilen.

Nehmen wir an, Sie entwickeln ein Shooter-Spiel und haben ein Waffensystem mit willkürlichen Werten für Aktionen wie Rückstoß, Feuerrate, Genauigkeit, Feuermodi, Audioeinstellungen, VFX-Einstellungen und so weiter implementiert. Sie können eine beliebige Anzahl neuer Waffenprofile erstellen und deren Einstellungen im Spielmodus, in dem Ihre Änderungen gespeichert werden, auf einmal anpassen. Sie können diese voreingestellten skriptfähigen Objekte auch an Ihre Teammitglieder senden, um deren Feedback einzuholen, was nützlich ist, wenn Sie versuchen, das richtige Gefühl für das Gameplay zu finden.

Design-Hebel können einzelne Variablen im Code als öffentliche Eigenschaften ersetzen und sie können mit dem RangeAttribute von Unity auf einen bestimmten Bereich begrenzt werden, so dass sie als Schieberegler im Inspektor angezeigt werden können. Die Absicht ist, die Hebel im laufenden Betrieb und nicht nur im Wiedergabemodus zu manipulieren, d. h. es ist auch anwendbar, wenn Sie im Bearbeitungsmodus arbeiten oder ein Werkzeug testen.

Panels, die in Unity angepasst werden können, Bildschirmfoto
1) Die Attribute "Bereich", "Tooltip" und "Kopfzeile". Die Inspektoren können an Ihre Designanforderungen angepasst werden. 2) Ein mit Odin erstellter benutzerdefinierter Inspektor, der im Asset Store verfügbar ist 3) In ScriptableObjects gespeicherte Daten, die dazu dienen können, verschiedene Datensätze oder Profile zu erstellen, in diesem Fall verschiedene Spezialangriffe

In Survival-Spielen und anderen Genres erwartet der Spieler eine Reihe von Wahlmöglichkeiten, die logische und vernünftige Konsequenzen nach sich ziehen und ihn dazu veranlassen, eine Lösung für jede Herausforderung zu finden. Wie könnte man ein System so gestalten, dass sowohl die Herausforderungen als auch die Lösungen bis zu einem gewissen Grad das Ergebnis von Emergenz sind?

Betrachten wir ein Beispiel, bei dem der Spieler in einem Gebiet bleiben muss, um zu überleben, wie in dem Spiel Don't Starve von Klei Studio. Der Spieler kann sich in der Nähe eines Feuers aufhalten, um den Feind am Angriff zu hindern. Das Feuer kann auch zum Kochen von Speisen und zum Wärmen der Spieler verwendet werden. Wenn das Feuer jedoch dem Spieler, dem Essen oder brennbaren Gegenständen zu nahe kommt, verbrennt es diese.

Welche Art von System ist erforderlich, um Kettenreaktionen wie die oben beschriebene zu erzeugen? Man könnte einfach ein Volumen schaffen, in dem der Spieler steht und das mit der Zeit Wärme abgibt, oder man könnte eine lineare Feuerausbreitung als System erstellen. Aber warum sollte man nicht mit einem eher systemorientierten Designerblick an die Sache herangehen? Sie wollen den Spieler zwingen, in einer Situation zu reagieren, die das Ergebnis einer Kettenreaktion von einzelnen Feuerausbreitungssystemen ist, die miteinander und mit anderen Systemen in der Spielwelt kollidieren.

Capsule Colliders in unserem Beispielprojekt
Die Capsule Colliders zeigen den Bereich an, in dem Hitze von einem GameObjects auf ein anderes übertragen werden kann, vorausgesetzt, sie haben die Feuerausbreitungs-Systemkomponente angeschlossen, wodurch eine Kettenreaktion entsteht. Wenn ein GameObjects in Flammen steht, färbt sich der Bereich rot, um anzuzeigen, dass Wärme zugeführt wird. Die GameObjects, die Wärme erhalten, sind gelb geworden, was anzeigt, dass sie sich erhitzen, bevor sie sich entzünden und rot werden.

Man könnte ein System haben, in dem Bäume in einem bestimmten Bereich des Geländes um einen Teich herum im Laufe der Zeit wachsen. Diese Bäume treiben aus und wachsen dann, bis die Platzgrenze erreicht ist. Wenn sie reif sind, können die Bäume gefällt und zu Holz verarbeitet werden, das natürlich auch brennbar ist.

Der Spieler kann dieses Holz verwenden, um Gegenstände zu bauen, z. B. einen schicken Holzstuhl, oder er kann damit ein kleines Lagerfeuer neben dem Teich machen, um sich nach dem Schwimmen zu wärmen und zu trocknen. Aber was passiert, wenn man dem Spieler die Möglichkeit gibt, das Lagerfeuer anzuzünden?

Das System der Entflammbarkeit des Holzes ist nicht komplex, aber wenn etwas brennt, strahlt es Wärme in einem Radius ab, und wenn dieser Wärmewert über dem Grenzwert für den nahegelegenen Holzgegenstand oder Baum liegt, fangen auch diese Dinge Feuer (einfache Ausbreitung). So hat der Spieler beim Anzünden seines Lagerfeuers seinen schönen Holzstuhl in Brand gesetzt. Der Spieler muss sich nun den Stuhl schnappen und ihn ins Wasser werfen, um das Feuer zu löschen. Doch während er das tut, setzt das Lagerfeuer den nächsten Baum in Brand, und schon hat man einen Waldbrand am Hals.

Selbst ein kleines und überschaubares System wie dieses Beispiel kann für die Spieler unterhaltsame und "ungeschriebene" Erlebnisse schaffen. Außerdem ist es wichtig, sich auf das gewünschte Ergebnis für den Spieler zu konzentrieren und nicht auf ein Design, das zu sehr an die Realität gebunden ist, da man dann weniger Möglichkeiten hat, unerwartete Ergebnisse zu erzielen.

In diesem Beispiel können Sie in Unity emergente Möglichkeiten schaffen, indem Sie Ihre Design-Hebel in einem ScriptableObject speichern, das Sie auf etwas platzieren, das Feuer fangen soll. Beginnen wir mit Holz in einer Welt, in der ein toter Baum am Ufer bereits brennt , sich aber zum Wasser hin neigt, und unser Spieler sich aufwärmen muss.

In diesem Beispiel befindet sich auf dem Holz ein ScriptableObject mit verschiedenen Werten.

Skriptfähiges Objekt
Skriptfähiges Objekt
Code für das skriptfähige Objekt
Code für das skriptfähige Objekt

Schauen wir uns diese Werte genauer an:

  • Standardtemperatur: Ein Platzhalterwert, wenn nichts von einem globalen Zustand geerbt werden soll. Sind die Temperaturen weltweit zu hoch oder zu niedrig, kann sich dies auf das gesamte System auswirken, da höhere Temperaturen einen Waldbrand auslösen könnten, vorausgesetzt, alle Bäume nutzen das System der Brandausbreitung.
  • Aktuelle Temperatur: Die Temperatur eines Gegenstandes beim Erhitzen oder Abkühlen, die bestimmt, ob ein Gegenstand verbrannt ist oder nicht (wenn der aktuelle Temperaturwert über dem Widerstandswert liegt)
  • Verbrennungstemperatur: Die Temperatur, die ein Gegenstand erreichen muss, bevor er in Brand gerät
  • Aufheizrate: Wie schnell sich der Gegenstand erwärmt, wenn er sich in der Nähe einer anderen Wärmequelle befindet
  • Abklingrate: Wie schnell der Gegenstand auf seine "unerhitzte" Temperatur zurückkehrt, was als Retention oder thermische Qualität bezeichnet werden könnte, solange der Name des Designhebels selbstbeschreibend ist
  • Verbrennungsrate: Wie schnell der Gegenstand mit der Zeit verbrennt
  • Kraftstoff: Wie viel Brennstoff der Gegenstand beim Verbrennen hat
  • Hitzebeständigkeit: Die Stärke der Wärme innerhalb des Radius
  • Wärmeradius: Reichweite oder Ausdehnung der Wärme

Mit etwas unterstützendem Gameplay-Code können Sie ein Objekt neben einem anderen in Brand setzen. Sie können Profile Ihrer Prototypen speichern und verschiedene Einstellungen ausprobieren, bis Sie die Sollbruchstellen finden, und diese Werte dann mit Attributen festlegen.

Prototyping mit Assets aus dem Asset Store
Prototyping mit Assets aus dem Asset Store

Es ist nicht vorgesehen, dass Feuer durch Wasser blockiert wird, aber wenn sich auf dem Wasser nichts Brennbares befindet, kann sich das Feuer nicht ausbreiten, wenn es die andere Seite nicht erreichen kann, es sei denn, Sie bauen ein neues System ein.

Dieses Beispiel eines Brandausbreitungssystems bietet verschiedene Möglichkeiten, das gleiche Ergebnis zu erzielen, indem man mit dem Brennstoff, der Brenngeschwindigkeit und der Wärmestärke spielt. Und Sie können neue Ergebnisse erstellen, indem Sie beispielsweise Brennstoff durch "Gesundheit" ersetzen, um einen konstanten Bereich für die Kontrolle zu erhalten, wann ein Baum fällt, ohne die Funktionalität zu verlieren. Wenn ein Baum einen niedrigen Gesundheitszustand erreicht, besteht eine hohe Wahrscheinlichkeit, dass er fällt. Wenn ein brennender Baum nur noch wenig Lebenspunkte hat, kann er umfallen und ein absolutes Chaos anrichten, wenn er vom Spieler in einem Bereich mit brennbaren Objekten unbeaufsichtigt gelassen wird.

Wenn Sie weitere Systeme zu Ihrer Umgebung hinzufügen, schaffen Sie ein Ökosystem von Systemen, die miteinander reagieren können. Wenn man davon ausgeht, dass der Spieler Gegenstände aus Holz ernten, bauen und herstellen kann und dass alle unser System der Feuerausbreitung übernehmen, könnte das Chaos um die Ecke sein, wenn man nicht aufpasst!

Skriptfähiges Objekt in Unity
Ein skriptfähiges Objektdaten-Asset

Sie können eine sehr flüchtige Brandausbreitungskonfiguration erstellen, indem Sie den Verbrennungsschwellenwert verringern und die Aufheizrate erhöhen, damit die Objekte schneller verbrennen. Vergrößern Sie den Radius, um eine schnellere und unkontrollierbarere Ausbreitung zu erreichen. Die Aufheizrate ist auf einen Wert von 0 bis 50 begrenzt, um die Granularität zu gewährleisten; die Wärmestärke kann verwendet werden, um diesen Wert zu multiplizieren, aber Sie sollten ihn in einem vernünftigen Bereich halten. Eine Hitzestärke von 4 erweitert die Erhitzungsrate auf einen Bereich von 0 bis 200, was ein Overkill ist und innerhalb weniger Sekunden zu einem Waldbrand führen würde. Da der Spieler keine Zeit hat, zu reagieren, um die Flammen zu kontrollieren, ist das kein tolles Spielerlebnis.

Anpassen des skriptfähigen Objekts
Anpassen des skriptfähigen Objekts

Die Anhebung des Verbrennungsschwellenwerts auf 300 sorgt für ein ausgewogeneres System der Brandausbreitung. Der Spieler kann andere Aufgaben erledigen, bevor ein Feuer ausbricht, und wenn es ausbricht, hat er Zeit zu reagieren und es unter Kontrolle zu bringen, wenn er schnell ist. Vor allem, wenn sie in der Lage sind, Bäume zu fällen, Barrieren zu errichten oder Zugang zu einem ebenso systemischen und einfachen Wassersystem zu haben.

Sie können das Brandausbreitungssystem weiter ausbauen, indem Sie einen Widerstandswert für Objekte innerhalb des Hitzeradius eines Feuers einführen. Dies würde es ermöglichen, Brände mit unterschiedlichen Temperaturen zu erzeugen oder Strukturen mit feuerfesten Beschichtungen zu versehen, um sie zu verbessern. Es ist wahrscheinlich übertrieben, aber es ist ein Beispiel dafür, wie man das Gameplay-Design systematisch überdenken kann, um dem Spieler mehr Möglichkeiten zu geben, in einer kalten Waldumgebung zu überleben und zu gedeihen, wenn er mit dem Feuersystem interagiert.

Ein sehr denkwürdiger Moment Don't Starve von Klei, als ein Waldbrand ausbricht
Ein sehr denkwürdiger Moment Don't Starve von Klei, als ein Waldbrand ausbricht

Das Beispiel der Feuerausbreitungssysteme zeigt, wie man eine lineare Mechanik in eine interessante Erfahrung verwandeln kann, die es dem Spieler ermöglicht, Herausforderungen zu lösen, indem er die Systeme des Spiels lernt und versteht. Und wenn Ihr System die Realität nicht nachahmen muss, müssen Sie keine zusätzliche Komplexität und Abstraktionen einbauen.

Anhand dieses einfachen Beispiels wird in diesem Beitrag untersucht, wie Sie modulare, kleine und einfache Systeme mit Interaktivität entwerfen können, die ein größeres Ökosystem für das Gameplay schaffen, das durch Designhebel ausgeglichen werden kann, die Sie mit dem Input Ihrer Kollegen optimieren und iterieren können. Diese Elemente können unerwartete Momente des Spaßes, der Freude und der Spannung für Ihre Spieler schaffen und dazu beitragen, Ihr Spiel zu einem wirklich einzigartigen Erlebnis zu machen.

Viele weitere Tipps, Anleitungen und Inspirationen zum Entwerfen und Aufpeppen von Gameplay in Unity finden Sie in unserem neuen, kostenlos erhältlichen E-Book.