Menu
CoddyTech

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.

challenge icon

Défi

Facile

Toucher un mur met fin à la partie.

  1. Ajoute public int edge = 7; et public bool alive = true;
  2. Dans Step(), après avoir défini la direction, écris Vector3 next = transform.position + direction;. Si le serpent sort du plateau (Mathf.Abs(next.x) > edge, ou pour z) : appelle Die() et retourne ; sinon, déplace-le vers la position suivante.
  3. void Die() { alive = false; } ; Update() commence par if (!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