La cola
Lección 7 de 14 del curso Juego de Unity: Snake 3D de Coddy.
La cola es una lista de segmentos, List<Transform> tail, desde el que está detrás de la cabeza, tail[0], hasta el final. La escena inicia la serpiente con dos segmentos, Tail1 y Tail2, configurados en el Inspector.
En cada paso, cada segmento ocupa la celda del que está delante, y tail[0] ocupa la celda de la cabeza. El orden importa. Si se empieza por delante, tail[1] copiaría la celda a la que tail[0] ya se ha movido, y toda la cola se amontonaría en una sola celda. Si se empieza por detrás, cada segmento copia una celda que aún no ha cambiado. Los pasajeros que se desplazan un asiento hacia atrás funcionan de la misma manera:
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 cabeza se mueve al final, una vez que tail[0] ha ocupado su celda anterior.
Desafío
Intermedio- Añade
using System.Collections.Generic;ypublic List<Transform> tail = new List<Transform>();. La escena lo rellena con Tail1 y Tail2. - En
Step(), justo antes de que la cabeza se mueva, mueve la cola: cada segmento, empezando por el de atrás, ocupa la celda del que tiene delante, ytail[0]ocupa la celda de la cabeza.
Pulsa Play y dirige la serpiente: la cola sigue el recorrido de la cabeza. Después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // segundos entre dos pasos
public int edge = 7; // las celdas del tablero van de -edge a edge
public bool alive = true;
private float timer;
private Vector3 direction = Vector3.right; // la dirección en la que se movió la cabeza en su último paso
private Vector3 nextDirection = Vector3.right; // el giro pendiente para el siguiente paso
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.