Menu
CoddyTech

Zakaz zawracania

Lekcja 3 z 14 w kursie Gra w Unity: Wąż 3D w Coddy.

Wąż, który skręca bezpośrednio w przeciwnym kierunku, wpada na własną szyję, dlatego skręt w przeciwną stronę niż ta, w którą się porusza, jest ignorowany. Przeciwny kierunek to jego wartość ujemna: gdy wąż porusza się w prawo, -direction to Vector3.left.

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

Porównywanie z direction nie wystarczy, gdy naciśnięcie klawisza natychmiast zmienia direction. Gracz porusza się w prawo, naciska w górę, a następnie w lewo podczas jednego taktu. Kierunek w górę jest dozwolony. Następnie kierunek w lewo jest sprawdzany względem kierunku w górę — skrętu, który jeszcze się nie wydarzył — i również dozwolony, więc następny krok prowadzi w lewo, prosto na szyję.

Rozwiązanie polega na przechowywaniu dwóch kierunków. direction wskazuje kierunek, w którym głowa poruszyła się podczas ostatniego kroku; nextDirection to skręt oczekujący na następny krok. Klawisz zmienia nextDirection, ale dopiero po porównaniu skrętu z direction, a krok zaczyna się od wprowadzenia oczekującego skrętu w życie. W opisanym przypadku kierunek w lewo jest porównywany z kierunkiem w prawo, w którym głowa faktycznie się porusza, i odrzucany.

challenge icon

Wyzwanie

Łatwy
  1. Dodaj private Vector3 nextDirection = Vector3.right;, czyli skręt oczekujący na następny krok.
  2. Napisz void Turn(Vector3 newDirection): ustawia nextDirection na newDirection, chyba że newDirection jest przeciwieństwem direction.
  3. W Update() każdy klawisz wywołuje Turn z odpowiednim kierunkiem, zamiast ustawiać direction.
  4. Na początku Step() ustaw direction na nextDirection.

Naciśnij Play i spróbuj zawrócić, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // sekundy między dwoma krokami
    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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Wąż 3D