Menu
CoddyTech

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, Ben

La cabeza se mueve al final, una vez que tail[0] ha ocupado su celda anterior.

challenge icon

Desafío

Intermedio
  1. Añade using System.Collections.Generic; y public List<Transform> tail = new List<Transform>();. La escena lo rellena con Tail1 y Tail2.
  2. 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, y tail[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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: Snake 3D