As paredes
Lição 4 de 14 do curso Jogo de Cobra 3D na Unity da Coddy.
As células do tabuleiro vão de -7 a 7 em x e em z, então uma célula está no tabuleiro quando tanto seu x quanto seu z estão entre -7 e 7. Com o tabuleiro centralizado em 0, um teste cobre os dois lados: Mathf.Abs(x) > 7 é verdadeiro além de qualquer uma das bordas.
Teste a célula em que a cabeça está prestes a entrar antes de ela se mover para lá. Assim, uma cobra que bate em uma parede permanece na última célula do tabuleiro, em vez de acabar dentro da borda. Uma torre em um tabuleiro de xadrez numerado de 0 a 7 é verificada da mesma maneira:
Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
return; // fora do tabuleiro: a torre permanece onde está
}
transform.position = target;Bater em uma parede encerra o jogo, e a cobra para de vez. Uma bool que Update() verifica primeiro faz isso: um return no início ignora tanto as teclas quanto o temporizador.
Desafio
Fácil- Adicione
public int edge = 7;(as células do tabuleiro vão de-edgeaedge) epublic bool alive = true;. - Em
Step(), depois de definirdirection, calculenext, a célula em que a cabeça está prestes a entrar. Se estiver fora do tabuleiro, chameDie()e retorne sem se mover; caso contrário, mova a cabeça paranext. - Escreva
void Die(), que definealivecomo false. - Comece
Update()com um retorno quando a cobra não estiver viva, para que uma cobra morta não vire nem avance.
Pressione Play, conduza a cobra contra uma parede e, 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
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 virada aguardando o próximo passo
void Update()
{
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;
transform.position += direction;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.