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.
Aufgabe
Einfach- Füge
public int edge = 7;hinzu (die Zellen des Spielfelds reichen von-edgebisedge) sowiepublic bool alive = true;. - Ermittle in
Step()nach dem Setzen vondirectionden Wert vonnext, der Zelle, die der Kopf als Nächstes betreten wird. Wenn sie außerhalb des Spielfelds liegt, rufeDie()auf und kehre zurück, ohne dich zu bewegen; andernfalls bewege den Kopf zunext. - Schreibe
void Die(), dasaliveauf false setzt. - 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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.