Vietato fare inversione
Lezione 3 di 14 del corso Gioco Unity: Snake 3D di Coddy.
Un serpente che gira tornando indietro in linea retta finisce per urtare il proprio collo, quindi una svolta nella direzione opposta viene ignorata. L’opposto di una direzione è il suo negativo: mentre il serpente si muove verso destra, -direction è Vector3.left.
Confrontare con direction non basta se una pressione la cambia subito: mentre si muove verso destra, il giocatore preme prima su e poi a sinistra, tutto all’interno di un singolo tick. La direzione verso l’alto è consentita, poi quella verso sinistra viene confrontata con quella verso l’alto ed è consentita anch’essa, e il passo successivo riporta il serpente sul proprio collo.
Quindi conserva due direzioni: direction, la direzione in cui si è mossa la testa per ultima, e nextDirection, la svolta in attesa del passo successivo. Un tasto cambia nextDirection dopo averla confrontata con direction, e il passo rende effettiva la svolta in attesa.
Sfida
FacileImpedisci al serpente di tornare indietro dritto verso il collo.
- Aggiungi
private Vector3 nextDirection = Vector3.right;evoid Turn(Vector3 newDirection): imposta nextDirection a meno chenewDirection == -direction. - In
Update(), ogni tasto chiamaTurncon la propria direzione invece di impostare direction. - All'inizio di
Step(), impostadirection = nextDirection;
Premi «Gioca» e premi sinistra mentre ti muovi verso destra: il serpente continua ad andare verso destra. Poi premi «Verifica».
Provalo tu
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // secondi tra due passi
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;
}
}
Tutte le lezioni di Gioco Unity: Snake 3D
Esercitati da solo: Playground Unity