Lenkverhalten verstehen Wandern

Lenkungsverhalten soll dazu beitragen, dass sich autonome Charaktere auf realistische Weise bewegen, indem sie mit einfachen Kräften eine realistische, improvisatorische Navigation erzeugen. In diesem Tutorial werde ich das behandeln wandern Verhalten, das den Charakter zufällig bewegt.

Hinweis: Obwohl dieses Tutorial mit AS3 und Flash geschrieben wurde, sollten Sie in der Lage sein, in fast jeder Spieleentwicklungsumgebung dieselben Techniken und Konzepte anzuwenden. Sie müssen ein grundlegendes Verständnis von mathematischen Vektoren haben.


Umherstreifend

Häufig müssen sich die Charaktere eines Spiels zufällig in ihrer Umgebung bewegen. Normalerweise warten diese Charaktere nur darauf, dass etwas passiert (z. B. ein Kampf gegen den Spieler) oder sie suchen nach etwas. Wenn der Spieler dieses Verhalten erkennen kann, muss die Wanderfähigkeit des Charakters visuell angenehm und realistisch genug sein.

Wenn der Spieler in der Lage ist, fest definierte Pfadlinien oder unrealistisches Bewegungsverhalten zu erkennen, wird dies zu Frustration führen. Im schlimmsten Fall wird der Spieler herausfinden, wie er die Bewegungen des Charakters antizipieren kann, was zu einem langweiligen Spielerlebnis führt.

Das wandern Das Lenkverhalten zielt darauf ab, eine realistische "legere" Bewegung zu erzeugen, die den Spieler den Eindruck erweckt, dass der Charakter wirklich lebt und herumläuft.


Suche und Zufälligkeit

Es gibt mehrere Möglichkeiten, das Wandermuster mithilfe von Lenkverhalten zu implementieren. Am einfachsten verwenden Sie das zuvor beschriebene Suchverhalten. Wenn ein Charakter einen Suchvorgang ausführt, bewegt er sich auf ein Ziel zu.

Wenn sich die Position dieses Ziels alle paar Sekunden ändert, kann der Charakter das Ziel niemals erreichen (und selbst wenn dies der Fall ist, bewegt sich das Ziel wieder). Durch zufälliges Platzieren des Ziels im Spielbereich bewegt sich der Charakter schließlich in der gesamten Umgebung und jagt das Ziel. Die folgende Demo zeigt diesen Ansatz in Aktion:


Das Suchverhalten und ein zufälliges Ziel. Klicken Sie auf die Demo, um Kraftvektoren anzuzeigen.

Der Code für diese Implementierung wäre:

 // Berechne die private Kraft der Wanderkraft: wander (): Vector3D var now: Number = (neues Datum ()). GetTime (); if (now> = nextDecision) // Wähle eine zufällige Position für "Ziel" // Lenke eine Lenkkraft zurück, die den Charakter // auf das Ziel (das Suchverhalten) drückt; return seek (Ziel);  // Behandle die Kräfte und Bewegungen in der Spielschleife // genau wie zuvor: public function update (): void Lenkung = Wandern () Lenkung = verkürzt (Lenkung, max_force) Lenkung = Lenkung / Massengeschwindigkeit = verkürzt (Geschwindigkeit + Lenkung, max_speed) Position = Position + Geschwindigkeit

Obwohl dies ein einfacher und guter Ansatz ist, ist das Endergebnis nicht so überzeugend. Manchmal kehrt der Charakter seine Route komplett um, weil das Ziel dahinter steht. Das Verhalten des Charakters scheint viel mehr zu sein "Verdammt, ich habe meine Schlüssel vergessen!" als "Okay, ich werde jetzt dieser Richtung folgen".


Wandern

Eine andere Implementierung des Wanderverhaltens wurde von Craig W. Reynolds vorgeschlagen, als er diese Verhaltensweisen erfand. Die Grundidee ist, kleine zufällige Verschiebungen zu erzeugen und auf den aktuellen Richtungsvektor des Charakters (in unserem Fall die Geschwindigkeit) jeden Spielrahmen anzuwenden. Da der Geschwindigkeitsvektor definiert, wohin sich der Charakter bewegt und wie viel er sich in jedem Bild bewegt, ändert jede Interferenz mit diesem Vektor die aktuelle Route.

Bei Verwendung kleiner Verschiebungen verhindert jeder Frame, dass der Charakter seine Route abrupt ändert. Wenn sich der Charakter zum Beispiel nach oben bewegt und nach rechts dreht, bewegt er sich immer noch nach oben und dreht sich nach rechts, jedoch in einem etwas anderen Winkel.

Dieser Ansatz kann auch auf unterschiedliche Weise umgesetzt werden. Eine davon ist die Verwendung eines Kreises vor dem Charakter, mit dem alle beteiligten Kräfte berechnet werden:

Das Verschiebungskraft  hat seinen Ursprung im Zentrum des Kreises und ist durch den Kreisradius eingeschränkt. Je größer der Radius und der Abstand vom Charakter zum Kreis, desto stärker wird der "Push" des Charakters bei jedem Spielrahmen.

Diese Verschiebungskraft wird verwendet, um die Route des Charakters zu stören. Es wird verwendet, um das zu berechnen Wanderkraft.


Die Position des Kreises berechnen

Die erste zur Berechnung der Wanderkraft erforderliche Komponente ist die Mittelposition des Kreises. Da der Kreis vor dem Zeichen platziert werden soll, kann der Geschwindigkeitsvektor als Richtlinie verwendet werden:

 // Die unten stehende CIRCLE_DISTANCE-Konstante ist // eine an anderer Stelle definierte Zahl. // Der Code zum Berechnen des Kreismittelpunkts: var circleCenter: Vector3D; CircleCenter = Velocity.Clone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE);

Das CircleCenter Der obige Vektor ist ein Klon (Kopie) des Geschwindigkeitsvektors, dh er zeigt in dieselbe Richtung. Es wird normalisiert und mit einem Skalarwert multipliziert (CIRCLE_DISTANCE, in diesem Fall), woraus sich folgender Vektor ergibt:


Verschiebungskraft

Die nächste Komponente ist die Verschiebungskraft, die für die Rechts- oder Linksdrehung verantwortlich ist. Da dies eine Kraft ist, die zur Erzeugung von Störungen verwendet wird, kann sie überall hinweisen. Verwenden wir einen Vektor, der an der Y-Achse ausgerichtet ist:

 var Verschiebung: Vector3D; Verschiebung = neuer Vector3D (0, -1); Displacement.scaleBy (CIRCLE_RADIUS); // // Die Vektorrichtung zufällig ändern, // indem der aktuelle Winkel geändert wird setAngle (Versatz, WandernAngle); // // Ändere die Einstellung von "wandernAngle" nur ein wenig, damit // im // nächsten Spielfeld nicht derselbe Wert angezeigt wird. wanderAngle + = (Math.random () * ANGLE_CHANGE) - (ANGLE_CHANGE * .5);

Die Verschiebungskraft wird mit dem Kreisradius erstellt und skaliert. Wie zuvor beschrieben, ist die Wanderkraft umso stärker, je größer der Radius ist. Das WanderAngle ist ein Skalarwert, der definiert, wie stark die Verschiebungskraft "gekippt" werden soll; Nach der Verwendung wird ein Zufallswert hinzugefügt, um ihn für den nächsten Spielrahmen zu ändern. Es erzeugt die erforderliche Zufälligkeit in der Bewegung.

Nehmen wir zum Verständnis an, dass die oben berechnete Verschiebungskraft im Zentrum des Kreises liegt. Da es durch den Kreisradiuswert skaliert wurde, würde es ungefähr so ​​aussehen:

Spitze: Denken Sie daran, dass mathematische Vektoren keine Position im Raum haben, sondern eine Richtung und eine Größe (Länge). Folglich können sie überall aufgestellt werden.

Wanderkraft

Nachdem der Kreismittelpunkt und der Verschiebungsvektor berechnet wurden, müssen sie kombiniert werden, um den Kreis zu erzeugen Wanderkraft. Diese Kraft wird durch Addition dieser beiden Vektoren berechnet:

 var wanderForce: Vector3D; wanderForce = circleCenter.add (Verschiebung);

Wir können diese Kräfte visuell so darstellen:

Man kann sich die Wanderkraft als einen Vektor vorstellen, der vom Zeichen zu einem Punkt auf dem Umfang des Kreises führt. Abhängig von der Position dieses Punktes drückt die Wanderkraft den Charakter nach links oder nach rechts, stark oder schwach:

Je mehr die Wanderkraft mit dem Geschwindigkeitsvektor ausgerichtet ist, desto weniger ändert der Charakter seine aktuelle Route. Die Wanderkraft funktioniert genauso wie die Such- und Fluchtkräfte: Sie drückt den Charakter in eine Richtung.

Ähnlich wie Suchen und Fliehen, wenn die Kraftrichtung basierend auf einem Ziel berechnet wird, wird die Wanderrichtung basierend auf einem zufälligen Punkt auf dem Kreisumfang berechnet. Der endgültige Code für die Wanderkraft lautet:

 private Funktion wandern (): Vector3D // Berechne den Kreismittelpunkt. circleCenter: Vector3D; CircleCenter = Velocity.Clone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE); // // Berechne die Verschiebungskraft var Verschiebung: Vector3D; Verschiebung = neuer Vector3D (0, -1); Displacement.scaleBy (CIRCLE_RADIUS); // // Die Vektorrichtung zufällig ändern, // indem der aktuelle Winkel geändert wird setAngle (Versatz, WandernAngle); // // Ändere die Einstellung von "wandernAngle" nur ein wenig, damit // im // nächsten Spielfeld nicht derselbe Wert angezeigt wird. wanderAngle + = Math.random () * ANGLE_CHANGE - ANGLE_CHANGE * .5; // // Berechne schließlich die Wanderkraft und schicke sie zurück. Var wanderForce: Vector3D; wanderForce = circleCenter.add (Verschiebung); WanderForce zurückkehren;  public function setAngle (Vektor: Vector3D, Wert: Number): void var len: Number = vector.length; Vektor.x = Math.cos (Wert) * len; vector.y = Math.sin (Wert) * len; 

Kräfte hinzufügen

Nachdem die Wanderkraft berechnet wurde, muss sie zur Geschwindigkeit des Charakters addiert werden, damit er seine Bewegung beeinflussen kann. Die Addition dieser Kraft erfolgt auf dieselbe Weise wie zuvor:

 Lenkung = Wandern () Lenkung = verkürzt (Lenkung, max_force) Lenkung = Lenkung / Massengeschwindigkeit = verkürzt (Geschwindigkeit + Lenkung, max_speed) Position = Position + Geschwindigkeit

Die Wanderkraft beeinflusst die Route des Charakters auf dieselbe Weise wie die zuvor beschriebenen Verhaltensweisen, mit dem Unterschied, dass der Charakter in jedem Spielrahmen in eine zufällige Richtung versetzt wird:


Das Wanderverhalten. Klicken Sie auf die Demo, um Kraftvektoren anzuzeigen.

Die obige Demo zeigt mehrere Charaktere, die in der Umgebung wandern. Wenn sie den Bildschirm verlassen, erscheinen sie in der Mitte.


Fazit

Das Wanderverhalten ist eine hervorragende Möglichkeit, zufällige Bewegungen auszuführen. Sie wird durch einen imaginären Kreis vor dem Zeichen gesteuert, der durch Drehen an das gewünschte Bewegungsmuster angepasst werden kann.

In diesem Tutorial wurde das Lenkverhalten beschrieben und das Wanderverhalten erläutert. Im nächsten Beitrag werden wir mehr über Verhaltensweisen erfahren. Bleiben Sie auf dem Laufenden, indem Sie uns auf Twitter, Facebook oder Google folgen+.