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
  1. Ajoute using System.Collections.Generic; et public List<Transform> tail = new List<Transform>();. La scène le remplit avec Tail1 et Tail2.
  2. Dans Step(), juste avant que la tête ne bouge, déplace la queue : chaque segment, en partant de l'arrière, prend la case de celui qui le précède, et tail[0] prend la case de la tête.

Appuie sur Play et dirige le serpent : la queue suit le chemin de la tête. Puis appuie sur Check.

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 prévu pour le 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;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

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