Jump to content
Unity Insider Forum

Design von KI Aktionen (Bewegungsentscheidung)


MarcoMeter

Recommended Posts

Zur schönen Weihnachtszeit versuche ich mich an einem besonderen Schmankerl, bei dem mir noch die Zielführende Idee zur Umsetzung meiner KI fehlt.

 

Es geht um mein Spiel BRO (welches ich bald mal genauer vorstellen muss in der hier passenden Rubrik).

 

post-2810-0-37653800-1451049936_thumb.png

 

Die Spielfläche der bis zu 8 antretenden Spieler ist eine Ellipse. Einer der Spieler erhält den Ball, welches durch die leuchtenden Partikelchen erkennbar ist (grauer Spieler in der Nähe des Zentrums). Der Spieler der den Ball hat wird vom schwarzen Biest verfolgt und bei Kontakt erlegt. Das Biest bewegt sich nicht gerade auf den Spieler mit dem Ball zu, sondern driftet zu Anfangs stark. Über Zeit wird das Biest schneller und zielgenauer. Um sich zu retten muss man den Ball zu einem anderen Spieler werfen. Der letzte Überlebende gewinnt.

 

Bei GoogleDrive gibt es ein Video

 

Nun beschäftige ich mich stark mit der künstlichen Intelligenz der Computerspieler. Architketuren, wie Decision Tree, Behavior Tree, neuronale Netze.... , sind mir vertraut. Allerdings geht es nicht um das Treffen von Entscheidungen, sondern um die auszuführenden Aktionen.

 

Derzeit beschäftige ich mich mit der Bewegung eines KI-Spielers, welcher nicht den Ball hat. Folgende Aktionen sind mir da in den Sinn gekommen:

  1. Bewegung in Richtung von freien Raum
  2. Bewegung hinter das Biest
  3. Bewegung hinter den Ballführenden (zum Werfen muss erst in die Richtung des Zieles rotiert werden, somit kann man dem Werfer das Leben schwer machen)

 

Zu diesen 3 möglichen Aktionen konnte ich noch keinen sinnvollen Ansatz finden. Zum größten Teil versuche ich durch Skizzen und mithilfe der linearen Algebra ein mathematisches Modell zu entwickeln, um die geeignete Richtung bzw. Position zu finden, wohin der KI-Spieler bei der jeweiligen Aktionen laufen soll.

 

 

Aktion 1

 

Bei der Bewegung in den freien Raum kann ich mir vorstellen einen Punkt in einer Fläche zu finden, wo sich die wenigsten Spielentitäten befinden. Als Information zu den Rändern des Spielfeldes benutze ich eine bestimmte Anzahl an leeren GameObjects, welche ein Polygon aufspannen. Jetzt ist meine Idee, dass durch das Motto "Teile und Herrsche" das Polygon erst halbiert wird. Dann soll die Hälfte erneut halbiert werden, welche die wenigsten Spieler beherbergt. Dies lasse ich dann soweit laufen, bis ich mit der Dichte der Spielentitäten bin. Möglichst aber nur 4 Durchläufe zulasse.

 

post-2810-0-34710900-1451051376_thumb.png

 

Wie ich das Implentieren kann, kann ich mir gut vorstellen und werde das Ausprobieren. Aber vielleicht hat jemand eine viel simplere Herangehensweise für das Problem. Beispielsweise habe ich ganz ganz kurz daran gedacht sämtliche Richtingsvektoren der Teilnehmer und der Randbegrenzung zu addieren und zu gewichten. Das größte Problem bei den beiden erläuterten Ansätzen ist, dass alle Computerspieler vermutlich den selben Punkt dann in Aussicht nehmen.

 

 

Aktion 2

 

Hier bin ich mir noch sehr unschlüssig. Erster Gedanke war es einen Punkt hinter dem Biest zu wählen, um dann von der Position des Spielers und des gewählten Punktes einen Spline nutze, um einen Weg zu finden, der geeignet um das Biest herum geht. Da kommen allerdings auch einige Einflüsse vom Rand und der Gegenspieler noch irgendwie hinzu.

 

post-2810-0-03371200-1451051407_thumb.png

 

Aktion 3

 

Das ist quasi wie Aktion 2.

 

 

Ich würde mich um etwas von eurem Hirnschmalz (mit weinachtlicher Schleife) freuen! Das ist so ein Problem, wo ich allein durch das Kommunizieren des Problemes schon vorwärts komme.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu dem bewegen in den freien Raum hinein würde ich, damit nicht alle zum selben Punkt rennen, die Entfernung zu selbigen mit einrechnen.

Wenn du eine Skala hast, auf der du die Freiheit berechnest, und ein Platz 100 % dieser Skala hat, aber doppelt so weit vom Spieler entfernt ist wie einer der 90% besitz, den Spieler zum 2. Platz schicken usw.

 

Ist zwar nicht ganz sauber formuliert aber ich denke man kann verstehen worauf ich hinaus will.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das könnte eine passende Ergänzung sein.

 

Zwischendruch frage ich mich immer, ob ich nicht viel zu komplex denke und dass es einen deutlich trivialeren Ansatz geben muss. Ich hatte bis jetzt nicht erwartet, dass der Entwurf der KI-Aktionen mich so aufhalten würde. Wenigstens scheint sich vor allem hier zu lohnen, dass ich Ahnung vom Rechnen mit Vektoren und Quaternionen habe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

unterteile das Feld doch in Unterfelder. (Wie beim Schach!)

Welche Felder belegt sind kannst du zum Beispiel über Trigger (Oder besser die 2D Koordinaten) rausfinden.

Welches Feld das geeignetste ist würde ich über einen Integer errechnen, wobei ich belegte Felder schlicht nicht ansteuern würde:

 

In Laufrichtung von anderen Spielern = 1

In der Nähe der Bestie = 1

 

Das geeignetste Feld wäre dann das mit den wenigsten Punkten, welches am nähesten zur eigenen Position liegt.

 

Hat ein Spieler den Ball ist natürlich nur ein Feld geeignet, welches in Laufrichtung von einem anderen Spieler liegt, damit man den Ball übergeben kann. Das geeignetste Feld wäre das mit den Meisten Punkten, welches am weitesten von der Bestie entfernt ist.

Wäre jetzt aber nur ein Ansatz, bin mir nicht sicher, ob ich das Problem verstehe. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Richtung ist nicht ganz daneben.

 

Collider wären ein bisschen zu viel und Quadrate etwas zu unförmig. Aber es könnte sein, dass ein Feld, bestehend aus kleinen Hexagons mit Distanzabfragen sich eignen könnte.

 

 

edit:

Mehr und mehr gefällt mir die Idee mit einem HexGrid zu arbeiten. Vermutlich habe ich derzeit nicht die nötige Zeit, um ein eigenes Framework zu schreiben. Jedenfalls gibt es hier eine sehr sehenswerte Resource über HexGrids.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Moin,

 

ich habe mir nun von GameLogic das Package Grids Basic gekauft, da mir eine eigene HexGrid Implementation zu zeitaufwendig ist und ich ein Grid mit (Stand jetzt) 660 Zellen haben möchte.

 

Nun sieht mein Ansatz für die Bewegung ohne Ball wie folgt aus:

  1. Spieler und Biest belegen min. 1 Zelle (das Biest belegt die roten Zellen)
  2. Die Menge der belegten Zellen wird um einen Faktor erweitert, also werden bis zu n Nachbarn auch belegt
  3. Aus der Menge aller Zellen und der Menge der belegten Zellen wird die Differenzmenge gebildet
  4. Aus der Differenzmenge nehmen dann alle Ai Agents x Proben
  5. Aus den Proben wird die am nahesten gelegene Zelle als Ziel festgelegt und vom NavMeshAgent angesteuert

Nun wird das Ziel alle 0.5s aktualisiert (Invoke("AiEngineUpdate", 0, 0.5f)). Daher sieht das Ergebnis wie folgt aus:

https://drive.google.com/open?id=0BzzjWBSn5v8saXY4WTFsTEx6VTg (Video 17.8mb)

 

Im großen und ganzen werden aus den freien Räume zufällige Stichproben gewählt, was nicht weiter schlimm ist (jeder Ai Agent bekommt eine eigene Stichprobe). Das Schlimme aber ist, dass eben in kurzen Intervallen ein neuer Punkt zur Bewegung in Aussicht genommen wird. Die Frage bzw. das Problem ist nun, welcher Ansatz in Frage kommt, um einen neuen Punkt zur Bewegung anzufordern. Es müsste vermutlich auf Events wie diese basieren:

  • Zielpunkt wird erreicht
  • ein Mitspieler wird erledigt
  • ...

Da der Spielablauf recht schnell ist und sich die freien Räume ständig ändern kann auch ein langer weg "dumm" aussehen. Das tatsächliche beschreiten von längeren Wege sollte aber besser aussehen, als ein Bewegungsradius eines Kreisligaschiedsrichters.

 

 

Ich würde mich über euren Senf auf diese Wurst freuen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...