Piszemy RPGo-Platformówkę (3) – Wyginaj śmiało ciało!

Dorabiamy wielokrotne skoki oraz „bieganie”

Hej, dzisiejszy materiał jest poniekąd uzupełnieniem [Nauka chodzenia] i omawiany kod bazuje na commicie [2697751].

Dzisiaj umożliwimy graczowi skakanie oraz bieganie, w dalszych materiałach stworzymy sobie także odbijanie od ścian. Miłego czytania.

Wyginaj śmiało ciało!


Wielokrotne skoki

Zacznijmy od skoków, które będziemy mogli wykonać wiele razy. Sam mechanizm jest dość prosty do zaimplementowania, bo jest poniekąd zmianą warunku na umożliwienie pojedynczych skoków.

Ciekawostka: do tej pory gracz miał nieograniczoną liczbę skoków, więc mógł „latać”.

Ogólny algorytm takiego kodu może wyglądać następująco:

  1. Ustaw maksymalną ilość skoków, oraz ustaw na tą samą wartość ilość dostępnych skoków.
  2. Gdy gracz będzie chciał skoczyć: sprawdź czy ilość dostępnych skoków jest większa od 0:
    1. jeżeli jest większa: wykonaj skok i zmniejsz ilość dostępnych skoków o 1;
    2. w przeciwnym wypadku: nic nie rób.
  3. Jeżeli gracz dotknie ziemi to przywrócić mu maksymalną ilość skoków.

Jak widzimy, to jedyny problem może nam sprawić przywrócenie bazowej ilości skoków gdy gracz opadnie na ziemię (tzn. problemem jest wykrycie czy gracz jest na ziemi), ale tym zajmiemy się później.

Jak widzimy na kodzie powyżej doszły nam dwie zmienne, domyślnie postać może wykonać pojedynczy skok (jumpLimit), druga zmienna (m_availableJumps) mówi ile jeszcze graczowi pozostało skoków.

Kolejny listing do zmieniona funkcja Jump, która sprawdza czy gracz może wykonać skok, jeżeli tak to postępuje zgodnie z opisanym wcześniej algorytmem. Warty uwagi jest fakt, że resetujemy obecnie działające siły (grawitacji) na postać, tak aby skok faktycznie się odbył, a nie tylko np. zminimalizował prędkość upadku.

Tutaj mamy funkcję, którą wywołujemy w momencie gracz upadnie na ziemię. W moim przypadku zdecydowałem się stworzyć dodatkowy collider na graczu (z zaznaczoną opcją isTrigger), który w momencie zajścia wywoła mi powyższą metodę.

Co więcej zrealizowałem to na osobnym obiekcie, przez co stworzyłem klasę przekierowującą informacje o zdarzeniach tego typu poprzez wywołanie konkretnej funkcji. Prezentuje się ona następująco:

Jak widać, ta klasa to po prostu tablica delegatów uruchamianych na zajście kolizji. Ta klasa przyda nam się także później.

Powyżej widzimy początkowe ustawienie limitu skoków oraz funkcji resetującej ilość dostępnych skoków na kolizję z ziemią.

Jedynie co teraz należy zrobić, to zmienić limit dostępnych skoków, np na ‚2’, aby cieszyć się wielokrotnymi skokami.

Bieganie

Można to zrealizować na wiele sposobów, w jednym z najprostszych scenariuszy bieganie to zwiększenie k-razy bazowej prędkości, tak my też to zrealizujemy.

W tym celu musimy zmienić interfejs dla kontrolera, tak aby obsługiwał dodatkowy klawisz odpowiedzialny za skoki:

Sama implementacja jest trywialnie prosta:

W naszej grze żadna ze sztucznej inteligencji nie będzie potrafiła biegać, przynajmniej nie w ten sposób. Dlatego samo obsłużenie tego kodu odbędzie się w klasie Player:

Powyższa implementacja dodaje nowy parametr, decydujący o stopniu przyspieszenia, oprócz tego musieliśmy zmodyfikować metodę Move, która przy wciśnięciu przez gracza klawisza biegu (w naszym przypadku jest to lewy Shift) dodatkowo zwiększy prędkość gracza.

diff


W tym paragrafie chciałbym zwrócić uwagę na małą zmianę dotyczącą implementacji Unity. Mianowicie poprzednia implementacja sterowania przy użyciu klawiatury ma małe problemy i się lekko przycina. Obecnie próbuję znaleźć przyczynę i na ten czas aby nie blokować kolejnych części postanowiłem używać funkcji wbudowanej w Unity.

W momencie gdy uda mi się naprawić przyczynę tego problemu to w tym miejscu pojawi się odpowiednia notka i link do commita poprawiającego ten problem. To tak, żeby nie było że kogoś gdzieś oszukuję ;)

Podsumowanie


Dzisiaj wzbogaciliśmy grę o 2 nowe funkcjonalności oraz o 1 nową klasę, którą zaczniemy stosować szerzej w przyszłości.

To tyle jeżeli chodzi o dzisiejszy wpis, tradycyjnie zapraszam do systemu komentarzy, polubienia strony na fb, a także do „zagrania” ([wersja z tej lekcji]).

Do przeczytania w kolejnej części, w której zaimplementujemy sobie prosty system walki.

Code ON!