Der Schwanz
Lektion 7 von 14 im Kurs Unity-Spiel: 3D-Snake von Coddy.
Der Schwanz ist eine Liste von Segmenten, List<Transform> tail, beginnend mit dem Segment direkt hinter dem Kopf, tail[0], bis zum Ende. Die Szene startet die Schlange mit zwei Segmenten, Tail1 und Tail2, die im Inspector festgelegt sind.
Bei jedem Schritt übernimmt jedes Segment die Zelle des Segments vor ihm, und tail[0] übernimmt die Zelle des Kopfes. Die Reihenfolge ist wichtig. Geht man von vorne nach hinten, würde tail[1] die Zelle übernehmen, zu der sich tail[0] bereits bewegt hat, und der ganze Schwanz würde sich auf einer Zelle stapeln. Geht man von hinten nach vorne, übernimmt jedes Segment eine Zelle, die sich noch nicht geändert hat. Passagiere, die einen Sitz nach hinten rücken, funktionieren genauso:
string[] seats = { "Ana", "Ben", "Cy" };
for (int i = seats.Length - 1; i > 0; i--)
{
seats[i] = seats[i - 1];
}
seats[0] = "Dee"; // Dee, Ana, BenDer Kopf bewegt sich zuletzt, sobald tail[0] seine alte Zelle übernommen hat.
Aufgabe
Mittel- Füge
using System.Collections.Generic;undpublic List<Transform> tail = new List<Transform>();hinzu. Die Szene füllt die Liste mit Tail1 und Tail2. - Bewege in
Step()direkt bevor sich der Kopf bewegt den Schwanz: Jedes Segment übernimmt von hinten ausgehend die Zelle des Segments vor ihm, undtail[0]übernimmt die Zelle des Kopfes.
Drücke auf Play und steuere die Schlange: Der Schwanz folgt dem Weg des Kopfes. Drücke anschließend auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // Sekunden zwischen zwei Schritten
public int edge = 7; // die Felder des Spielfelds reichen von -edge bis edge
public bool alive = true;
private float timer;
private Vector3 direction = Vector3.right; // die Richtung, in die sich der Kopf beim letzten Schritt bewegt hat
private Vector3 nextDirection = Vector3.right; // die für den nächsten Schritt vorgemerkte Richtungsänderung
void Update()
{
if (!alive) return;
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > edge || Mathf.Abs(next.z) > edge)
{
Die();
return;
}
transform.position = next;
if (GameManager.Instance.IsFood(next))
{
GameManager.Instance.Eat();
}
}
void Die()
{
alive = false;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.