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, BenA cabeça se move por último, depois que tail[0] ocupa sua célula antiga.
Desafio
MédioDê uma cauda à cobra que siga a cabeça.
- Em
Snake, adicioneusing System.Collections.Generic;epublic List<Transform> tail = new List<Transform>();(a cena adiciona Tail1 e Tail2). - 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