Gibt es eine einfache Möglichkeit, Feinde daran zu hindern, an der gleichen Stelle zu stehen?

24

Also: Top-Down-Spiel, meine Feinde jagen den Spieler, wenn sie sich in einer bestimmten Entfernung befinden, stehen sie still und schießen. Wenn sie alle aus der gleichen Richtung kommen, stehen sie alle an der gleichen Stelle (dh "ineinander"), da ich gerade keine Kollisionserkennung zwischen Feinden durchführe - sie können frei übereinander fahren.

Was ist ein einfacher Weg, um dies zu umgehen? Entweder irgendeine Form der Kollisionserkennung oder irgendein ai?

Iain
quelle
1
Beschränke dich auf einen Feind. : P
Kylotan

Antworten:

18

Sie brauchen keine Kollisionserkennung, aber Sie müssen Ihren Feinden ein bisschen Intelligenz geben und sie müssen es vermeiden, sich gegenseitig anzugreifen. Ohne Kollisionserkennung sehen Ihre Feinde sowieso nur dumm aus - die Leute meiden sich gegenseitig, sie kollidieren im Allgemeinen nicht.

Suchen Sie nach "Beflockung" für einige einfache Verhaltensweisen.

Die Grundidee ist, dass die Dinge auf den Spieler zugehen sollten, aber nicht in der Nähe eines Hindernisses (einander, Wände, so etwas).

JasonD
quelle
6
Es wird auch Boids genannt. Lesen Sie hier mehr über die einfachen Regeln für Boids: en.wikipedia.org/wiki/Boids Sollte für die Implementierung dieser Einschränkungen trivial sein.
Nagler
12

Sie könnten sich von Herdenverhalten wie Boids inspirieren lassen .

Diese bestehen in der Regel aus 3-4 sehr einfachen Regeln, die bei richtiger Anwendung zu sehr zufriedenstellenden und "komplex aussehenden" Verhaltensweisen führen.

In Ihrem Fall könnten Sie Folgendes versuchen:

  • Trennung (minimale Radien zwischen Feinden)
  • Zusammenhalt (so reisen sie in Gruppen)
  • Ausrichtung (so neigen sie dazu, sich in die gleiche Richtung zu bewegen)
  • Zielgerichtet (sie sollten dazu tendieren, sich dem Spieler zu nähern)
egarcia
quelle
Dies ist fast eine wörtliche Kopie von JasonDs Antwort. Ich schwöre, ich habe es vor dem Posten nicht angeschaut.
Egarcia
4

Was Sie im Allgemeinen fragen, ist die dynamische Vermeidung zwischen den Akteuren. Sie könnten sich Geschwindigkeitshindernisse ansehen: http://gamma.cs.unc.edu/RVO/

Schnittkalk
quelle
3

Vielleicht möchten Sie die kollaborative Diffusion (großartige Animationen hier) oder eine andere Art von Anti-Objekt- Muster für die Bewegung ausprobieren . Während der Diffusionsalgorithmus an und für sich Feinde nicht davon abhält, sich zu überschreiten, können Sie zusätzliche Einschränkungen hinzufügen, um es unwahrscheinlich oder unmöglich zu machen.

Leander
quelle
Vollständige Offenlegung: Ich bin mir ziemlich sicher, dass ich den Link zur gemeinsamen Verbreitung hier irgendwo auf GD gefunden habe, aber ich kann den Beitrag, der darauf verweist, für mein ganzes Leben nicht finden. Es war ein ziemlicher Fund. =)
Leander
Das ist super toll, aber ich habe etwas mehr Komplexität, als ich brauchte. Ich werde das Whitepaper trotzdem lesen, habe es aber geschafft, eine einfachere Lösung zu implementieren.
Iain
2

Was ist, wenn Sie nicht durch andere Einheiten ziehen dürfen? Mir scheint, Sie werden es früher oder später brauchen. Wenn der aktuelle Pfad von einer Einheit blockiert wird, passen Sie den Pfad an, um ihn zu umgehen.

jmp97
quelle
2

Auf der Website von Craig Reynold finden Sie Hinweise zu Steuerungs- und Flockverhalten . Sie sind relativ einfach zu implementieren, können aber ein schönes aufstrebendes Verhalten hervorrufen.

Tenpn
quelle
Dies ist im Wesentlichen die gleiche Antwort wie die anderen 2, aber +1 für den Link - Diese Website ist eine wirklich gute Referenz.
AShelly
1

Alle anderen Antworten liefern ein besseres Ergebnis, aber die billigste (?) Möglichkeit, eine vollständige Gruppierung zu vermeiden, besteht darin, einen Zufallsvektor hinzuzufügen, der möglicherweise 25% des ursprünglich berechneten Bewegungsvektors entspricht, sodass Objekte in einer allgemeinen Blob-Gruppe ein wenig herumspringen . Es wird die Dinge nicht vollständig voneinander fernhalten, aber je nachdem, was Sie erreichen wollen, kann dies meiner Meinung nach angemessen sein. Objekte können mit dieser Methode immer noch gruppiert werden, wenn Sie Kreise um sie herum ziehen. Mit der Zeit tendieren sie jedoch dazu, sich zu zerstreuen.

Hier ist ein kleines Spiel, das ich vor einigen Jahren gemacht habe und das diese Methode demonstriert: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
quelle
1

Die Leute sprechen immer Boids an, da dies zu sehr guten Ergebnissen führt. Die Implementierung von Boids kann jedoch für Ihren speziellen Zweck zu viel Aufwand bedeuten. In der Vergangenheit habe ich sehr gute Ergebnisse erzielt, indem ich einfach die Zielposition innerhalb eines kleinen Kreises zufällig angeordnet habe.

Für eine Demo, die ich in Unity erstellt habe, habe ich beispielsweise den Befehl Random.insideUnitSphere zum Beflocken von Puffballs verwendet

jhocking
quelle
+1 Ich stimme zu, ein weiteres Beispiel für diese Strategie (mit der wahrscheinlich besseren Garantie, dass sie sich nicht überschneidet) finden Sie hier: "Unclutter" -Einheiten im RTS-Spiel
MichaelHouse