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
MittelGib der Schlange einen Schwanz, der dem Kopf folgt.
- Füge in
Snakeusing System.Collections.Generic;undpublic List<Transform> tail = new List<Transform>();hinzu (die Szene fügt Tail1 und Tail2 hinzu). - In
Step(), unmittelbar bevor sich der Kopf bewegt: Von hinten aus übernimmt jedes Segment die Zelle des Segments davor;tail[0]übernimmt die Zelle des Kopfes.
Drücke auf „Spielen“ und steuere die Schlange: Der Schwanz folgt dem Weg des Kopfes. Drücke anschließend auf „Prüfen“.
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 Zellen 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 Richtungsänderung, die auf den nächsten Schritt wartet
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;
}
}
Alle Lektionen in Unity-Spiel: 3D-Snake
Übe selbstständig: Unity-Playground