Prefab – Player

Krótka notka do Interfejs programu i menu:
Możemy ustawić Render Mode MainMenu na Pixel Perfect aby wyostrzyć nasz obraz.

Dzisiaj do gry wchodzi (fanfary) Player One!.
Player Two pewnie się nigdy nie pojawi, ale zawsze warto mieć nadzieję 😐

Materials

Zawsze sobie tłumaczę, że tekstura to rysunek, a materiał to opis rysunku. Możemy mu wybrać z jakiego Shadera skorzystać – czy jest to prosta tekstura, czy składa się z kilku, itd… Nie wiem czy jest to dobre tłumaczenie, ale kiedyś o tym więcej poczytam.

Stwórzmy sobie nowy materiał w aplikacji i ustawmy mu Shader / Sprites / Default. Dzięki temu będzie to najprostszy możliwy materiał – wypełnienie kolorem. Ustawię mu jasno-zielony kolor, aby był dobrze widoczny. Materiał gotowy.

GameObject

Następna potrzebna nam rzecz to GameObject. Tworzy go się przez kliknięcie PPM w Hierarchy i wybranie Create Empty. Jest to po prostu pusty obiekt, posiadający jedynie component transform – określenie jego fizycznego położenia na scenie. Prawdopodobnie będzie miał dziwną pozycję X i Y, wyzerujmy mu ją.

Oś Z ustawmy „bliżej nas”, gdzie -10 to pozycja kamery, a my jesteśmy zerem 🙁 Chwilowo dałem u siebie -5. Zmienimy mu też nazwę na Player.

Nasz gracz właśnie wszedł do gry.

Mesh

Mesh to z angielskiego siatka. Tak naprawdę tworzymy tutaj dwie siatki.

Dodajemy component Mesh Filter do obiektu gracza. Będzie to zobrazowanie jego kształtu. Jako właściwość Mesh ustawmy Quad – będę z niego bardzo często korzystał, ponieważ jest to płaski kwadrat, do gry 2D wręcz idealny.

Drugim elementem, który musimy dodać jest Mesh Renderer. Umożliwi on nam render naszego gracza na ekranie. Jedyna, ale bardzo ważna rzecz tutaj, to rozwinięcie właściwości Materials i ustawienie Element 0 na stworzony przez nas materiał. Od tego momentu gracz powinien być widoczny na ekranie.

Rigidbody 2D

Kolejny komponent! Pod tą przyjemną nazwą kryje się fizyka. Ustawmy ją (a właściwie właściwość Gravity Scale) na 0, aby gracz nie spadł z ekranu.

Grawitacja jest nam niepotrzebna, bo kamera będzie widziała gracza od góry.

(Fixed?) Update

Aktualizacja w Unity odbywa się przeważnie na dwa sposoby.

Obliczenia fizyczne powinno się robić w funkcji FixedUpdate, która wykonuje się zawsze określoną ilość razy na sekundę (domyślnie jest to 50, czyli co 0.02s).

Sam Update() jest chyba zależny od sprzętu gracza i to w tym miejscu powinniśmy robić wszystko inne (rysowanie, dźwięki itd.). Może być różny (u mnie coś pomiędzy 0.01 a 0.04-5s) i dlatego nie powinno się nic tu przeliczać. Przecież gra nie powinna chodzić szybciej na szybszych kompach.

Polecam rzucić okiem na przerażający cykl życia aplikacji Unity:

Ruch gracza

No wreszcie można napisać kawałek kodu. Nie zamierzam go tłumaczyć, ponieważ staram się, aby był jak najbardziej czytelny. Z tych ciekawszych rzeczy – Unity ma wbudowane sterowanie w Edit / Project Settings / Input i żal by było nie skorzystać. We wspomnianym miejscu można sprawdzić, bądź zmienić klawisze. Funkcja Input.GetAxis zwraca wartość z zakresu -1.0f a +1.0f, w zależności od siły/czasu nacisku odpowiedniego guzika przez gracza.

Skrypt to kolejny komponent, który podpinamy pod obiekt Player. Nazwałem go PlayerMovement, ponieważ staramy się tworzyć jak najmniejsze klasy.

Musimy też zablokować opcję wyjechania poza ekran, ale o tym jutro.

Prefab

Jeśli upewniliśmy się, że wszystko działa, stwórzmy w końcu ten magiczny Prefab. Jest to po prostu obiekt wraz z przypisanymi komponentami.

Tworzy się go przeciągając obiekt z zakładki Hierarchy do Project. W ten sposób stworzyliśmy sobie backup gracza, jeśli coś byśmy zepsuli.

W przyszłości prefaby okażą się bezcenne. Będziemy mogli utworzyć wzór przeciwnika (ze wszystkimi componentami) i generować od ręki dziesiątki wrogów!