Las paredes
Lección 4 de 14 del curso Juego de Unity: Snake 3D de Coddy.
Las celdas del tablero van de -7 a 7 tanto en x como en z, así que una celda está en el tablero mientras que tanto x como z estén entre -7 y 7. Como el tablero está centrado en 0, una prueba cubre ambos lados: Mathf.Abs(x) > 7 es true más allá de cualquiera de los bordes.
Comprueba la celda a la que la cabeza está a punto de entrar antes de que se mueva allí. Así, una serpiente que choca contra una pared se queda en la última celda del tablero en lugar de acabar dentro del borde. Una torre en un tablero de ajedrez numerado del 0 al 7 se comprueba de la misma manera:
Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
return; // fuera del tablero: la torre se queda donde está
}
transform.position = target;Chocar contra una pared termina el juego y la serpiente se detiene para siempre. Un bool que Update() comprueba primero lo consigue: un return al principio omite tanto las teclas como el temporizador.
Desafío
Fácil- Añade
public int edge = 7;(las celdas del tablero van de-edgeaedge) ypublic bool alive = true;. - En
Step(), después de establecerdirection, calculanext, la celda en la que la cabeza está a punto de entrar. Si está fuera del tablero, llama aDie()y retorna sin moverte; de lo contrario, mueve la cabeza anext. - Escribe
void Die(), que establecealiveen false. - Empieza
Update()con un retorno cuando la serpiente no esté viva, para que una serpiente muerta no gire ni avance.
Pulsa Play, dirige la serpiente hacia una pared y luego pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // segundos entre dos pasos
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()
{
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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.