Menu
CoddyTech

Die Wände

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

Die Zellen des Spielfelds reichen auf x und z von -7 bis 7. Da das Spielfeld auf 0 zentriert ist, deckt ein Test beide Seiten ab: Mathf.Abs(x) > 7 ist jenseits jeder der beiden Kanten wahr.

Teste die Zelle, die der Kopf gleich betreten wird, bevor er sich dorthin bewegt. So bleibt eine Schlange, die gegen eine Wand stößt, auf der letzten Zelle stehen, statt innerhalb der Begrenzung zu enden. Auf einem kleineren Spielfeld mit einer Kante bei 4:

Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;

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

challenge icon

Aufgabe

Einfach

Wenn die Schlange eine Wand berührt, ist das Spiel vorbei.

  1. Füge public int edge = 7; und public bool alive = true; hinzu.
  2. Setze in Step() nach dem Setzen der Richtung Vector3 next = transform.position + direction;. Wenn sich die Schlange außerhalb des Spielfelds befindet (Mathf.Abs(next.x) > edge oder z): Die() aufrufen und zurückkehren; andernfalls zu next bewegen.
  3. void Die() { alive = false; }; Update() beginnt mit if (!alive) return;.

Drücke „Spielen“ und steuere die Schlange gegen eine Wand: Sie bleibt auf dem letzten Feld stehen. Klicke 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;       // 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()
    {
        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;
    }
}

Alle Lektionen in Unity-Spiel: 3D-Snake

Übe selbstständig: Unity-Playground