Niente inversioni a U
Lezione 3 di 14 del corso Gioco in Unity: Snake 3D di Coddy.
Un serpente che gira subito all'indietro finisce contro il proprio collo, quindi una svolta nella direzione opposta a quella in cui si sta muovendo viene ignorata. La direzione opposta è il suo negativo: mentre il serpente si muove verso destra, -direction è Vector3.left.
Vector3 heading = Vector3.right;
Vector3 back = -heading; // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back; // trueConfrontare con direction non basta quando una pressione modifica subito direction. Mentre si muove verso destra, un giocatore preme su e poi sinistra all'interno di un singolo tick. Su è consentito. Sinistra viene quindi confrontata con su, la svolta che non è ancora avvenuta, e viene consentita anch'essa, così il passo successivo va a sinistra, tornando dritto sopra il collo.
La soluzione mantiene due direzioni. direction è la direzione in cui la testa si è mossa nell'ultimo passo; nextDirection è la svolta in attesa del passo successivo. Un tasto modifica nextDirection, ma solo dopo aver confrontato la svolta con direction; il passo inizia poi rendendo effettiva la svolta in attesa. Nel caso sopra, sinistra viene confrontata con destra, la direzione in cui la testa si sta davvero muovendo, e viene scartata.
Sfida
Facile- Aggiungi
private Vector3 nextDirection = Vector3.right;, la svolta in attesa del prossimo passo. - Scrivi
void Turn(Vector3 newDirection): impostanextDirectionsunewDirection, a meno chenewDirectionnon sia l'opposto didirection. - In
Update(), ogni tasto chiamaTurncon la sua direzione invece di impostaredirection. - All'inizio di
Step(), impostadirectionsunextDirection.
Premi Play e prova a tornare indietro, poi premi Check.
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.