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
Moyen- Ajoute
using System.Collections.Generic;etpublic List<Transform> tail = new List<Transform>();. La scène le remplit avec Tail1 et Tail2. - 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, ettail[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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.