Menu
CoddyTech

Keine Kehrtwenden

Lektion 3 von 14 im Kurs Unity-Spiel: 3D-Snake von Coddy.

Eine Schlange, die direkt umkehrt, stößt mit ihrem eigenen Hals zusammen, daher wird eine Wendung in die entgegengesetzte Richtung ignoriert. Das Gegenteil einer Richtung ist ihre negative Richtung: Bewegt sich die Schlange nach rechts, ist -direction gleich Vector3.left.

Der Vergleich mit direction reicht nicht aus, wenn eine Eingabe die Richtung sofort ändert: Die Schlange bewegt sich nach rechts, ein Spieler drückt innerhalb eines Ticks erst nach oben und dann nach links. Nach oben ist erlaubt, dann wird links mit oben verglichen und ebenfalls erlaubt, und der nächste Schritt führt zurück über den Hals.

Verwende also zwei Richtungen: direction, die Richtung, in die sich der Kopf zuletzt bewegt hat, und nextDirection, die Wendung, die auf den nächsten Schritt wartet. Eine Taste ändert nextDirection nach dem Vergleich mit direction, und der Schritt setzt die wartende Wendung um.

challenge icon

Aufgabe

Einfach

Verhindere, dass sich die Schlange direkt zurück in Richtung ihres Halses dreht.

  1. Füge private Vector3 nextDirection = Vector3.right; und void Turn(Vector3 newDirection) hinzu: Setze nextDirection, sofern newDirection == -direction nicht zutrifft.
  2. In Update() ruft jede Taste Turn mit ihrer Richtung auf, anstatt direction zu setzen.
  3. Setze am Anfang von Step() direction = nextDirection;

Drücke auf „Spielen“ und drücke nach links, während du dich nach rechts bewegst: Die Schlange bewegt sich weiter nach rechts. Drücke dann auf „Prüfen“.

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;
    }
}

Alle Lektionen in Unity-Spiel: 3D-Snake

Übe selbstständig: Unity-Playground