Menu
CoddyTech

A cauda

Lição 7 de 14 do curso Jogo 3D da Cobrinha 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

Dê uma cauda à cobra que siga a cabeça.

  1. Em Snake, adicione using System.Collections.Generic; e public List<Transform> tail = new List<Transform>(); (a cena adiciona Tail1 e Tail2).
  2. Em Step(), logo antes de a cabeça se mover: começando pela parte de trás, cada segmento ocupa a célula do segmento à sua frente; tail[0] ocupa a célula da cabeça.

Pressione “Jogar” e controle a cobra: a cauda segue o caminho da cabeça. Depois, pressione “Verificar”.

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

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

Pratique por conta própria: Playground de Unity