Menu
CoddyTech

Trzy tory

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 27 z 60.

W tym rozdziale powstaje gra typu niekończący się biegacz. Biegacz pędzi drogą z trzema pasami i zmienia pasy, aby omijać nadciągające przeszkody. W kolejnych lekcjach droga będzie przyspieszać, na ekranie będzie wyświetlany przebyty dystans, zderzenie zakończy bieg, a przycisk pozwoli rozpocząć go ponownie, a najlepszy wynik zostanie zapisany. Biegacz nigdy nie porusza się do przodu: pozostaje w miejscu z = 0, a przeszkody przemieszczają się w jego stronę, więc droga nigdy się nie kończy. Gra ma cztery skrypty: Runner, Spawner, Obstacle i GameManager, a trzy ostatnie są na razie puste.

Biegaczem poruszającym się po pasach nie steruje się jak samochodem: zawsze znajduje się w jednym z kilku określonych miejsc. Zapisz to miejsce jako liczbę całkowitą, zmień tę liczbę po naciśnięciu klawisza i na jej podstawie oblicz pozycję. Platforma myjki do okien obsługuje pięć pięter budynku, oddalonych od siebie o 3 jednostki:

[SerializeField] private float floorHeight = 3f;
[SerializeField] private float moveSpeed = 6f;
private int floor = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.UpArrow)) floor++;
    if (Input.GetKeyDown(KeyCode.DownArrow)) floor--;
    floor = Mathf.Clamp(floor, 0, 4);

    Vector3 p = transform.position;
    p.y = Mathf.MoveTowards(p.y, floor * floorHeight, moveSpeed * Time.deltaTime);
    transform.position = p;
}

GetKeyDown sprawia, że jedno naciśnięcie oznacza przejazd o jedno piętro, podczas gdy GetKey dodawałoby piętro w każdej klatce, w której klawisz jest wciśnięty. Mathf.Clamp nie pozwala, by liczba wykraczała poza zakres pięter budynku, więc naciśnięcie strzałki w górę na najwyższym piętrze nic nie robi, a kolejne naciśnięcie strzałki w dół przenosi od razu na piętro 3. Mathf.MoveTowards przesuwa platformę w stronę piętra z prędkością moveSpeed jednostek na sekundę i zatrzymuje ją dokładnie na nim, zamiast przeskakiwać tam w jednej klatce. Pozycja jest kopiowana, zmieniana i przypisywana z powrotem, ponieważ nie można samodzielnie ustawić transform.position.y.

challenge icon

Wyzwanie

Średni

Spraw, aby strzałki przesuwały biegacza między trzema pasami.

  1. W metodzie Update() klasy Runner wykonaj lane-- po Input.GetKeyDown(KeyCode.LeftArrow), a po naciśnięciu prawej strzałki — lane++.
  2. Nie pozwól mu zjechać z drogi: lane = Mathf.Clamp(lane, -1, 1);.
  3. Skopiuj transform.position do p, przesuwaj p.x w kierunku lane * laneWidth za pomocą Mathf.MoveTowards z prędkością laneSpeed * Time.deltaTime, a następnie przypisz p z powrotem.

Naciśnij „Graj”, kliknij grę i zmieniaj pasy: biegacz będzie się przesuwać. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 15f;
    private int lane = 0;   // -1 to lewy pas, 0 środkowy, 1 prawy

    void Update()
    {
        // Zmieniaj pasy za pomocą strzałek, a następnie przesuwaj się w kierunku współrzędnej x wybranego pasa
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity