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, BenLa tête se déplace en dernier, une fois que tail[0] a pris son ancienne case.
Défi
MoyenAjoute une queue au serpent qui suit sa tête.
- Dans
Snake, ajouteusing System.Collections.Generic;etpublic List<Transform> tail = new List<Transform>();(la scène ajoute Tail1 et Tail2). - 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