Menu
CoddyTech

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;   // true

Confrontare 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.

challenge icon

Sfida

Facile
  1. Aggiungi private Vector3 nextDirection = Vector3.right;, la svolta in attesa del prossimo passo.
  2. Scrivi void Turn(Vector3 newDirection): imposta nextDirection su newDirection, a meno che newDirection non sia l'opposto di direction.
  3. In Update(), ogni tasto chiama Turn con la sua direzione invece di impostare direction.
  4. All'inizio di Step(), imposta direction su nextDirection.

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;
    }
}
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