Menu
CoddyTech

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;   // true

Ein 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.

challenge icon

Aufgabe

Einfach
  1. Füge private Vector3 nextDirection = Vector3.right; hinzu, die Richtungsänderung, die auf den nächsten Schritt wartet.
  2. Schreibe void Turn(Vector3 newDirection): Die Methode setzt nextDirection auf newDirection, sofern newDirection nicht das Gegenteil von direction ist.
  3. In Update() ruft jede Taste Turn mit ihrer Richtung auf, anstatt direction zu setzen.
  4. Setze am Anfang von Step() direction auf nextDirection.

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;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: 3D-Snake