Menu
CoddyTech

A Cauda

Lição 7 de 14 do curso Jogo de Cobra 3D na Unity da Coddy.

A cauda é uma lista de segmentos, List<Transform> tail, começando pelo que está atrás da cabeça, tail[0], até o final. A cena inicia a cobra com dois segmentos, Tail1 e Tail2, definidos no Inspector.

A cada passo, cada segmento ocupa a célula daquele que está à sua frente, e tail[0] ocupa a célula da cabeça. A ordem importa. Indo da frente para trás, tail[1] copiaria a célula para a qual tail[0] já se moveu, e a cauda inteira se amontoaria em uma só célula. Indo de trás para frente, cada segmento copia uma célula que ainda não mudou. Passageiros que se movem um assento para trás funcionam da mesma maneira:

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

A cabeça se move por último, depois que tail[0] ocupa sua célula antiga.

challenge icon

Desafio

Médio
  1. Adicione using System.Collections.Generic; e public List<Transform> tail = new List<Transform>();. A cena o preenche com Tail1 e Tail2.
  2. Em Step(), logo antes de a cabeça se mover, mova a cauda: cada segmento, começando pelo de trás, ocupa a célula do segmento à sua frente, e tail[0] ocupa a célula da cabeça.

Pressione Play e controle a direção: a cauda segue o caminho da cabeça. Em seguida, pressione Check.

Experimente você mesmo

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // segundos entre dois passos
    public int edge = 7;         // as células do tabuleiro vão de -edge até edge
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // a direção em que a cabeça se moveu no último passo
    private Vector3 nextDirection = Vector3.right;   // a mudança de direção aguardando o próximo passo

    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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Cobra 3D na Unity