Untitled
Transkrypt
Untitled
Zakładam, że Ty, osobo czytająca tę instrukcję, potrafisz już wstawiać obiekty oraz narysować teren w Unity. A więc, bez zbędnego gadania, do skryptowania! Krok 1. Wstawić obiekt – będzie to postać gracza. Krok 2. Dodać graczowi komponent „Script” Po kliknięciu „Add Component” należy wybrać „New Script”, a potem wpisać wybraną nazwę skryptu. Możliwe jest też wybranie języka w jakim skrypt będzie pisany (C#, JavaScript). Ta instrukcja będzie napisana w oparciu o C#. W oknie „Assets” powinien pojawić się nowy plik – jest to nasz skrypt. Krok 3. Otworzyć skrypt – domyślnie Unity używa MonoDevelop, a uruchomienie go może chwilę zająć. Krok 4. Świeżo utworzony skrypt składa się z jednej klasy (o nazwie takiej, jak plik) oraz dwóch funkcji: Start oraz Update. Funkcja Start jest wywoływana jeden raz, na początku gry. Update wywoływane jest co klatkę. Więcej informacji tutaj: http://docs.unity3d.com/Manual/ExecutionOrder.html Krok 5. Piszemy skrypt! Na początek chcemy, aby kamera podążała za graczem. Stwórzmy więc zmienną publiczną klasy Camera o nazwie, na przykład, camera. Krok 6. Załóżmy, że chcemy aby kamera latała za plecami gracza – trochę z tyłu, trochę nad nim. Pozycją kamery będzie więc: pozycja gracza – kierunek przodu gracza + kierunek góry gracza Sama zmiana pozycji to jednak za mało, trzeba skierować obiektyw w odpowiednim kierunku. Zróbmy więc skrypt podobny do: Ale chwila! Skąd wiadomo, której kamery używać? Musimy powiedzieć skryptowi skąd ją wziąć. W Unity w komponencie „Script” pojawiło się nowe pole: Camera. Aż się prosi, żeby chwycić nazwę kamery z okna „Hierarchy” (po lewej, lista obiektów na scenie) i przeciągnąć ją nad to pole. Puf, czary zakończone, skrypt już wie którego obiektu używać. Można odpalić grę. Krok 7. Kamera skacze? Nie dziwne – najpierw ustawiamy ją na obiekt, a potem go przesuwamy. Co więc zrobić? Zamienić kolejność! Co więc zrobić, aby było jeszcze lepiej? Użyć funkcji LateUpdate! Krok 8. Kamera już działa, pora więc zrobić jakiś sensowniejszy ruch postaci. Obiekt transform przechowuje wszystkie informacji o orientacji postaci w przestrzeni: położenie, obrót, wielkość. Zmienna position jest wektorem opisującym położenie postaci. Chcąc zmusić postać do chodzenia, musimy ją zmodyfikować – dodajmy do pozycji transform.forward – kierunek „przód” naszego obiektu. A co robi to tajemnicze Time.deltaTime? To czas, jaki upłynął między kolejnymi wywołaniami Update. Czy jest stały? Może tak, może nie – to w dużym stopniu zależy od mocy komputera użytkownika. Czemu mnożymy kierunek przez czas deltaTime? Żeby gracze z wolniejszymi komputerami (mający automatycznie większe wartości deltaTime) nie poruszali się wolniej od graczy z komputerami wyposażonymi w 5 kart graficznych (u których Update będzie wywoływane częściej). Jeszcze jedna rzecz, której pewnie da się domyślić – Input.GetKey() to funkcja zwracająca prawdę jeśli podany klawisz jest wciśnięty. Udało się przedrzeć przez pierwsze cztery linie, pora więc zrobić obrót postaci: transform ma funkcję Rotate, do która oczekuje podania jak bardzo obiekt ma się obrócić. Ot, cała magia. Krok 9. Nasz gracz może już się poruszać. Stwierdzamy jednak, że zamiast Duke Nukem Forever 2 chcemy zrobić Diablo 4. Potrzebujemy więc zrobić ruch przy pomocy myszy. Gracz klika gdzieś na ekranie, a postać tam idzie. Jeśli przycisk myszy jest wciśnięty (linia 31) wystrzeliwujemy promień sprawdzający kolizje z obiektami na swej drodze. Zanim jednak to zrobimy, musimy przeliczyć pozycję myszy na ekranie (Input.mousePosition) na pozycję w świecie gry. Trafiliśmy w coś, więc zapiszmy pozycję tego czegoś (hit.point) w nowej zmiennej naszej klasy: Vector3 targetPosition. Gdy postać jest daleko od tego punktu, to przesuńmy ją powoli w jego stronę (linia 28). Krok 10. O ile wszystko poszło zgodnie z planem, to mamy postać ‘biegającą’ po mapie. Cóż to jednak za Hack’n’Slash bez broni? Dajmy więc graczowi możliwość strzelania pociskami. Dodajmy na scenę jakiś obiekt – na przykład kostkę. Co się stanie, gdy przeciągniemy jego nazwę z okna „Hierarchy” do okna „Assets”? Po pierwsze zmienimy jego nazwę w „Hierarchy” na niebieską, a po drugie utworzymy taki twór jak prefab: http://docs.unity3d.com/Manual/Prefabs.html Wracając do strzelania: dodajmy do klasy nową zmienną publiczną, typu GameObject o nazwie na przykład bullet. Ponownie, jak przy kamerze, musimy jakiś obiekt podpiąć do tej zmiennej. Przeciągnijmy naszą cudną kostkę z okna „Assets” na pole Bullet – od teraz jest to pocisk, którym strzelać będzie gracz. Pora na pisanie - po wciśnięciu spacji chcemy wystrzelić pocisk: Póki wciśnięta jest spacja, tworzona jest kopia obiektu zapisanego w zmiennej bullet oraz ustawiana jest mu pozycja i obrót postaci gracza. Jest jeden problem – pociski się nie ruszają. Co więc należy zrobić? Zmusić studentów do samodzielnej pracy! Zadanie 1. Utworzyć skrypt poruszający pociskami. Zadanie 2. Sprawić, że postać obraca się w kierunku w którym idzie (albo przynajmniej sama kamera, ale postać chyba łatwiej obrócić). Zadanie 3. Dać postaci pochodnię (obiekt z komponentem „Light”, któremu ustawiana będzie pozycja w okolicach czegoś, co można będzie uznać za rękę postaci) Zadanie 4. Jeśli ktoś tego nie zrobił, to zmodyfikować skrypt pocisków tak, aby były niszczone po jakimś czasie (funkcja Destroy).