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; // trueComparar 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.
Desafío
Fácil- Añade
private Vector3 nextDirection = Vector3.right;, el giro que espera al siguiente paso. - Escribe
void Turn(Vector3 newDirection): establecenextDirectionennewDirection, a menos quenewDirectionsea lo opuesto adirection. - En
Update(), cada tecla llama aTurncon su dirección en lugar de establecerdirection. - Al inicio de
Step(), establecedirectionennextDirection.
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.