Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Colpire un muro termina la partita.

  1. Aggiungi public int edge = 7; e public bool alive = true;
  2. 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.
  3. void Die() { alive = false; }; Update() inizia con if (!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