Menu
CoddyTech

Prohibido dar la vuelta

Lección 3 de 14 del curso Juego de Unity: Serpiente 3D de Coddy.

Una serpiente que gira directamente hacia atrás choca contra su propio cuello, así que se ignora el giro en la dirección opuesta. La dirección opuesta es la negativa: mientras la serpiente se mueve hacia la derecha, -direction es Vector3.left.

Comparar con direction no es suficiente si una pulsación la cambia de inmediato: mientras se mueve hacia la derecha, el jugador pulsa arriba y después izquierda, dentro de un mismo tick. Se permite ir hacia arriba y, después, se comprueba izquierda con respecto a arriba, y también se permite, por lo que el siguiente paso vuelve sobre el cuello.

Así que mantén dos direcciones: direction, la dirección en la que se movió la cabeza por última vez, y nextDirection, el giro que espera al siguiente paso. Una tecla cambia nextDirection después de compararla con direction, y el paso hace efectivo el giro pendiente.

challenge icon

Desafío

Fácil

Evita que la serpiente dé la vuelta y se dirija directamente hacia su cuello.

  1. Añade private Vector3 nextDirection = Vector3.right; y void Turn(Vector3 newDirection): asigna nextDirection, a menos que newDirection == -direction.
  2. En Update(), cada tecla llama a Turn con su dirección en lugar de asignar direction.
  3. Al inicio de Step(), asigna direction = nextDirection;

Pulsa «Jugar» y pulsa la flecha izquierda mientras avanzas hacia la derecha: la serpiente sigue avanzando hacia la derecha. 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;

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Step()
    {
        transform.position += direction;
    }
}

Todas las lecciones de Juego de Unity: Serpiente 3D

Practica por tu cuenta: Playground de Unity