Keine Kehrtwenden
Lektion 3 von 14 im Kurs Unity-Spiel: 3D-Snake von Coddy.
Eine Schlange, die direkt umkehrt, läuft in ihren eigenen Hals, daher wird eine Wendung in die entgegengesetzte Richtung ignoriert. Die entgegengesetzte Richtung ist die negative: Bewegt sich die Schlange nach rechts, ist -direction gleich Vector3.left.
Vector3 heading = Vector3.right;
Vector3 back = -heading; // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back; // trueEin Vergleich mit direction reicht nicht aus, wenn ein Tastendruck direction sofort ändert. Bewegt sich die Schlange nach rechts, drückt ein Spieler innerhalb eines Ticks zuerst nach oben und dann nach links. Nach oben ist erlaubt. Anschließend wird links mit oben verglichen, der Wendung, die noch nicht ausgeführt wurde, und ebenfalls erlaubt. Daher bewegt sich der nächste Schritt nach links, direkt zurück über den Hals.
Die Lösung verwendet zwei Richtungen. direction ist die Richtung, in die sich der Kopf bei seinem letzten Schritt bewegt hat; nextDirection ist die Wendung, die auf den nächsten Schritt wartet. Eine Taste ändert nextDirection, aber erst, nachdem die Wendung mit direction verglichen wurde. Der Schritt beginnt damit, die vorgemerkte Wendung auszuführen. Im obigen Fall wird links mit rechts verglichen, der Richtung, in die sich der Kopf tatsächlich bewegt, und verworfen.
Aufgabe
Einfach- Füge
private Vector3 nextDirection = Vector3.right;hinzu, die Richtungsänderung, die auf den nächsten Schritt wartet. - Schreibe
void Turn(Vector3 newDirection): Die Methode setztnextDirectionaufnewDirection, sofernnewDirectionnicht das Gegenteil vondirectionist. - In
Update()ruft jede TasteTurnmit ihrer Richtung auf, anstattdirectionzu setzen. - Setze am Anfang von
Step()directionaufnextDirection.
Drücke Play und versuche, zurückzuwenden. Drücke dann Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // Sekunden zwischen zwei Schritten
private float timer;
private Vector3 direction = Vector3.right;
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Step()
{
transform.position += direction;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.