Podsumowanie

W tworzonym w tej serii e‑materiałów projekcie gry uwzględniliśmy już pewne przeszkody i wyzwania dla gracza. Jego zadaniem jest przeprowadzenie postaci przez wszystkie platformy i przejście do kolejnego poziomu. W trakcie gry może się zdarzyć, że bohater straci życie i odrodzi się na początku poziomu. Dzieje się tak, gdy spadnie z platformy lub wejdzie na przeszkodę. Aby jeszcze bardziej utrudnić rozrywkę, dodajmy do niej przeciwników. Będą oni poruszać się po platformach, a kolizja z nimi spowoduje przerwanie rozgrywki i powrót na początek poziomu.

Przeciwnicy w grze

Tworzenie przeciwników (jak i w przypadku innych obiektów) rozpoczynamy od dodania i przygotowania tekstury. Następnie opracowujemy podstawową animację (proces ten został opisany w e‑materiale Animacje i przejścia między nimi – Unity Hub, etap IIIP1FuGOm8WAnimacje i przejścia między nimi – Unity Hub, etap III.

Przeciwnik ma poruszać się po platformie – dochodzić do jej końca i zawracać. Potrzebujemy rozwiązania, dzięki któremu zarejestrowany zostanie moment, w którym obiekt ma zawrócić. Aby wykryć, czy przeciwnik znajduje się na końcu platformy, dodamy do niego kolejny obiekt (dziecko) pełniący rolę detektoradetektordetektora.

Ważne!

Unity Hub można zastosować rozwiązanie, w którym jeden obiekt zawiera w sobie inne. Mówimy wtedy, że jest rodzicem, a między obiektami zachodzi relacja parent‑child (ang. rodzic‑dziecko).

Ustalamy pozycję detektora – chcemy, by znajdował się on tuż nad ziemią przed rodzicem.

Klatki przedstawiające ruch (animację) oposa:

RJdGzeOXsJIQ9

Skrypt przeciwnika

Tworzymy nowy skrypt, w którym zaimplementujemy ruch przeciwnika. Należy w nim uwzględnić zmienne:

  • szybkość – aby można było ją edytować w obszarze Inspector okna programu Unity Hub, zmiennej nadajemy atrybut SerializedField;

  • detektor – zmienna będzie przechowywać pozycję, rotację i skalę detektora.

Niezbędne jest stworzenie funkcji odpowiedzialnej za obrót przeciwnika. Powinna ona uruchamiać się, gdy przeciwnik dojdzie do końca platformy.

Aby obrócić teksturę postaci przeciwnika, korzystamy z wartości localScale na osi x i mnożymy ją razy -1. Kierunek ruchu przeciwnika odwracamy, mnożąc jego szybkość przez -1.

Do aktualizacji położenia przeciwnika używamy funkcji translate, która przyjmuje trzy parametry: odległości na osi x, y i z. Nie przesuwamy przeciwnika na osiach y i z. Natomiast położenie na osi x wyznaczamy, mnożąc wartość szybkości razy Time.deltaTime.

Funkcja Time.deltaTime określa czas, jaki upływa między jedną klatką gry a drugą. Powoduje ona, że przesuwamy przeciwnika tak samo szybko na wszystkich urządzeniach, niezależnie od tego, jakiej klasy jest to sprzęt. Gdybyśmy pominęli tę funkcję, to na komputerze starszej generacji przeciwnik poruszałby się bardzo wolno, a na nowszym, mocnym komputerze – bardzo szybko.

Aby sprawdzić, czy przeciwnik dotarł do końca platformy (tym samym – powinien nastąpić obrót), należy użyć funkcji RaycastHit2D, która działa podobnie do wywoływanej wcześniej funkcji BoxCast (została omówiona w e‑materiale Implementacja skoku postaci – Unity Hub, etap IIP7fG3v9f5Implementacja skoku postaci – Unity Hub, etap II. Funkcja RaycastHit2D sprawdza, czy obiekt koliduje z wybraną warstwą, nie używa do tego jednak pudełka, a padającego w dół promienia. W tym celu należy zadeklarować zmienną przyjmującą następujące parametry:

  • pozycję początku promienia – chcemy, aby była to pozycja detektora;

  • kierunek – używamy tu wbudowanej funkcji Unity – Vector2.down, która zwraca wektor skierowany w dół;

  • długość – niewielka wartość, jednak gwarantująca sięgnięcie do platformy, powinna być ona typu float.

Jeśli promień nie wejdzie w kolizję z platformą, to dotarliśmy do jej końca i należy uruchomić funkcję odpowiedzialną za odwrócenie obiektu przeciwnika.

Skrypt oposa:

Linia 1. using System kropka Collections średnik. Linia 2. using System kropka Collections kropka Generic średnik. Linia 3. using UnityEngine średnik. Linia 5. public class Opos dwukropek MonoBehaviour. Linia 6. otwórz nawias klamrowy. Linia 7. otwórz nawias kwadratowy SerializeField zamknij nawias kwadratowy private float szybkosc średnik. Linia 8. public Transform detektor średnik. Linia 10. prawy ukośnik prawy ukośnik Start is called before the first frame update. Linia 11. void Start otwórz nawias okrągły zamknij nawias okrągły. Linia 12. otwórz nawias klamrowy. Linia 14. zamknij nawias klamrowy. Linia 16. prawy ukośnik prawy ukośnik Update is called once per frame. Linia 17. void Update otwórz nawias okrągły zamknij nawias okrągły. Linia 18. otwórz nawias klamrowy. Linia 20. RaycastHit2D promien znak równości Physics2D kropka Raycast otwórz nawias okrągły detektor kropka position przecinek Vector2 kropka down przecinek 0 kropka 2f zamknij nawias okrągły średnik. Linia 22. if otwórz nawias okrągły promien kropka collider znak równości znak równości false zamknij nawias okrągły. Linia 23. otwórz nawias klamrowy. Linia 24. Obroc otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. transform kropka Translate otwórz nawias okrągły szybkosc asterysk Time kropka deltaTime przecinek 0 przecinek 0 zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 31. private void Obroc otwórz nawias okrągły zamknij nawias okrągły. Linia 32. otwórz nawias klamrowy. Linia 33. transform kropka localScale znak równości new Vector2 otwórz nawias okrągły transform kropka localScale kropka x asterysk minus 1 przecinek transform kropka localScale kropka y zamknij nawias okrągły średnik. Linia 34. szybkosc asterysk znak równości minus 1 średnik. Linia 35. zamknij nawias klamrowy. Linia 36. zamknij nawias klamrowy.

Kolizja bohatera gry z przeciwnikiem

Chcemy, aby przeciwnik wpływał na bohatera gry – jeśli się zderzą, postać traci życie i wraca na początek poziomu. W tym celu dodajemy kolizję – możemy ułatwić sobie zadanie, korzystając z rozwiązania opisanego w e‑materiale Przerywanie rozgrywki, odradzanie postaci i awans do kolejnego poziomu – Unity Hub, etap VP5wUaQCYbPrzerywanie rozgrywki, odradzanie postaci i awans do kolejnego poziomu – Unity Hub, etap V – dodajemy tagtagtag pułapki i komponent Box Collider 2D.

Kopie tak stworzonego przeciwnika możemy umieścić na wielu platformach, stosując prefabyprefabprefaby omawiane w e‑materiale Prefaby i ruch kamery – Unity Hub, etap IVPMjRa72Q3Prefaby i ruch kamery – Unity Hub, etap IV.

Nauczysz się

W następnej części serii e‑materiałów dotyczących tworzenia gry w Unity Hub zajmiemy się punktowanymi elementami, które gracz będzie zbierał, a ich suma będzie wyświetlana na ekranie. W ostatnim e‑materiale naprawimy ewentualne błędy i wyeksportujemy projekt, aby móc przekazać go graczom.

Słownik

detektor
detektor

urządzenie lub rozwiązanie służące do wykrywania (detekcji) parametrów fizycznych, zjawisk, obiektów; w przypadku gry rozwiązanie służące do wykrycia określonego położenia obiektu

prefab
prefab

rodzaj zasobu, którego instancje można wykorzystywać wielokrotnie w projekcie; jeśli zajdą zmiany w prefabie, Unity automatycznie wprowadzi je we wszystkich jego instancjach

tag
tag

słowo referencyjne, które można przypisać do jednego lub większej liczby obiektów; tagi pomagają zidentyfikować obiekty do celów skryptowych