Menu
CoddyTech

La cola

Lección 7 de 14 del curso Juego de Unity: Serpiente 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

Dale a la serpiente una cola que siga a la cabeza.

  1. En Snake, añade using System.Collections.Generic; y public List<Transform> tail = new List<Transform>(); (la escena añade Tail1 y Tail2).
  2. En Step(), justo antes de que se mueva la cabeza: desde atrás, cada segmento ocupa la celda del que tiene delante; tail[0] ocupa la celda de la cabeza.

Pulsa «Jugar» y dirige la serpiente: la cola sigue el recorrido de la cabeza. Después, pulsa «Comprobar».

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 casillas 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;
    }
}

Todas las lecciones de Juego de Unity: Serpiente 3D

Practica por tu cuenta: Playground de Unity