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.
Aufgabe
EinfachVerhindere, dass sich die Schlange direkt zurück in Richtung ihres Halses dreht.
- Füge
private Vector3 nextDirection = Vector3.right;undvoid Turn(Vector3 newDirection)hinzu: Setze nextDirection, sofernnewDirection == -directionnicht zutrifft. - In
Update()ruft jede TasteTurnmit ihrer Richtung auf, anstatt direction zu setzen. - 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