Menu
CoddyTech

Die Wände

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

Die Felder des Spielbretts reichen auf der x- und der z-Achse von -7 bis 7. Ein Feld liegt also auf dem Spielbrett, wenn sowohl sein x- als auch sein z-Wert zwischen -7 und 7 liegen. Da das Spielbrett auf 0 zentriert ist, genügt eine Prüfung für beide Seiten: Mathf.Abs(x) > 7 ist außerhalb des Spielfeldrands wahr.

Prüfe das Feld, das der Kopf gleich betreten wird, bevor er sich dorthin bewegt. Dann bleibt eine Schlange, die gegen eine Wand stößt, auf dem letzten Feld des Spielbretts, statt innerhalb des Spielfeldrands zu landen. Bei einem Schachturm auf einem Schachbrett mit den Nummern 0 bis 7 prüfst du es genauso:

Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
    return;   // außerhalb des Spielfelds: der Turm bleibt stehen
}
transform.position = target;

Wenn die Schlange gegen eine Wand stößt, endet das Spiel, und sie bleibt endgültig stehen. Das erreichst du mit einem bool, das Update() zuerst prüft: Ein return am Anfang überspringt sowohl die Tastenabfragen als auch den Timer.

challenge icon

Aufgabe

Einfach
  1. Füge public int edge = 7; hinzu (die Zellen des Spielfelds reichen von -edge bis edge) sowie public bool alive = true;.
  2. Ermittle in Step() nach dem Setzen von direction den Wert von next, der Zelle, die der Kopf als Nächstes betreten wird. Wenn sie außerhalb des Spielfelds liegt, rufe Die() auf und kehre zurück, ohne dich zu bewegen; andernfalls bewege den Kopf zu next.
  3. Schreibe void Die(), das alive auf false setzt.
  4. Beginne Update() mit einer Rückgabe, wenn die Schlange nicht mehr lebt, damit eine tote Schlange weder abbiegt noch einen Schritt macht.

Drücke auf Play, lenke gegen eine Wand und drücke dann auf Check.

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;       // 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()
    {
        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;
        transform.position += direction;
    }
}
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