Menu
CoddyTech

La queue

Leçon 7 sur 14 du cours Jeu Unity : Snake 3D de Coddy.

La queue est une liste de segments, List<Transform> tail, qui commence par celui juste derrière la tête, tail[0], et va jusqu’au dernier. Dans la scène, le serpent commence avec deux segments, Tail1 et Tail2, définis dans l’Inspector.

À chaque étape, chaque segment prend la case de celui qui le précède, et tail[0] prend la case de la tête. L’ordre compte. En partant de l’avant, tail[1] copierait la case vers laquelle tail[0] s’est déjà déplacé, et toute la queue s’empilerait sur une seule case. En partant de l’arrière, chaque segment copie une case qui n’a pas encore changé. Les passagers qui reculent d’un siège fonctionnent de la même manière :

string[] seats = { "Ana", "Ben", "Cy" };
for (int i = seats.Length - 1; i > 0; i--)
{
    seats[i] = seats[i - 1];
}
seats[0] = "Dee";   // Dee, Ana, Ben

La tête se déplace en dernier, une fois que tail[0] a pris son ancienne case.

challenge icon

Défi

Moyen

Ajoute une queue au serpent qui suit sa tête.

  1. Dans Snake, ajoute using System.Collections.Generic; et public List<Transform> tail = new List<Transform>(); (la scène ajoute Tail1 et Tail2).
  2. Dans Step(), juste avant que la tête ne bouge : en partant de l’arrière, chaque segment prend la case de celui qui le précède ; tail[0] prend la case de la tête.

Appuie sur « Jouer » et dirige le serpent : sa queue suit le trajet de sa tête. Puis appuie 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
    public int edge = 7;         // les cases du plateau vont de -edge à edge
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // la direction dans laquelle la tête s’est déplacée lors du dernier pas
    private Vector3 nextDirection = Vector3.right;   // le changement de direction en attente du prochain pas

    void Update()
    {
        if (!alive) return;

        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;
        Vector3 next = transform.position + direction;
        if (Mathf.Abs(next.x) > edge || Mathf.Abs(next.z) > edge)
        {
            Die();
            return;
        }

        transform.position = next;

        if (GameManager.Instance.IsFood(next))
        {
            GameManager.Instance.Eat();
        }
    }

    void Die()
    {
        alive = false;
    }
}

Toutes les leçons de Jeu Unity : Snake 3D

Entraînez-vous par vous-même : Playground Unity