Menu
CoddyTech

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, Ben

Der Kopf bewegt sich zuletzt, sobald tail[0] seine alte Zelle übernommen hat.

challenge icon

Aufgabe

Mittel
  1. Füge using System.Collections.Generic; und public List<Transform> tail = new List<Transform>(); hinzu. Die Szene füllt die Liste mit Tail1 und Tail2.
  2. Bewege in Step() direkt bevor sich der Kopf bewegt den Schwanz: Jedes Segment übernimmt von hinten ausgehend die Zelle des Segments vor ihm, und tail[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;
    }
}
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