Menu
CoddyTech

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.

challenge icon

Sfida

Facile
  1. Aggiungi public int edge = 7; (le celle della griglia vanno da -edge a edge) e public bool alive = true;.
  2. In Step(), dopo aver impostato direction, calcola next, la cella in cui la testa sta per entrare. Se è fuori dalla griglia, chiama Die() e restituisci il controllo senza muoverti; altrimenti sposta la testa in next.
  3. Scrivi void Die(), che imposta alive su false.
  4. 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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco in Unity: Snake 3D