I muri
Lezione 4 di 14 del corso Gioco Unity: Snake 3D di Coddy.
Le celle della griglia vanno da -7 a 7 sull'asse x e sull'asse z. Poiché la griglia è centrata su 0, un solo controllo copre entrambi i lati: Mathf.Abs(x) > 7 è vero oltre entrambi i bordi.
Controlla la cella in cui la testa sta per entrare, prima che si sposti lì, così un serpente che colpisce un muro resta nell'ultima cella invece di finire dentro il bordo. Su una griglia più piccola, con bordo 4:
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;Colpire un muro ferma il serpente definitivamente. A questo serve un bool che Update() controlla per primo: un return all'inizio salta sia i tasti sia il timer.
Sfida
FacileColpire un muro termina la partita.
- Aggiungi
public int edge = 7;epublic bool alive = true; - In
Step(), dopo aver impostato la direzione,Vector3 next = transform.position + direction;. Fuori dal tabellone (Mathf.Abs(next.x) > edge, oppure z):Die()e return; altrimenti spostati su next. void Die() { alive = false; };Update()inizia conif (!alive) return;
Premi «Gioca» e guida il serpente contro un muro: si ferma sull'ultima casella. 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; // la direzione in cui si è mossa la testa nell'ultimo passo
private Vector3 nextDirection = Vector3.right; // la svolta in attesa del prossimo passo
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
transform.position += direction;
}
}
Tutte le lezioni di Gioco Unity: Snake 3D
Esercitati da solo: Playground Unity