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; // truePoró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.
Wyzwanie
Łatwy- Dodaj
private Vector3 nextDirection = Vector3.right;, czyli skręt oczekujący na następny krok. - Napisz
void Turn(Vector3 newDirection): ustawianextDirectionnanewDirection, chyba żenewDirectionjest przeciwieństwemdirection. - W
Update()każdy klawisz wywołujeTurnz odpowiednim kierunkiem, zamiast ustawiaćdirection. - Na początku
Step()ustawdirectionnanextDirection.
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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.