Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Chocar contra una pared termina el juego.

  1. Añade public int edge = 7; y public bool alive = true;
  2. 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.
  3. void Die() { alive = false; }; Update() comienza con if (!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