Demo

Puppo, The Corgi: Niedlichkeitsüberlastung mit dem Unity Ml-Agents Toolkit

VINCENT-PIERRE BERGES / UNITY TECHNOLOGIESContributor
Oct 2, 2018|7 Min.
Puppo, The Corgi: Niedlichkeitsüberlastung mit dem Unity Ml-Agents Toolkit
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.

Die Entwicklung eines Spiels ist ein kreativer Prozess, der viele anspruchsvolle Schritte umfasst, darunter die Definition des Spielkonzepts und der Logik, die Erstellung von Assets und Animationen, die Spezifikation von NPC-Verhalten, die Abstimmung von Schwierigkeitsgrad und Balance und schließlich das Testen des Spiels mit echten Spielern vor der Veröffentlichung. Wir sind davon überzeugt, dass Machine Learning im gesamten kreativen Prozess eingesetzt werden kann, und in unserem heutigen Blog-Eintrag konzentrieren wir uns auf eine dieser Herausforderungen: das Verhalten eines NPC zu spezifizieren.

Normalerweise wird das Verhalten eines NPCs mithilfe von Skripting- und Verhaltensbäumen hartcodiert. Diese (typischerweise langen) Listen von Regeln verarbeiten Informationen über die Umgebung des NPC (Beobachtungen genannt), um seine nächste Aktion zu diktieren. Diese Regeln können zeitaufwändig zu schreiben und zu pflegen sein, wenn sich das Spiel weiterentwickelt. Verstärkungslernen bietet ein vielversprechendes, alternatives Framework zur Definition des Verhaltens eines NPC. Genauer gesagt, anstatt die Beobachtung per Hand auf Action Mapping zu definieren, können Sie Ihren NPC einfach trainieren, indem Sie ihm Belohnungen bereitstellen, wenn er das gewünschte Ziel erreicht.

Das Trainieren eines NPCs mit Verstärkungslernen ähnelt ziemlich stark der Art und Weise, wie wir einen Welpen trainieren, um Holen zu spielen. Wir präsentieren dem Welpen ein Leckerli und werfen dann den Stock. Zunächst läuft der Welpe herum und weiß nicht, was er tun soll, bis er schließlich den Stock aufhebt und zurückbringt und prompt ein Leckerli bekommt. Nach ein paar Sitzungen lernt der Welpe, dass es die beste Möglichkeit ist, ein Leckerli zu bekommen, und tut dies auch weiterhin.

Genau so funktioniert Verstärkungslernen beim Training des Verhaltens eines NPC. Wir bieten unserem NPC eine Belohnung, wenn er eine Aufgabe ordnungsgemäß ausführt. Durch mehrere Simulationen des Spiels (das entspricht vielen Holsitzungen) erstellt der NPC ein internes Modell, welche Aktion er in jeder Instanz ausführen muss, um seine Belohnung zu maximieren, was zu dem idealen, gewünschten Verhalten führt. Anstatt also Low-Level-Aktionen für jede Beobachtung des NPC zu erstellen und aufrechtzuerhalten, müssen wir nur eine High-Level-Belohnung bereitstellen, wenn eine Aufgabe richtig ausgeführt wird und der NPC das entsprechende Low-Level-Verhalten lernt.

Um die Wirksamkeit dieser Technik zu demonstrieren, haben wir ein Demospiel mit dem Titel „Puppo (gelesen als ‚Pup-o‘), The Corgi“ entwickelt und auf der Unite Berlin vorgestellt. Es ist ein mobiles Spiel, in dem Sie Fetch mit einem süßen kleinen Corgi spielen. Wirf einen Stock zu Puppo, indem du auf dem Bildschirm wischst, und Puppo bringt ihn zurück. Während die übergeordnete Spiellogik traditionelles Scripting verwendet, lernen die Corgi mithilfe von Verstärkungslernen zu laufen, zu laufen, zu springen und den Stick zu holen. Anstatt Animation oder geskriptetes Verhalten zu verwenden, werden die Bewegungen der Corgi ausschließlich mit Verstärkungslernen trainiert. Es sieht nicht nur supersüß aus, sondern die Bewegung des Corgi wird ausschließlich von der Physik-Engine gesteuert. Das bedeutet beispielsweise, dass die Bewegung der Corgi durch umliegende Starrkörper beeinflusst werden kann.

Puppo wurde auf der Unite Berlin so beliebt, dass uns viele Entwickler fragten, wie wir es geschafft hätten. Deshalb haben wir beschlossen, diesen Blog-Eintrag zu schreiben und das Projekt für Sie freizugeben, um es selbst auszuprobieren.

Projekt Unity herunterladen

Für den Anfang behandeln wir die Anforderungen und Vorarbeiten, die Sie zum Trainieren der Corgi leisten müssen. Dann werden wir unsere Erfahrungen beim Training weitergeben. Schließlich werden wir die Schritte besprechen, die wir unternommen haben, um ein Spiel mit Puppo als Held zu entwickeln.

Bevor wir ins Detail gehen, definieren wir einige wichtige Begriffe des Verstärkungslernens. Das Ziel von Verstärkungslernen ist es, eine Richtlinie für einen Agenten zu lernen. Ein Agent ist eine Entität, die mit ihrer Umgebung interagiert: Bei jedem Schritt des Lernens sammelt der Agent Beobachtungen über den Zustand der Umgebung, führt eine Aktion aus und erhält eine Belohnung für diese Aktion. Die Richtlinie definiert, wie ein Agent auf der Grundlage der von ihm wahrgenommenen Beobachtungen handelt. Wir können eine Richtlinie entwickeln, indem wir den Agenten belohnen, wenn sein Verhalten angemessen ist.

In unserem Fall ist die Umgebung die Spielszene und der Agent ist Puppo. Puppo muss eine Richtlinie lernen, damit es mit uns spielen kann. Ähnlich wie wir einen echten Hund mit Leckereien trainieren, um Stöcke zu holen, können wir Puppo trainieren, indem wir ihn angemessen belohnen.

Wir haben Puppo mit einer Ragdoll entwickelt und die Beine werden von Gelenkmotoren angetrieben. Damit Puppo lernen kann, wie man an das Ziel kommt, muss es zunächst lernen, die Gelenkmotoren so zu drehen, dass sie sich bewegen können.

Ein echter Hund nutzt Vision und andere Sinne, um sich zu orientieren und zu entscheiden, wohin er geht. Puppo folgt derselben Methodik. Es sammelt Beobachtungen über die Szene, wie die Nähe zum Ziel, die relative Position zwischen sich und dem Ziel und die Orientierung der eigenen Beine, so dass es entscheiden kann, was als nächstes getan werden soll. In Puppos Fall beschreibt die Aktion, wie die Gelenkmotoren gedreht werden, um sich zu bewegen.

Nach jeder Aktion, die Puppo ausführt, geben wir dem Agenten eine Belohnung. Die Belohnung besteht aus:

- Orientierungsbonus: Wir belohnen Puppo, wenn er sich auf das Ziel zubewegt. Dazu verwenden wir die Vector3.Dot()-Methode.

- Zeitstrafe: Wir geben Puppo bei jeder Aktion eine feste Strafe (negative Belohnung). Auf diese Weise lernt Puppo, den Stock so schnell wie möglich zu bekommen, um eine hohe Zeitstrafe zu vermeiden.

- Rotationsstrafe: Wir bestrafen Puppo dafür, dass er versucht, zu viel zu drehen. Ein echter Hund wäre schwindelig, wenn er sich zu sehr dreht. Damit es real aussieht, bestrafen wir Puppo, wenn es sich zu schnell dreht.

- Zur Zielbelohnung gelangen: Am wichtigsten ist, dass wir Puppo dafür belohnen, dass er das Ziel erreicht hat.

Bild von Corgi
formula

Jetzt ist Puppo bereit zu lernen. Wir brauchten zwei Stunden an einem Laptop, bis der Hund lernte, effizient auf das Ziel zuzulaufen. Während des Trainings fiel uns ein interessantes Verhalten auf. Der Hund lernte in ca. 1 Minute relativ schnell laufen. Dann lernte der Hund im Laufe des Trainings zu laufen. Kurz darauf begann er sich zu überschlagen, als er versuchte, beim Laufen eine plötzliche Wendung zu machen. Glücklicherweise lernte der Hund, wie man wieder aufsteht, so wie es ein echter Hund tun wird. Dieses ungeschickte Verhalten ist so süß, dass Sie das Training an diesem Punkt beenden und direkt im Spiel verwenden könnten.

Wenn Sie Interesse daran haben, Puppo selbst zu trainieren, können Sie den Anweisungen im Projekt folgen. Sie enthält detaillierte Schritte zur Einrichtung des Trainings und welche Parameter Sie auswählen sollten. Ein detaillierteres Tutorial zur Schulung von Agents finden Sie auf der Ml-Agents Dokumentationsseite.

Um das Spiel „Puppo, The Corgi“ zu erstellen, müssen wir die Spiellogik definieren, mit der ein Spieler mit dem trainierten Modell interagieren kann. Da Puppo gelernt hat, zu einem Ziel zu laufen, müssen wir die Logik implementieren, die das Ziel für Puppo innerhalb des Spiels ändert.

Im Spielmodus legen wir das Ziel als Stick fest, direkt nachdem der Spieler ihn geworfen hat. Wenn Puppo am Stick ankommt, ändern wir das Ziel von Puppo an die Position des Spielers in der Szene, sodass Puppo den Stick dem Spieler zurückgibt. Wir tun dies, weil es viel einfacher ist, Puppo zu trainieren, sich zu einem Ziel zu bewegen, während die Spielflusslogik mit einem Skript definiert wird. Wir sind davon überzeugt, dass Machine Learning und traditionelle Methoden der Spieleentwicklung kombiniert werden können, um das Beste aus beiden Ansätzen herauszuholen. Das Projekt „Puppo, The Corgi“ umfasst ein vortrainiertes Modell für den Corgi, das Sie sofort verwenden und sogar auf mobilen Geräten bereitstellen können.

Wir hoffen, dass dieser Blog-Eintrag ein wenig Licht ins Dunkel gebracht hat, was mit dem Ml-Agents Toolkit für die Spieleentwicklung erreichbar ist.

Möchten Sie tief in den Code dieses Projekts eintauchen? Wir haben das Projekt veröffentlicht und können es hier herunterladen. Um mehr über die Verwendung des Ml-Agents Toolkits zu erfahren, finden Sie hier unsere offizielle Dokumentation und eine Schritt-für-Schritt-Anleitung. Wenn Sie daran interessiert sind, die Mathematik, Algorithmen und Theorien hinter Verstärkungslernen tiefer zu verstehen, gibt es einen Nanodegree Verstärkungslernen, den wir in Zusammenarbeit mit Udacity anbieten.

Wir freuen uns über Ihre Erfahrungen mit dem ML-Agents Toolkit für Ihre Spiele. Wenden Sie sich gerne auf unserer GitHub Issues-Seite an uns oder mailen Sie uns direkt.

Frohes Entwickeln!