PEW PEW PEW #2

Napisałem bardzo ładny i uniwersalny ‚damage handler’. Odpalam grę. Hmm, coś jest nie tak… czemu gracz przestał strzelać? No nic, wypróbujmy zderzenie gracza z przeciwnikiem… Object Pool ze spawnerem też siadły. Raz zabity wróg przestał się pojawiać co 5s po raz kolejny. AAAAAAH 👿

Ratunku

Cofnijmy się o 24 godziny. Wracam z pracy, jest środa wieczór. Zresztą jak co tydzień tego dnia – praca do późna (bo spotkanie z Muricą). Oczy bolą, ale terminy gonią. Ustawiam pod Alt+TAB Visual Studio z Chromem, na którym leci Liga Mistrzów – Juve vs Bayern. Z poziomu VS spogląda na mnie HandleDamage.cs. 15 minut i gotowe. Zadziwiająco szybko. A jeszcze odpalę dla pewności, że nic nie zepsułem i wrzucam posta. Zepsułem. Wszystko.

Usiadłem do tego samego problemu dzisiaj, na spokojnie. Mija 5 minut. Gdzie jest tworzony obiekt pocisku? Na pozycji gracza, który to zadaje obrażenia przy kontakcie z innym obiektem. Wyszło na to, że laser strzelał w bohatera 😐 We wpisie o kolizjach pisałem o Collision Matrix. Dodanie warstwy PlayerBullet i odznaczenie checkboxa w tym miejscu naprawiło jeden problem. Zostało 98.

SetActive(false)

Przy Object Pool zasada jest prosta – inicjalizujemy obiekty jako nieaktywne, aż do momentu gdy potrzebujemy z nich skorzystać. Wtedy zmieniamy active na true, przy usuwaniu znowu na false (i tak wkoło Macieju). Kolega opowiadał mi kiedyś o SharePoint’owym piekle, w którym jest 6 rodzajów bólu. TRUE, True, true, FALSE, False, false – każdy z nich znaczy co innego. Może Unity jest źle napisane, a może mnie po prostu nie lubi?

Po chwili zastanowienia się, wiedziałem co jest nie tak. Wróg był inicjalizowany z HP = 1.0f. Jeśli życie osiągnęło poziom 0.0f to był dezaktywowany. Fizycznie – używamy tych samych obiektów, czyli przy ponownej aktywacji posiadają 0.0f i po upływie 1 klatki są dezaktywowane. Chwila roboty i problem rozwiązany.

Ustawienia początkowe obiektu powinniśmy tworzyć w funkcji OnEnable();
Jest ona zawsze wywoływana zaraz po SetActive(true);

Problem goni problem

Mogę wlecieć we wroga i go zniszczyć. Mnie natomiast potrafi zabić 10 przeciwników i po kolizji z nimi gra przenosi do menu (logika tymczasowa). Tylko trochę głupia sprawa, że moje pociski nic nie robią nieprzyjacielskim statkom 🙁 Pewnie jakiś problem z BoxCollider2D, bo chciałem sobie stworzyć podwójny strzał.

Sprawa ta jest dość skomplikowana – jeśli trafi go jeden pocisk to powinien zadać połowę obrażeń – zostawię temat na posta PEW PEW PEW #3

W Unity możemy tworzyć GameObjecty jako drzewka, mój BulletDual korzysta z tego mechanizmu, ale źle. Przy okazji rozwiązać będzie można następny błąd – możliwość zabijania przeciwników, którzy nie wlecieli jeszcze na ekran.

Chwilowo stworzyłem prosty prefab BulletTall, podłużny laserek.

Naprawiony skrypt

Oto w jaki sposób wygląda HandleDamage wrzucony do repo: