I muri
Lezione 4 di 14 del corso Gioco in Unity: Snake 3D di Coddy.
Le celle della scacchiera vanno da -7 a 7 sull'asse x e sull'asse z, quindi una cella è sulla scacchiera quando sia la sua x sia la sua z sono comprese tra -7 e 7. Con la scacchiera 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 vi si sposti. Così, quando il serpente colpisce un muro, resta sull'ultima cella della scacchiera invece di finire all'interno del bordo. Una torre su una scacchiera numerata da 0 a 7 viene controllata allo stesso modo:
Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
return; // fuori dalla scacchiera: la torre resta ferma
}
transform.position = target;Colpire un muro termina la partita e il serpente si ferma per sempre. A farlo è un bool che Update() controlla per primo: un return all'inizio salta sia i tasti sia il timer.
Sfida
Facile- Aggiungi
public int edge = 7;(le celle della griglia vanno da-edgeaedge) epublic bool alive = true;. - In
Step(), dopo aver impostatodirection, calcolanext, la cella in cui la testa sta per entrare. Se è fuori dalla griglia, chiamaDie()e restituisci il controllo senza muoverti; altrimenti sposta la testa innext. - Scrivi
void Die(), che impostaalivesu false. - All'inizio di
Update(), aggiungi un'istruzione return quando il serpente non è vivo, così un serpente morto non gira né avanza.
Premi Play, guida il serpente contro un muro, 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; // 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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.