Los muros
Lección 4 de 14 del curso Juego de Unity: Serpiente 3D de Coddy.
Las celdas del tablero van de -7 a 7 en x y en z. 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í, para que una serpiente que choca contra una pared se quede en la última celda en lugar de terminar dentro del borde. En un tablero más pequeño con borde 4:
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;Chocar contra una pared detiene la serpiente para siempre. Una bool que Update() comprueba primero consigue ese efecto: un return al principio omite tanto las teclas como el temporizador.
Desafío
FácilChocar contra una pared termina el juego.
- Añade
public int edge = 7;ypublic bool alive = true; - En
Step(), después de establecer la dirección,Vector3 next = transform.position + direction;. Si está fuera del tablero (Mathf.Abs(next.x) > edge, o z):Die()y retorna; de lo contrario, muévete a next. void Die() { alive = false; };Update()comienza conif (!alive) return;
Pulsa «Jugar» y conduce la serpiente contra una pared: se detiene en la última celda. Después, pulsa «Comprobar».
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;
}
}
Todas las lecciones de Juego de Unity: Serpiente 3D
Practica por tu cuenta: Playground de Unity