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.
Desafío
FácilEvita que la serpiente dé la vuelta y se dirija directamente hacia su cuello.
- Añade
private Vector3 nextDirection = Vector3.right;yvoid Turn(Vector3 newDirection): asigna nextDirection, a menos quenewDirection == -direction. - En
Update(), cada tecla llama aTurncon su dirección en lugar de asignar direction. - Al inicio de
Step(), asignadirection = 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