Jump to content
Unity Insider Forum

BRO - Beastly Rivals Onslaught


BRO als quelloffene KI Ressource  

7 Stimmen

  1. 1. Für welchen Zweck würdet ihr BRO nutzen wollen?

    • Forschungsobjekt für künstliche Intelligenz und maschinelles Lernen
      1
    • Kompetitives Entwickeln von Bots
      3
    • Methoden der künstlichen Intelligenz anwenden und lernen
      4
    • Unterhaltung (spielen)
      3


Recommended Posts

Hallo zusammen,

 

es ist nun an der Zeit, dass ich meine Jungfernvorstellung machen möchte. Somit möchte ich euch mein Spielprojekt Beastly Rivals Onslaught (oder einfach BRO) vorstellen. BRO ordne ich dem Genre MOBA zu, welches ich aber eher in Bezug mit kausalen Spielen setzen würde. Die bekannten MOBAs, wie z.B. Dota, sind einfach viel größer und komplexer. Die Idee für BRO entspringt der Warcraft 3 Fun Map "Hungry hungry felhounds". Die Umfrage zu diesem Thread bezieht sich auf einen der letzten Paragraphen über künstliche Intelligenz.

 

post-2810-0-25827400-1466179738_thumb.png

 

Gameplay

 

In BRO geht es für den Spieler darum als Last-Man-Standing über seine Gegenspieler zu triumphieren. Bis zu 8 Spieler können sich der Herausforderung stellen, um im heißen Kampf mit dem Biest zu überleben und die anderen in die Pfanne zu hauen. Das Biest begehrt den Tod des Spielers, der im Besitz des Balls ist. Um zu Überleben muss der Ball auf einen anderen Spieler übertragen werden, damit man nicht mehr die hoffnungslose Beute ist. Ist dem dennoch so und man sieht dem Verlieren ins Auge, dann darf man sich der Fähigkeit bemächtigen sich zu teleportieren. Die Nutzung dieser Blinkfähigkeit wird mit einer Abklingzeit eingeschränkt. Je länger das Biest kein Opfer zu fassen bekommt, desto höher wird die Jagdgeschwindigkeit und die Präzision des Biests.

An dieser Stelle möchte ich euch einfach auf dieses Gameplayvideo verweisen.

 

post-2810-0-26173300-1466181513_thumb.png

 

Entwicklungsdetails

 

Es sollte kein großes Wunder sein, dass ich Unity als Engine einsetze. Für das Networking verwende ich Photon Bolt. Die Spielermodelle sind die sog. Power Bots aus dem Asset Store. Aus der selben Quelle stammt das Biest und das Kampffeld. Angefangen habe ich mit dem Projekt nach meinem Praktikum in Portugal (September 2014). Die letzten Änderungen an dem Spiel machte ich im Februar. Wer so ein bisschen den Entwicklungsprozess von Beginn an verfolgen möchte, der kann in sämtlichen Videos hier herumschmöckern (ja es kommen auch primitive Objekte vor ;) ). Ursprünglich wollte ich das Spiel für Tablets gängig machen.

 

Intention

 

Das aktuelle Gameplay gleicht dem, was in "Hungry hungry felhounds" zu sehen ist. Diese Fun Map für Warcraft 3 ist die Map schlechthin für gelungene LAN Partys. Gegenspieler verbünden sich um gemeinsame Feinde zu erlegen oder gar abtrünnig zu handeln. Das sorgt immer für ordentlich Stimmung. Jedenfalls gab es für mich dann den Wunsch eine Standalone Version für LAN Partys zu bauen, was aber eher mehr als Proof Of Concept geschehen sollte. Ich wollte vornehmlich mir selbst beweisen, dass ich das Verhalten des Biests hinbekomme und eben Networking drauf habe.

 

Zukunft

 

Aesthetics

Ich bin kein 3D Artist oder sonst was für ein Künstler. Ich bleibe schön spezialisiert auf der technischen Seite. Daraus folgt, dass das Spiel zumindest von mir keinen orginellen Look bekommt, schließlich arbeite ich mit Asset Store Zeug. Allerdings gibt es ein nettes Gimmick ;) Sobald man dafür gesorgt hat, dass ein Feind umkommt, dann darf man eine Spottanimation mittels einer der F-Tasten abspielen (z.B. F3). Diese Animationen habe ich mittels Motion Caputre aufgenommen. Ich habe aber noch eine coole Idee, in dem ich das Kampffeld in ein Feld aus Hexagons verwandle, die ich wie einen Bildschirm ausnutzen möchte. Das könnte man auch für interessante Effekte nutzen. Beispielhaft wäre dieses Video.

 

post-2810-0-18132500-1466181664_thumb.png

 

Gameplay

Um das Gameplay zu verbessern gibt es reichlich Ideen. Vor allem soll der Spieler mal zwischen Fähigkeiten wählen können. Bisher gibt es nur das Teleportieren. Aber stellt euch mal vor wenn man ein Schlammloch, eine Wand oder Glateis platzieren kann. Damit könnte ordentlich Schwung in das Spiel kommen. Dann fehlen nur noch Komponenten für das kooperative Spielen. Einige weitere Ideen sind natürlich dokumentiert. Das Ka-Me-Ha-Me-Ha aus dem Vorbild fehlt auch noch.

 

Künstliche Intelligenz

Für mich hat BRO ein riesen Fass aufgemacht. Für so ein Spiel muss natürlich KI her. Das war zu dem Zeitpunkt für mich quasi Neuland. Klar kennt man Decision Trees und State Machines, was ja letztlich nichts anderes ist als hard-coded If-Else-Statements. Also bin ich in das Thema eingestiegen und arbeite jetzt mit künstlichen neuronalen Netzwerken in meiner Bachelorarbeit. Klar wäre es cool eine KI zu trainieren, aber es ist ein sehr schwieriges Unterfangen. Viel mehr habe ich eine ganz andere Idee, welches nun der Anlass zu dieser Projektvorstellung ist. Im Rahmen meiner Bachelorarbeit entwickle ich neuronale Netze für StarCraft. Denn für StarCraft hat jemand die BWAPI entwickelt, mit der man per Injection eigene Computerspieler implementieren kann. Somit wurde StarCraft über die letzten 8 Jahre zu dem Forschungsobjekt für Wissenschaftler und Hobbyisten im Bereich der künstlichen Intelligenz. Ich kann mir sehr gut vorstellen, dass ich BRO quelloffen mache und Tools anbiete, um künstliche Intelligenz für dieses Spiel zu entwickeln und zu erforschen. Genauso wie für StarCraft soll es dann Turniere geben, wo dann die implementierten Computerspieler sich messen können. Im Gegensatz zu StarCraft besteht dann die Möglichkeit noch auf das Spiel selbst zuzugreifen. Beispielsweise kann man in der BWAPI nicht feststellen von wem eine Einheit getroffen wurde.

 

 

Mich interessiert vor allem eure Meinung zu einem möglichen Vorhaben BRO quelloffen zu machen und explizit zu designen, so dass Dritte unmittelbar KI für Computerspieler implementieren und teilen können. Das würde natürlich einige Features erfordern wie das Aufzeichenen von Replays und man müsste auch KI zur Laufzeit einbinden können. Eine weitere Konsequenz wäre, das Bedarf an freien Assets besteht und ich Bolt nicht mehr für das Networking einsetzen könnte. Also pfeift mir eure Meinung, egal ob KI oder über das Spiel an sich! Und wer Bock hat mitzumischen, dem leg ich auch gerne die Karten offen hin ;)

 

 

 

Hier gibt es den Build der Version 0.07

Build 0.0.8

 

[update 25.08.2016]

Das Projekt wird nun als Forschungsprojekt im Masterstudiengang Information Engineering and Computer Science der Hochschule Rhein-Waal voran getrieben. Organisatorisch steht das Labor für Computational Intelligence and Visualization (für das ich als WiMi arbeite) dahinter. Der Kickoff für das Projekt wird wohl im Oktober sein. Bis dahin nutze ich die Zeit um eine entsprechende Planung zu machen. Beispielsweise muss weiter am Game Design Document gearbeitet werden. Es Bedarf dann noch an Technologieprototypen (z.B. injizieren von Code zur Laufzeit). Dann gibt es natürlich noch die Causa, dass ich eine passende Lizenz für Photon Bolt (Open Source Gründe) brauche oder auf Unet umsteigen muss. Ziel für das kommende Semester wird sein, dass das Spiel als solches fertig wird und über den Prototypenstatus hinaus geht. Für den Bereich KI und ML gehört ein passendes Interface bzw. Framework dazu. Ein Tool zur Automatisierung von Matches wird implementiert. Alles was dann noch kommt ist Bonus. Dazu zählen Tools für Decision Trees, Behavior Trees und State Machines. Replays für Data Mining und Analysen sind in Planung. Zuletzt steht dann noch auf dem Zettel die Erstellung einer Plattform für kompetitive Wettbewerbe.

 

Wenn die wichtigsten Anforderungen umgesetzt wurden, dann kann es um konkrete Forschungsfragen für den Bereich KI und ML gehen. Beispielsweise könnte man an Bots arbeiten die die spielweise der anderen Spieler adaptieren können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sehr schön und interessant zu sehen, dass du dir das Thema K.I. angenommen hast. Ist ja auf hoher Ebene nicht das Einfachste ;)

Evtl könnte ich dir bei einem 3D Model behilflich sein. Ich muss als Endabgabe dieses Semester ein LowPoly 3D Model machen. Vllt find ich ja Zeit es zu animieren, dann kann ich es dir zur Verfügung stellen :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Im Discord-Chat hat Mark eine Referenz zu codingame.com fallen gelassen. Das geht in abstrakter Weise schon in die Richtung, die ich auch gehen wollen würde. Mein erster Eindruck ist, dass es dort eine webbasierte IDE eingesetzt wird. Da Frage ich mich, ob man da überhaupt Machine Learning betreiben kann, aus Gründen von Persitenz und Leistung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 months later...

Hier ein paar Neuigkeiten zum weiteren Vorgehen:

 

Aktuell ersetze ich manch ein Asset, damit das Projekt nacher quelloffen sein kann. Die Modelle für die Spieler und das Biest werden derzeit als Themen für Bachelorarbeiten angeboten. Nach dem neuen Mesh für das Kampffeld (siehe Screenshot) muss ich jetzt noch Alternativen für 3 Partikeleffekte basteln, da ich für diese bisher Particle Playground und ein Preset aus dem Asset Store verwendet habe.

 

post-2810-0-95994400-1475754754_thumb.png

 

Für dieses Semester ist es geplant, dass Code für KI-Spieler zur Laufzeit injiziert und und ausgeführt wird. Dabei entsteht ein Prozess zum Entwickeln von KI für dieses Spielprojekt. Das wird ungefähr so aussehen, dass der Entwickler eine Klasse, welche von AiBase erbt, erstellen muss mit nötigen Daten über den KI-Spieler und Referenzen zu dessen Logik, welche sich in beliebig vielen Monobehavior Scripts tummelt. In einem seperaten Ordner sollen alle Klassen für die KI gesammelt werden. Mittels eines kleinen Compilers kann man innerhalb des Editors den Inhalt dieses Ordners kompilieren lassen. Die fertige Assembly soll dann in einen spezifischen Ordner des Builds eingefügt werden, um diese dann zur Laufzeit verfügbar zu machen. Zur Laufzeit des Spiels werden alle AiBase Objekte instanziiert und verfügbar gemacht. Zum Start des eigentlichen Matches erhalten dann die gespawnten KI-Spieler, die in AiBase referenzierten, Monobehaviors.

 

Zur Vereinfachung der Implementation von KI wird noch für das Spiel ein spezifisches Framework angelegt um Informationen, Events und Aktionen in gescheiter Form verfügbar zu machen.

 

Neben diesem Prozess wird noch ein funktioneller Prototyp gebaut um eine Sequenz zum Automatisieren von unterschiedlichen Matches zu erstellen.

 

Je nachdem wie diese beiden Dinge voran kommen, arbeite ich noch an Gameplay Features.

 

 

An für sich soll es im nächsten Semester schon möglich sein an konkreten Fragestellungen bzgl. Learning Ai zu arbeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

N'Abend,

 

ich habe einen Fortschritt zu vermelden. Der Prozess um KI zur Laufzeit zu injizieren ist abgeschlossen. Um KI zu entwickeln beginnt der Nutzer folgende Klasse zu erstellen:

 

using BRO.AI;
using UnityEngine;
namespace ExampleAI.Test
{
public class ExmapleAI : AIBase
{
	#region Instructions!!!
	// Instructions for developing a new AI:
	//
	// First of all you have to create a class which derives from AIBaseClass.
	// This abstract class makes sure that on run-time your AI can be found with its distinct information and logic.
	// These information describe your AI. This information has to be supplied using GetAIInformation().
	// The logic for your AI has to be referenced in AddAIComponent(GameObject).
	// This functions is in charge of adding the AI logic to the player's GameObject.
	// For the sake of ease, you can add these information as member variables like below.
	// You may use this example as a blueprint.
	#endregion

	#region Member Fields
	private const string m_name = "Example AI";
	private const string m_author = "Marco Pleines";
	private const string m_affinity = "Hochschule Rhein-Waal";
	private const string m_description = "This example AI portrays the procedure of implementing AI for BRO. ";
	private const AITag m_tag = AITag.Teaching;
	private const string m_version = "1.0";
	private const string m_date = "November 2016";
	private const string m_pictureFileName = "noImage.jpg";
	#endregion
	#region Abstract Functions
	/// <summary>
	/// Makes an instance of the stored AI information.
	/// </summary>
	/// <returns>Returns the information of this particular AI instance.</returns>
	public override AIInformation GetAIInformation()
	{
		return new AIInformation(m_name, m_author, m_affinity, m_description, m_tag, m_version, m_date, m_pictureFileName);
	}
	/// <summary>
	/// Adds the Monobehaviors containing the AI logic to the player's GameObject.
	/// </summary>
	/// <param name="go">GameObject of the Player.</param>
	public override void AddAIComponents(GameObject go)
	{
		go.AddComponent<AiEngine>();
	}
	#endregion
}
}

 

Nachdem die Klasse, die von AIBase erbt, erstellt wurde, kann der Entwickler beginnen MonoBehavior Klassen zu schreiben, welche über die KI Logik verfügen. Diese Klassen werden dann via AddComponent<T> innerhalb der AddAIComponents(GameObject go) hinzugefügt. Sobald es dann in den PlayMode geht, kann der Nutzer schon die KI im Menü auswählen und hinzufügen. Die referenzierten MonoBehaviors werden im Spiel dann dem GameObject des jeweiligen Spielers hinzugefügt.

 

Sobald die Entwicklungsarbeit abgeschlossen wurde, kann der Entwickler den Ordner mit seiner AiBase und den anderen MonoBehaviors zu einer Assembly kompilieren und anderen Leuten, welche vielleicht nur den Build haben, schicken. Die nutzbaren KIs werden in einem speziellen Ordner hinterlegt und werden zur Laufzeit des Spiels geladen (egal ob Build oder Editor).

 

post-2810-0-93320200-1479058716_thumb.png

 

Nun gilt es in intuitiver und komfortabler Weise die möglichen Aktionen und den GameState in einem Framework zu verpacken, damit dies vom Nutzer einfach genutzt werden kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was machst du um zu verhindern dass die KI einfach eine feindliche KI sucht und deren Werte verändert, oder noch einfacher das GO anderer Spieler sucht um dieses zu verändern?

 

Dazu hatte ich auch schon Gedanken. Derzeit hat der KI-Entwickler quasi Macht über alles, schließlich führt der Host/Server den KI-Code aus. Es ist alles Open Source (noch kann ich das Projekt nicht publizieren) und es ist alles im selben Scope. Ich arbeite nun an gesonderten Klassen, um den GameState, die Aktionen und Events geeignet verfügbar zu machen.

 

Um vor "Mogeln" geschützt zu werden, müsste man das Spiel und die KI-Entwicklung von einander strickt trennen. Das wäre für einen KI Wettbewerb von Vorteil, aber das hat dann auch Nachteile für die Entwicklung von Learning AI. Gerade für Learning AI möchte ich alle Türen offen halten. Das betrifft die Intention des Forschens oder des Lernens. Als ich mit der Brood War API gearbeitet habe, habe ich mir gewünscht auch Kontrolle über den Source Code des Spiels zu haben um an mehr Informationen zu kommen.

 

Wenn ich beabsichtigen würde, dass man das Spiel so "modden" soll, dann wäre das sicherlich zu viel Macht, die vermutlich ausgenutzt wird und dann den Spielspaß unter Umständen verdirbt. Dafür sind dann einzelne Matches zu kurz und man muss auch nicht die KI wieder einsetzen.

 

 

Mal abwarten ob ich in Zukunft an einer Lösung arbeiten werde. Im Moment liegen die Prioritäten wo anders. Beispielsweise würde ich nun auch gerne, wie für StarCraft 2, visuelle Abstraktionsebenen erstellen für Convolutional Neural Networks.

 

 

edit: Eine Idee hätte ich da noch. Der Compiler für die Assembly der KI könnte ich die enthaltenen Klassen auf bestimmte Inhalte prüfen. Wenn die Prüfung ohne Beanstandungen durchlaufen wurde, dann ist die KI zulässig für den Wettbewerb. Beispielsweise würde ich dann nach solchen Aufrufen suchen lassen: "gameState.players.lifes =".

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 months later...

Hallo zusammen,

 

hier mal ein Update. Die Entwicklung und Dokumentation des AI Frameworks ist abgeschlossen.

Was das Framework bietet habe ich in diesem Video festgehalten.

 

 

Ganz einfach gesagt braucht man erst eine Klasse die von AIBase erbt. Diese trägt Sorge dafür, dass Metadaten über die KI angelegt werden und dass die Komponenten mit der KI Logik an das GameObject des Spielers angehangen werden. Der GameState wird über ein Singleton verfügbar gemacht. Die Informationen über den kontrollierten Spieler und dessen Aktionen wird in der Klasse AIBehaviour verfügbar gemacht. AIBehaviour erbt von Monobehaviour. Auf dem Ganzen ist dann noch ein AIEventListener gesattelt, der Methoden zum Überschreiben anbietet, die durch Events aufgeurfen werden. Die KI Logik wird dann in min. einer Klasse geschrieben die entweder von Monobehaviour, AIBehaviour oder von AIEventListener erbt.

 

Es sind jetzt nur noch Lizenzhürden (u.a. eigene Modelle für Spieler und Biest organisieren) zu nehmen, bis das Projekt quelloffen publiziert werden kann.

 

Die Entwicklung geht noch weiter. Einerseits geht es noch um das Gameplay und andererseits um Features für das Implementieren von lernender KI. Dazu zähl vor allem das Automatisieren von einzelnen Matches.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...
  • 8 months later...

Hier mal ein Update:

Über das vergangene Sommersemester wurden keine erfolgreichen Resultate bzgl. einer autonom lernenden KI erzielt. Hauptsächlich auf Grund von Performanceproblemen war der umgesetzte DQN Algorithmus innerhlab der ConvNetSharp Library nicht umsetzbar. Jetzt wo die ML Agents von Unity veröffentlicht wurden, was im grunde eine Pythonschnittstelle ist, liegen ganz andere Möglichkeiten offen, welche den gewünschten Erfolg erzielen sollen.

Noch habe ich die Arbeit bzgl. einer KI für BRO nicht wieder aufgenommen, aber ich arbeite schon mit den ML Agents und erstelle einige beispielhafte Use Cases. Mehr dazu hier.

 

edit:

Ich habe vergessen zu erwähnen, dass ich BRO auf GitHub veröffentlicht habe. Leider hat es Exit Games noch immer nocht geschafft die kostenfreie Version von Photon Bolt zu veröffentlichen. Denn Bolt wird zur Lauffähigkeit benötigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...