Menu
CoddyTech

Prohibido dar la vuelta

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

Una serpiente que gira de vuelta en línea recta choca con su propio cuello, así que se ignora un giro en la dirección opuesta a la que avanza. La dirección opuesta es la negativa: mientras la serpiente se mueve hacia la derecha, -direction es Vector3.left.

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

Comparar con direction no es suficiente cuando una pulsación cambia direction de inmediato. Al moverse hacia la derecha, el jugador pulsa arriba y después izquierda dentro de un mismo tick. Arriba está permitido. Luego se comprueba izquierda con respecto a arriba, el giro que todavía no ha ocurrido, y también se permite, así que el siguiente paso va hacia la izquierda, de vuelta directamente sobre el cuello.

La solución mantiene dos direcciones. direction es la dirección en la que se movió la cabeza en el último paso; nextDirection es el giro que espera al siguiente paso. Una tecla cambia nextDirection, pero solo después de comparar el giro con direction, y el paso comienza haciendo efectivo el giro pendiente. En el caso anterior, izquierda se compara con derecha, la dirección en la que realmente se mueve la cabeza, y se descarta.

challenge icon

Desafío

Fácil
  1. Añade private Vector3 nextDirection = Vector3.right;, el giro que espera al siguiente paso.
  2. Escribe void Turn(Vector3 newDirection): establece nextDirection en newDirection, a menos que newDirection sea lo opuesto a direction.
  3. En Update(), cada tecla llama a Turn con su dirección en lugar de establecer direction.
  4. Al inicio de Step(), establece direction en nextDirection.

Pulsa Play e intenta girar hacia atrás; después, 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;

    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;
    }
}
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