Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Nie pozwól wężowi zawrócić prosto na własną szyję.

  1. Dodaj private Vector3 nextDirection = Vector3.right; i void Turn(Vector3 newDirection): ustaw nextDirection, chyba że newDirection == -direction.
  2. W Update() każde naciśnięcie klawisza wywołuje Turn z odpowiednim kierunkiem zamiast ustawiać direction.
  3. Na początku Step() ustaw direction = 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