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 osiach x i z. Gdy plansza jest wyśrodkowana na 0, jeden test obejmuje obie strony: Mathf.Abs(x) > 7 jest prawdziwe poza którąkolwiek krawędzią.

Sprawdź pole, na które głowa ma zaraz wejść, zanim się tam przesunie, aby wąż, który uderzy w ścianę, pozostał na ostatnim polu zamiast kończyć ruch wewnątrz krawędzi. Na mniejszej planszy z krawędzią na 4:

Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;

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

challenge icon

Wyzwanie

Łatwy

Uderzenie w ścianę kończy grę.

  1. Dodaj public int edge = 7; i public bool alive = true;
  2. W Step(), po ustawieniu kierunku, dodaj Vector3 next = transform.position + direction;. Jeśli obiekt znajdzie się poza planszą (Mathf.Abs(next.x) > edge lub poza nią wzdłuż osi z): wywołaj Die() i zwróć sterowanie; w przeciwnym razie przesuń go do next.
  3. void Die() { alive = false; }; Update() zaczyna się od if (!alive) return;

Naciśnij „Graj” i skieruj węża na ścianę: zatrzyma się na ostatnim polu. 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;       // 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;
    }
}

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

Poćwicz samodzielnie: Edytor online Unity