Les murs
Leçon 4 sur 14 du cours Jeu Unity : Snake 3D de Coddy.
Les cases du plateau vont de -7 à 7 sur x et sur z. Le plateau étant centré sur 0, un seul test couvre les deux côtés : Mathf.Abs(x) > 7 est vrai au-delà de l’un ou l’autre bord.
Teste la case dans laquelle la tête est sur le point d’entrer, avant qu’elle ne s’y déplace, afin qu’un serpent qui heurte un mur reste sur la dernière case au lieu de finir à l’intérieur de la bordure. Sur un plateau plus petit, avec un bord à 4 :
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;Heurter un mur arrête définitivement le serpent. Un bool que Update() teste en premier permet de faire cela : un return au début ignore aussi bien les touches que le minuteur.
Défi
FacileToucher un mur met fin à la partie.
- Ajoute
public int edge = 7;etpublic bool alive = true; - Dans
Step(), après avoir défini la direction, écrisVector3 next = transform.position + direction;. Si le serpent sort du plateau (Mathf.Abs(next.x) > edge, ou pour z) : appelleDie()et retourne ; sinon, déplace-le vers la position suivante. void Die() { alive = false; };Update()commence parif (!alive) return;
Clique sur « Jouer » et dirige le serpent vers un mur : il s'arrête sur la dernière case. Puis clique sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // secondes entre deux déplacements
private float timer;
private Vector3 direction = Vector3.right; // la direction dans laquelle la tête s’est déplacée lors du dernier déplacement
private Vector3 nextDirection = Vector3.right; // le changement de direction en attente du prochain déplacement
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;
}
}
Toutes les leçons de Jeu Unity : Snake 3D
Entraînez-vous par vous-même : Playground Unity