Menu
CoddyTech

Ściany

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

Pola planszy obejmują zakres od -7 do 7 na osi x i na osi z, więc pole znajduje się na planszy, gdy zarówno jego x, jak i z mieszczą się w przedziale od -7 do 7. Gdy plansza jest wyśrodkowana na 0, jeden test obejmuje obie strony: Mathf.Abs(x) > 7 ma wartość true poza dowolną krawędzią.

Sprawdź pole, na które głowa ma zaraz wejść, zanim się tam przesunie. Wtedy wąż, który uderzy w ścianę, pozostanie na ostatnim polu planszy, zamiast znaleźć się wewnątrz krawędzi. Wieżę na szachownicy z polami ponumerowanymi od 0 do 7 sprawdza się w ten sam sposób:

Vector3 target = transform.position + move;
if (target.x < 0 || target.x > 7 || target.z < 0 || target.z > 7)
{
    return;   // poza planszą: wieża pozostaje na miejscu
}
transform.position = target;

Uderzenie w ścianę kończy grę, a wąż zatrzymuje się na dobre. Zrobi to zmienna typu bool, którą Update() sprawdza jako pierwszą: instrukcja return na początku pomija zarówno klawisze, jak i timer.

challenge icon

Wyzwanie

Łatwy
  1. Dodaj public int edge = 7; (komórki planszy rozciągają się od -edge do edge) i public bool alive = true;.
  2. W Step(), po ustawieniu direction, wyznacz next — komórkę, na którą głowa zaraz wejdzie. Jeśli znajduje się poza planszą, wywołaj Die() i zakończ działanie bez ruchu; w przeciwnym razie przesuń głowę do next.
  3. Napisz void Die(), która ustawia alive na false.
  4. Rozpocznij Update() od zwrócenia sterowania, gdy wąż nie żyje, aby martwy wąż ani nie skręcał, ani się nie poruszał.

Naciśnij Play, skieruj węża na ścianę, 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;       // kierunek, w którym głowa poruszyła się w ostatnim kroku
    private Vector3 nextDirection = Vector3.right;   // skręt oczekujący na następny krok

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Turn(Vector3 newDirection)
    {
        if (newDirection != -direction)
        {
            nextDirection = newDirection;
        }
    }

    void Step()
    {
        direction = nextDirection;
        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