Bez zawracania
Lekcja 3 z 14 w kursie Gra w Unity: Wąż 3D w Coddy.
Wąż, który skręca od razu z powrotem, wpada na własną szyję, dlatego skręt w przeciwną stronę jest ignorowany. Kierunek przeciwny to jego negacja: gdy wąż porusza się w prawo, -direction to Vector3.left.
Porównywanie z direction nie wystarcza, gdy naciśnięcie klawisza natychmiast zmienia kierunek: wąż porusza się w prawo, gracz naciska w górę, a potem w lewo, w trakcie jednego taktu. Ruch w górę jest dozwolony, a potem ruch w lewo jest sprawdzany względem kierunku w górę i również dozwolony, więc następny krok prowadzi z powrotem na szyję.
Dlatego przechowuj dwa kierunki: direction, czyli kierunek, w którym głowa poruszyła się ostatnio, oraz nextDirection, czyli skręt oczekujący na następny krok. Klawisz zmienia nextDirection po porównaniu z direction, a krok wprowadza oczekujący skręt w życie.
Wyzwanie
ŁatwyNie pozwól wężowi zawrócić prosto na własną szyję.
- Dodaj
private Vector3 nextDirection = Vector3.right;ivoid Turn(Vector3 newDirection): ustaw nextDirection, chyba żenewDirection == -direction. - W
Update()każde naciśnięcie klawisza wywołujeTurnz odpowiednim kierunkiem zamiast ustawiać direction. - Na początku
Step()ustawdirection = nextDirection;
Naciśnij „Graj” i naciśnij strzałkę w lewo, gdy wąż porusza się w prawo: wąż nadal porusza się w prawo. Następnie naciśnij „Sprawdź”.
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;
}
}
Wszystkie lekcje w sekcji Gra w Unity: Wąż 3D
Poćwicz samodzielnie: Edytor online Unity