Menu
CoddyTech

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.

challenge icon

Desafío

Fácil
  1. Añade public int edge = 7; (las celdas del tablero van de -edge a edge) y public bool alive = true;.
  2. En Step(), después de establecer direction, calcula next, la celda en la que la cabeza está a punto de entrar. Si está fuera del tablero, llama a Die() y retorna sin moverte; de lo contrario, mueve la cabeza a next.
  3. Escribe void Die(), que establece alive en false.
  4. 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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: Snake 3D