Tytuł oryginału: Unity 3.x Game Development Essentials
Tłumaczenie: Jacek Janusz
ISBN: 978-83-246-3984-7
Copyright © Packt Publishing 2011.
First published in the English language under the title „Unity 3.x Game Development Essentials”.
Polish edition copyright © 2012 by Helion S.A.
All rights reserved.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie
ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji
zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/prgun3
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
•
Kup książkę
•
Poleć książkę
•
Oceń książkę
•
Księgarnia internetowa
•
Lubię to! » Nasza społeczność
Spis tre"ci
Przedmowa
9
O autorze
11
O recenzentach
12
Wst#p
15
Rozdzia$ 1. Odkryj trzeci wymiar
21
Zapoznanie si# z podstawami grafiki 3D
21
Wspó rz!dne
22
Przestrze" modelu i przestrze" %wiata
22
Wektory
23
Kamery
24
Wielok&ty, kraw!dzie, wierzcho ki i siatki
25
Materia y, tekstury i procedury cieniowania
28
Fizyka bry$y sztywnej
29
Wykrywanie kolizji
29
Podstawowe poj#cia zwi%zane ze "rodowiskiem Unity
30
Metoda Unity — przyk ad
31
Zasoby
32
Sceny
32
Obiekty gry
32
Komponenty
33
Skrypty
33
Prefabrykaty
34
Interfejs
35
Widoki Scene i Hierarchy
36
Panel Inspector
38
Kup ksi
ąĪkĊ
Pole
ü ksiąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
4
Okno Project
39
Widok Game
40
Podsumowanie
40
Rozdzia$ 2. Podstawy tworzenia prototypów i skryptów
43
Twój pierwszy projekt w "rodowisku Unity
44
Podstawowe "rodowisko prototypowe
45
Definiowanie sceny
46
Dodawanie prostego o%wietlenia
47
Kolejna ceg a w %cianie
48
Zbuduj i zniszcz!
52
Wprowadzenie do tworzenia skryptów
53
Nowy skrypt definiuj&cy zachowanie lub klas!
53
Jak wygl&da od %rodka dzia anie skryptu w j!zyku C#?
54
Jak wygl&da od %rodka dzia anie skryptu w j!zyku JavaScript?
56
Atakowanie %ciany
57
Deklarowanie zmiennych publicznych
58
Zrozumienie zasady dzia$ania polecenia Translate
62
Implementacja funkcji Translate
63
Testujemy bie&%c% wersj# gry
64
Tworzenie pocisku
65
Przechowywanie obiektów jako prefabrykatów
67
Wystrzelenie pocisku
68
U&ycie funkcji Instantiate() do konkretyzowania obiektów
68
Przy o*enie wektora si y do bry y sztywnej
69
Podsumowanie
71
Rozdzia$ 3. Tworzenie "rodowiska
73
Projektowanie gry
73
U&ycie edytora terenu
75
Opcje menu terenu
76
Narz!dzie edycji terenu
78
Tworzenie wyspy — s o"ce, morze i piasek
83
Podsumowanie
101
Rozdzia$ 4. Postacie w grze i dalsze wykorzystanie skryptów
103
U&ycie panelu Inspector
104
Znaczniki
105
Warstwy
106
Prefabrykaty i panel Inspector
106
Anatomia postaci
107
Dekonstrukcja obiektu First Person Controller
107
Relacje mi!dzy obiektami nadrz!dnymi i podrz!dnymi
109
Obiekt First Person Controller
109
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Spis tre"ci
5
Dalsze wykorzystanie skryptów
119
Polecenia
119
Zmienne
120
Kompletny przyk$ad
123
Funkcje
123
Tworzenie w asnych funkcji
125
Deklarowanie w asnej funkcji
127
Polecenie if else
129
Warunki wielokrotne
131
Komunikacja mi#dzyskryptowa oraz sk$adnia z kropk%
133
Dost!p do innych obiektów
133
Find() i FindWithTag()
133
SendMessage()
134
GetComponent
135
Komentarze
138
Skrypt wykonuj%cy operacj# poruszania postaci%
139
Analiza skryptu
139
Deklaracje zmiennych
140
Podsumowanie
145
Rozdzia$ 5. Interakcje
147
Zewn#trzne aplikacje modeluj%ce
147
Ogólne ustawienia modeli
148
Meshes
148
Normals and Tangents
149
Materials
150
Animations
150
Animation Compression
151
Definiowanie modelu placówki
151
Dodawanie placówki
152
Ustalenie po o*enia
153
Obrót
153
Dodanie zderzaczy
154
Dodanie komponentu Rigidbody
156
Dodanie d.wi!ku
156
Wy &czenie automatycznej animacji
156
Kolizje i wyzwalacze
157
Rzucanie promieni
160
Zgubienie klatki
161
Wykrywanie zderzenia z przewidywaniem
162
Otwieranie drzwi placówki
163
Metoda 1. Wykrywanie kolizji
164
Metoda 2. Rzucanie promieni
179
Metoda 3. Wykrywanie kolizji wyzwalaj&cej
185
Podsumowanie
189
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
6
Rozdzia$ 6. Kolekcja, inwentarz i HUD
191
Tworzenie prefabrykatu ogniwa energetycznego
194
Pobieranie, importowanie i umieszczanie
194
Identyfikacja ogniwa energetycznego
195
Skalowanie i obrót zderzacza
195
Dodawanie komponentu Rigidbody
196
Tworzenie skryptu dla ogniwa energetycznego
197
Dodawanie opcji wyzwalaj&cego wykrywania kolizji
198
Zapisywanie obiektu w postaci prefabrykatu
199
Rozrzucanie ogniw energetycznych
200
Inwentarz gracza
200
Zapami!tywanie poziomu zasilania
201
Dodawanie funkcji CellPickup()
202
Ograniczenie dost#pu do placówki
204
Ograniczenie dost!pu do drzwi za pomoc& licznika ogniw
204
Wy"wietlacz HUD dla ogniwa energetycznego
205
Importowanie ustawie" tekstur GUI
206
Tworzenie obiektu GUITexture
206
Umieszczanie tekstury PowerGUI
208
Skrypt do podmiany tekstury
208
Tablice
209
Poinformowanie o otwarciu drzwi
217
Wskazówki dla gracza
221
Pisanie na ekranie za pomoc& komponentu GUIText
221
Podsumowanie
227
Rozdzia$ 7. Konkretyzowanie obiektów i bry$y sztywne
229
Wykorzystywanie konkretyzacji
230
Bry$y sztywne
231
Si y
232
Komponent Rigidbody
232
Tworzenie minigry
233
Tworzenie prefabrykatu orzecha kokosowego
234
Tworzenie obiektu Launcher
236
Skrypt obs uguj&cy rzucanie orzechami kokosowymi
238
Ko"cowe procedury sprawdzaj&ce
247
Ograniczenia konkretyzacji oraz usuwanie obiektów
248
Dodawanie pomieszczenia przeznaczonego do rzucania kokosami
251
Wygrywanie gry
266
Ko"cowe usprawnienia
271
Podsumowanie
274
Rozdzia$ 8. Systemy cz%stek
277
Co to jest system cz%stek?
277
Particle Emitter
278
Particle Animator
278
Particle Renderer
279
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Spis tre"ci
7
Definiowanie zadania
280
U*yte zasoby
280
Tworzenie sterty ga !zi
281
Tworzenie systemów cz&stek dla ogniska
283
Rozpalanie ognia
292
Testowanie i weryfikacja dzia$ania
302
A wi!c jaki mamy problem?
303
Podsumowanie
305
Rozdzia$ 9. Projektowanie menu
307
Interfejsy i menu
308
Tworzenie sceny
310
Tworzenie menu za pomoc% obiektów GUITexture i zdarze+ myszy
315
Dodawanie przycisku uruchamiania gry
315
Skrypt obs uguj&cy przycisk klasy GUITexture
315
Wczytywanie scen
318
Przypisywanie zmiennych publicznych
319
Testowanie przycisku
320
Dodawanie przycisku wy%wietlaj&cego instrukcje
321
Dodawanie przycisku zako"czenia gry
321
Testowanie skryptów przy u*yciu polece" debugowania
324
Tworzenie menu za pomoc% klasy GUI "rodowiska Unity oraz kompozycji graficznych
326
Wy &czanie obiektów gry
326
Tworzenie menu
326
Podsumowanie
349
Rozdzia$ 10. Podstawy animacji
351
Sekwencja animacji po wygraniu gry
351
Metoda tworzenia sekwencji animacji
352
Uruchamianie sekwencji wygrania gry
354
Tworzenie komunikatów informuj&cych o wygraniu gry
354
Animowanie przy u*yciu interpolacji liniowej
356
Tworzenie obiektu obs uguj&cego sekwencj! zwyci!stwa
358
Tworzenie skryptu wygaszania ekranu i u*ycie panelu Animation
360
Wczytywanie sekwencji wygrania gry
372
Umieszczanie obiektów GUITexture w warstwach
373
Wyzwanie — zmiana koloru ekranu w scenie Island
374
Podsumowanie
374
Rozdzia$ 11. Poprawa wydajno"ci i ko+cowe modyfikacje
375
Ulepszenie terenu i zdefiniowanie po$o&enia pocz%tkowego gracza
376
Ulepszanie terenu
376
Modyfikacja wzgórz i dolin oraz zastosowanie techniki przenikania tekstur
377
Zdefiniowanie w a%ciwej %cie*ki
378
Pocz%tkowa lokalizacja postaci gracza
379
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
8
Optymalizacja wydajno"ci
380
P aszczyzny odcinaj&ce i mg a
380
Odwzorowywanie %wiat a
381
Ko+cowe upi#kszenia
391
Wulkan!
391
Trajektorie lotu orzechów kokosowych
397
Podsumowanie
400
Rozdzia$ 12. Budowanie i udost#pnianie
401
Opcje budowania
402
Web Player
402
Aplikacje samodzielne dla komputerów PC i Mac
404
Widget aplikacji Dashboard dla OS X
404
Ustawienia budowania
405
Ustawienia gracza
406
Ustawienia Cross-Platform Settings
406
Ustawienia Per-Platform Settings
407
Ustawienia jako"ci
411
Ustawienia wej"- dla gracza
413
Budowanie gry
414
Przystosowanie do wersji sieciowej
414
Pierwsza kompilacja
421
Budowanie dla sieci
423
Udost#pnianie swoich prac
428
Udost!pnianie prac na portalu Kongregate.com
428
Podsumowanie
429
Rozdzia$ 13. Testy i dalsze zdobywanie wiedzy
431
Nauka poprzez dzia$anie
432
Testowanie i finalizowanie
432
Wykorzystanie u*ytkowników do testowania
433
Sposoby zdobywania wiedzy
437
Studiuj ró*ne zagadnienia
437
Nie odkrywaj ko a na nowo
438
Je%li czego% nie wiesz, pytaj!
438
Podsumowanie
439
S$owniczek
441
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
2
Podstawy tworzenia
prototypów i skryptów
Jedn! z najlepszych metod zdobywania wiedzy i do#wiadczenia podczas stawiania pierwszych
kroków w dziedzinie projektowania gier jest tworzenie prototypów w%asnych pomys%ów. &ro-
dowisko Unity przoduje w tym zagadnieniu, udost'pniaj!c wizualny edytor sceny oraz publiczne
zmienne sk%adowe, które widniej! na panelu Inspector (inspektor) w postaci odpowiednich
ustawie*. Zapoznanie si' z dzia%aniem edytora Unity rozpoczniemy od wygenerowania pro-
totypu prostej mechaniki gry, wykorzystuj!c w tym celu kszta%ty podstawowe oraz tworzenie
elementarnych skryptów.
W tym rozdziale zostan! przedstawione nast'puj!ce zagadnienia:
tworzenie nowego projektu w #rodowisku Unity,
importowanie pakietów z zasobami,
praca z obiektami gry w widokach Scene (scena) i Hierarchy (hierarchia),
dodawanie materia%ów,
tworzenie skryptów w j'zykach C Sharp (C#) oraz JavaScript,
zmienne, funkcje i polecenia,
u1ycie polecenia
Translate()
w celu przemieszczenia obiektów,
u1ycie prefabrykatów do przechowywania obiektów,
u1ycie polecenia
Instantiate()
w celu konkretyzacji obiektów.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
44
Twój pierwszy projekt w "rodowisku Unity
&rodowisko Unity jest oferowane w dwóch wersjach: standardowej (darmowej) oraz p%atnej
(licencjonowanej) dla profesjonalnych projektantów. W niniejszej ksi!1ce b'dziemy omawia2
opcje, do których maj! dost'p u1ytkownicy wersji darmowej.
Je#li uruchomisz #rodowisko Unity po raz pierwszy, zostanie do niego wczytany przyk%adowy
projekt. Zapoznawanie si' z najlepszymi wzorami, stosowanymi w najwy1szej jako#ci projektach,
jest bardzo przydatne. Jednak1e w przypadku pocz!tkuj!cych u1ytkowników przegl!danie
profesjonalnie utworzonych zasobów i skryptów mog%oby by2 deprymuj!ce, dlatego te1 pomi-
niemy projekt przyk%adowy i rozpoczniemy prace od samego pocz!tku!
W menu g%ównym #rodowiska Unity wybierz opcj' File/New Project (plik/nowy projekt), co
spowoduje wy#wietlenie okna dialogowego Project Wizard (kreator projektu — na poni1szym
rysunku przedstawiono wersj' dla komputera typu Mac). Kliknij zak%adk' Create new Project
(stwórz nowy projekt).
Uwaga
Je li chcia"by , by za ka$dym razem po uruchomieniu rodowiska Unity okno dialogowe
Project Wizard
by"o automatycznie wy wietlane, powiniene wywo"ywa& aplikacj' z naci ni'tym klawiszem
Alt
(Mac i PC).
Taki sposób dzia"ania mo$na równie$ skonfigurowa& w opcji menu
File/Preferences
(plik/ustawienia).
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
45
Kliknij przycisk Set
1
(umie#2), aby zdefiniowa2 lokalizacj' folderu dla nowego projektu Unity.
W niniejszej ksi!1ce zosta% on nazwany UGDE i umieszczony na pulpicie, by mie2 do niego
%atwy dost'p.
Kreator projektu pozwala tak1e na zaimportowanie wielu pakietów z zasobami, które s! udo-
st'pnione za darmo przez firm' Unity Technologies. Zawieraj! one z%o1one skrypty, gotowe
obiekty i inne elementy graficzne, które s! przydatne podczas rozpoczynania pracy z ró1nymi
rodzajami projektów. Te pakiety mo1esz tak1e zaimportowa2 w ka1dej chwili, wybieraj!c opcj'
menu Assets/Import Package (zasoby/import pakietu), a nast'pnie odpowiedni! pozycj' z dost'p-
nej listy. Wybieraj!c opcj' Assets/Import Package/Custom Package (zasoby/import pakietu/pakiet
u1ytkownika), móg%by# równie1 zaimportowa2 pakiet znajduj!cy si' w dowolnej lokalizacji na
Twoim dysku twardym. Taka funkcjonalno#2 pozwala wspó%dzieli2 zasoby z innymi u1ytkowni-
kami oraz umo1liwia instalacj' pakietów, które uzyska%e# poprzez wybranie opcji Window/Asset
Store (okno/sklep z zasobami).
Z listy pakietów, które mo1na zaimportowa2, wybierz nast'puj!ce (jak zaprezentowano na
powy1szym rysunku):
Character Controller (kontroler postaci),
Skyboxes (skybox — symulacja nieba i horyzontu),
Terrain Assets (zasoby terenu),
Water (Basic) (woda — wersja podstawowa).
Po zaznaczeniu pakietów kliknij przycisk Create Project (stwórz projekt), znajduj!cy si' w dolnej
cz'#ci okna dialogowego. Spowoduje to rozpocz'cie procesu tworzenia nowego projektu,
podczas którego b'dziesz móg% obserwowa2 paski post'pu, reprezentuj!ce import poszczegól-
nych pakietów.
Podstawowe "rodowisko prototypowe
Aby stworzy2 proste #rodowisko, w którym zostanie wygenerowany prototyp okre#lonej mecha-
niki gry, dzia%ania powinni#my rozpocz!2 od zdefiniowania podstawowej listy obiektów — zosta-
nie im przypisana funkcjonalno#2 pozwalaj!ca graczowi celowa2 i strzela2 do #ciany sk%adaj!cej
si' z prostych sze#cianów.
Po zako*czeniu pracy #rodowisko prototypowe b'dzie si' sk%ada2 z powierzchni zbudowanej
z prostych sze#cianów, kamery pozwalaj!cej na obserwowanie #wiata gry w trzech wymiarach
oraz 8ród%a #wiat%a punktowego, umo1liwiaj!cego pod#wietlenie obszaru, w którym b'dzie si'
toczy2 akcja gry. Wygenerowany #wiat powinien wygl!da2 tak jak na poni1szym rysunku:
1
W wersji dla PC przycisk nazywa si' Browse (przegl!daj) — przyp. t0um.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
46
Definiowanie sceny
Poniewa1 ka1da nowa scena zawiera domy#lnie obiekt
Main Camera
(g%ówna kamera), dzia%ania
rozpoczniemy od utworzenia powierzchni dla #rodowiska prototypowego.
W panelu Hierarchy (hierarchia) kliknij przycisk Create (stwórz), a nast'pnie z rozwijanego menu
wybierz opcj' Cube (sze#cian). Elementy znajduj!ce si' na li#cie s! tak1e dost'pne w opcji
GameObject/Create Other (obiekt gry/stwórz inny) menu g%ównego aplikacji. Obecnie mo1esz
zauwa1y2 obiekt o nazwie Cube, znajduj!cy si' w panelu Hierarchy. Wybierz go, a pó8niej
naci#nij klawisz F2 (PC) lub Return (Mac) albo dwukrotnie z opó8nieniem kliknij nazw' obiektu,
1eby j! zmieni2. Wprowad8 s%owo Floor (powierzchnia), a nast'pnie naci#nij klawisz Enter (PC)
lub Return (Mac), by zatwierdzi2 wprowadzenie zmian.
Ze wzgl'du na konieczno#2 zapewnienia zgodno#ci rozpoczniemy tworzenie obiektów w punkcie
zerowym #wiata, czyli centrum trójwymiarowego #rodowiska, w którym pracujemy. Aby upewni2
si', 1e sze#cian b'd!cy powierzchni! zosta% umieszczony dok%adnie w tym miejscu, sprawd8,
czy w dalszym ci!gu jest wybrany w panelu Hierarchy. Nast'pnie zaznacz komponent Transform
na panelu Inspector (inspektor) i zwró2 uwag' na to, czy wszystkie warto#ci wspó%rz'dnych X,
Y i Z s! równe zeru. Je#li tak nie jest, wprowad8 zera w odpowiednich polach edycji lub kliknij
ikon' w kszta%cie kó%ka z'batego, a potem wybierz z menu podr'cznego opcj' Reset Position
(wyzeruj po%o1enie).
W dalszej kolejno#ci powinni#my przekszta%ci2 sze#cian na powierzchni', odpowiednio powi'k-
szaj!c go w osi X i Y. W komponencie Transform przejd8 do grupy Scale (skala), a nast'pnie
w polach edycji X i Z wprowad8 warto#ci
100
, pozostawiaj!c pole Y równe
1
.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
47
Dodawanie prostego o$wietlenia
Postaramy si' teraz o#wietli2 obszar powierzchni prototypowej poprzez dodanie 8ród%a #wiat%a
punktowego. Kliknij przycisk Create w panelu Hierarchy (lub wybierz opcj' menu g%ównego
GameObject/Create Other), a nast'pnie wybierz pozycj' Point Light (#wiat%o punktowe).
Umie#2 8ród%o #wiat%a w po%o1eniu
(0, 20, 0)
, u1ywaj!c w tym celu odpowiednich warto#ci Posi-
tion (pozycja) zawartych w komponencie Transform, dzi'ki czemu b'dzie si' ono znajdowa2 20
jednostek nad powierzchni!.
Jak zapewne zauwa1y%e#, oznacza to, 1e #wiat%o nie dociera do ca%ej powierzchni. Przeci!gnij
wi'c 1ó%ty punkt, który znajduje si' na przeci'ciu linii tworz!cych zarys #wiat%a punktowego
w widoku Scene, by uzyska2 warto#2 parametru Range (zasi'g) równ!
40
. Parametr ten jest
elementem komponentu Light (#wiat%o) dost'pnego w widoku Inspector. Wykonane przez Cie-
bie dzia%anie spowoduje, 1e na obiekcie tworz!cym powierzchni' pojawi si' lekka po#wiata.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
48
Wskazówka
Pami'taj, $e wi'kszo & komponentów jest powi-zana z odpowiednimi narz'dziami, s"u$-cymi do wizualnej
edycji i znajduj-cymi si' w widoku
Scene
. Modyfikacja warto ci takich jak
Range
w komponencie
Light
,
dost'pnym w panelu
Inspector
, spowoduje uaktualnienie wygl-du obiektu w widoku
Scene
w trakcie
wprowadzania zmian. Zostan- one zatwierdzone po naci ni'ciu klawisza
Return
(
Enter
).
Kolejna ceg&a w $cianie
Utworzymy #cian' z%o1on! z sze#cianów, która b'dzie celem dla pocisków. Najpierw utworzymy
pierwsz! ceg%', uzupe%nion! w razie konieczno#ci o komponenty, a nast'pnie powielimy j! w tylu
egzemplarzach, a1 b'dziemy dysponowali gotow! #cian!.
Tworzenie wzorcowej ceg&y
Aby uzyska2 szablon, pozwalaj!cy na wygenerowanie wszystkich cegie%, musimy utworzy2 wzor-
cowy obiekt, który b'dzie mo1na pó8niej klonowa2. Procedura jest nast'puj!ca:
1. Kliknij przycisk Create, znajduj!cy si' w górnym obszarze panelu Hierarchy, a nast'pnie
wybierz opcj' Cube. U1ywaj!c warto#ci Position w komponencie Transform, umie#2
obiekt w po%o1eniu
(0, 1, 0)
. Upewnij si', czy wci!1 jest wybrany w panelu
Hierarchy, a nast'pnie przybli1 jego widok przez przemieszczenie kursora myszy
nad okno Scene i naci#ni'cie klawisza F.
2. Uzupe%nij obiekt Cube o parametry fizyczne, wybieraj!c opcj' menu g%ównego
Component/Physics/Rigidbody (komponent/parametry fizyczne/bry%a sztywna).
Oznacza to, 1e Twój obiekt b'dzie od tej pory bry%! sztywn!, charakteryzuj!c! si'
takimi parametrami, jak masa czy ci'1ar. Mo1e tak1e oddzia%ywa2 na inne obiekty
dzi'ki wykorzystaniu silnika fizycznego w celu uzyskania realistycznych wyników
w #wiecie 3D.
3. Wreszcie stwórzmy kolor dla obiektu poprzez wygenerowanie odpowiedniego
materia%u. Materia%y s%u1! do uzupe%niania obiektów trójwymiarowych o kolor
i tekstur'. Aby utworzy2 nowy materia%, kliknij przycisk Create, znajduj!cy si'
w panelu Project, a nast'pnie z menu rozwijanego wybierz opcj' Material (materia%).
Naci#nij klawisz F2 (PC) lub Return (Mac), aby zmieni2 jego domy#ln! nazw' New
Material (nowy materia%) na Red (czerwony).
4. Gdy materia% zostanie wybrany, jego w%a#ciwo#ci s! wy#wietlane w panelu Inspector.
Kliknij pole koloru (1), znajduj!ce si' po prawej stronie etykiety Main Color (g%ówny
kolor), aby otworzy2 okno dialogowe Color Picker (wybór koloru) (2). B'dzie ono ró1ni2
si' wygl!dem w zale1no#ci od tego, czy u1ywasz komputera typu Mac lub PC.
Po prostu wybierz jaki# odcie* koloru czerwonego, a nast'pnie zamknij okno. Pole
koloru Main Color powinno zosta2 odpowiednio zaktualizowane.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
49
5. Aby u1y2 stworzonego materia%u, przeci!gnij go z panelu Project i upu#2 na sze#cian
znajduj!cy si' w widoku Scene lub nazw' obiektu w oknie Hierarchy. Materia%
zostanie u1yty w komponencie Mesh Renderer (renderer siatki) dla danego obiektu
oraz natychmiast zaprezentowany innym jego komponentom w panelu Inspector.
Najwa1niejsze jest jednak to, 1e Twój sze#cian powinien by2 teraz czerwony!
Modyfikacja parametrów materia%u przy u1yciu opcji Preview (podgl!d), zastosowanej
do dowolnego obiektu, spowoduje wprowadzenie rzeczywistych zmian tylko
w oryginalnym elemencie, poniewa1 poprzez t' operacj' odwo%ujemy si' do w%a#ciwego
zasobu, a nie do nowo utworzonej instancji.
6. Poniewa1 sze#cian ma ju1 kolor i w%a#ciwo#ci fizyczne, wynikaj!ce z u1ycia komponentu
Rigidbody (bry%a sztywna), mo1e zosta2 sklonowany i utworzy2 #cian' z%o1on! z cegie%.
Zanim jednak tego dokonamy, przyjrzyjmy si' przez chwil' prawom fizycznym
dzia%aj!cym w przestrzeni 3D. Upewnij si', 1e sze#cian zosta% wybrany, a nast'pnie
przypisz parametrowi Y Position (po%o1enie Y) warto#2
15
, za# X Rotation (rotacja X)
warto#2
40
. Obie te w%a#ciwo#ci nale1! do komponentu Transform w widoku Inspector.
Naci#nij przycisk Play (lub skrót klawiszowy Ctrl+P dla PC albo Command+P
dla komputerów Mac), znajduj!cy si' w górnej cz'#ci interfejsu Unity. Powiniene#
zobaczy2 spadaj!cy sze#cian, który pod k!tem uderza o powierzchni' i po wykonaniu
pó%obrotu zatrzymuje si'.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
50
7. Naci#nij przycisk Play ponownie, aby zatrzyma2 symulacj'. Nie naciskaj przycisku
Pause, poniewa1 spowodowa%oby to tylko tymczasowe zatrzymanie animacji, natomiast
pó8niejsze zmiany w scenie nie zosta%yby zapami'tane.
8. Przywró2 poprzednie ustawienia dla sze#cianu: parametrowi Y Position przypisz
warto#2
1
, a X Rotation — warto#2
0
.
Sprawdzi%e#, 1e ceg%a zosta%a poprawnie zdefiniowana i dzia%a zgodnie z oczekiwaniami. Mo1esz
wi'c rozpocz!2 tworzenie rz'du cegie%, z których b'dzie si' sk%ada2 nasza #ciana.
I pstryk! Mamy rz,d
Aby u%atwi2 rozmieszczanie obiektów, #rodowisko Unity pozwala na u1ycie opcji przyci!gania.
Parametry opcji przyci!gania mog! by2 modyfikowane w opcji menu Edit/Snap Settings (edy-
cja/ustawienia opcji przyci!gania).
Aby zastosowa2 opcj' przyci!gania, przytrzymaj naci#ni'ty klawisz Control (PC) lub Command
(Mac) podczas u1ywania narz'dzia Translate (W) w celu rozmieszczenia obiektów w widoku
Scene. By rozpocz!2 budow' #ciany, przy u1yciu skrótu klawiszowego Ctrl+D (PC) lub Com-
mand+D (Mac) skopiuj obiekt ceg%y, którym ju1 dysponujemy. Nast'pnie przeci!gnij go, chwy-
taj!c za uchwyt czerwonej osi i jednocze#nie trzymaj!c wci#ni'ty klawisz Control (PC) lub
Command (Mac). Dzi'ki temu obiekt b'dzie si' przemieszcza% skokowo po siatce przyci!gania.
Przesuwaj ceg%' w osi X, a1 znajdzie si' w bezpo#rednim s!siedztwie innej, tak jak przedsta-
wiono na poni1szym rysunku:
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
51
Powtarzaj procedur' kopiowania i rozmieszczania przy u1yciu siatki przyci!gania a1 do momentu,
gdy b'dziesz dysponowa2 rz'dem dziesi'ciu cegie%. Aby przyspieszy2 tworzenie konstrukcji,
umie#cimy go w pustym obiekcie nadrz'dnym, który nast'pnie sklonujemy.
Przyci,ganie do wierzcho&ków
Podstawowa procedura przyci-gania, której u$yli my wcze niej, dzia"a"a poprawnie, poniewa$ nasze sze-
ciany charakteryzuj- si' ogóln- skal- o wielko ci 1. Jednak$e podczas skalowania obiektów o bardziej z"o$o-
nych kszta"tach powiniene zastosowa& opcj' przyci-gania do wierzcho"ków. Aby jej u$y&, upewnij si',
$e wybra"e narz'dzie
Translate
, a nast'pnie wci nij i przytrzymaj klawisz
V
. Gdy umie cisz kursor myszy
nad punktem wybranego wierzcho"ka, przeci-gnij ca"y element do wierzcho"ka nale$-cego do innego obiektu.
Grupowanie i duplikacja przy u.yciu pustych obiektów
Stwórz pusty obiekt, wybieraj!c opcj' menu g%ównego GameObject/Create Empty (obiekt
gry/stwórz pusty). Nast'pnie umie#2 go w po%o1eniu
(4.5, 0.5, -1)
przy u1yciu komponentu
Transform z panelu Inspector. Zmie* jego nazw' na CubeHolder.
Zaznacz wszystkie sze#ciany w panelu Hierarchy: wybierz sze#cian znajduj!cy si' najwy1ej,
przytrzymaj klawisz Shift, a nast'pnie wybierz sze#cian najni1szy. W dalszej kolejno#ci prze-
ci!gnij zaznaczony zbiór sze#cianów do pustego obiektu CubeHolder, znajduj!cego si' w panelu
Hierarchy, aby uczyni2 go obiektem nadrz'dnym. Po wykonaniu tej operacji widok Hierarchy
powinien si' przedstawia2 nast'puj!co:
Mo1esz zauwa1y2, 1e obok nazwy obiektu nadrz'dnego pojawi%a si' ikona w postaci strza%ki.
Oznacza to, 1e mo1esz j! klikn!2, co spowoduje rozwini'cie i zwini'cie listy z obiektami pod-
rz'dnymi. Aby zaoszcz'dzi2 miejsce w panelu Hierarchy, kliknij strza%k', by ukry2 wszystkie
obiekty podrz'dne, a nast'pnie ponownie wybierz CubeHolder.
Gdy ca%y rz!d cegie% zosta% utworzony i przyporz!dkowany do obiektu nadrz'dnego, mo1emy go
w prosty sposób zduplikowa2 poprzez przeci!gni'cie z u1yciem opcji przyci!gania w osi
Y. Tak jak poprzednio u1yj skrótu klawiszowego s%u1!cego do klonowania (PC: Ctrl+D, Mac:
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
52
Command+D), a nast'pnie wybierz narz'dzie Translate (W) i zastosuj technik' przeci!gania
z przyci!ganiem (PC: Ctrl, Mac: Command), by przemie#ci2 rz!d cegie% w gór' o jedn! jed-
nostk' za pomoc! zielonego uchwytu osi Y.
Powtarzaj powy1sz! procedur', a1 utworzysz osiem rz'dów cegie% umieszczonych jeden nad
drugim. &ciana powinna wygl!da2 jak na poni1szym rysunku. Zwró2 uwag' na to, 1e zosta%y na
nim zaznaczone wszystkie obiekty CubeHolder znajduj!ce si' w panelu Hierarchy.
Zbuduj i zniszcz!
Gdy zbudowali#my #cian' z cegie%, nadszed% czas na stworzenie prostej mechaniki gry, w któ-
rej gracz mo1e przemieszcza2 kamer' i wystrzeliwa2 pociski w kierunku #ciany, by j! zburzy2.
Definiowanie widoku
Ustaw kamer' w taki sposób, by by%a skierowana na #cian'. W tym celu zaznacz obiekt Main
Camera, znajduj!cy si' w panelu Hierarchy, a nast'pnie w komponencie Transform zdefiniuj
jego pozycj' równ!
(4, 3, -15)
. Upewnij si' tak1e, 1e wszystkie parametry zwi!zane z obrotem
s! równe zeru.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
53
Wprowadzenie do tworzenia skryptów
Aby rozpocz!2 nauk' programowania, przyjrzymy si' prostemu przyk%adowi, definiuj!cemu t'
sam! funkcjonalno#2 w j'zykach C Sharp (C#) oraz JavaScript, podstawowych dla projektantów
wykorzystuj!cych #rodowisko Unity. Mo1na równie1 tworzy2 skrypty oparte na j'zyku Boo, lecz
s! one rzadko u1ywane, pomijaj!c osoby, które go dobrze znaj!.
Uwaga
Kolejne &wiczenia mo$esz wykonywa&, u$ywaj-c zarówno j'zyka JavaScript, jak i C#. Jednak$e w dalszej
cz' ci ksi-$ki powiniene zdecydowa& si' na ten j'zyk, który bardziej Ci odpowiada.
Rozpocznij od klikni'cia przycisku Create (stwórz), znajduj!cego si' w panelu Project (projekt),
a nast'pnie wybrania opcji Javascript lub C# Script.
Twój skrypt zostanie umieszczony w panelu Project pod nazw! NewBehaviourScript, obok któ-
rej widnieje niewielka ikona w kszta%cie strony z napisem JS lub C#. W trakcie dokonywania
wyboru skryptu masz dost'p do podgl!du jego kodu w oknie Inspector (inspektor). Znajduje si'
tam tak1e przycisk Open (otwórz), którego klikni'cie powoduje otwarcie skryptu w domy#lnym
edytorze o nazwie Monodevelop. Mo1esz go tak1e otworzy2, klikaj!c dwukrotnie jego ikon'
w panelu Project.
Nowy skrypt definiuj,cy zachowanie lub klas1
Bez wzgl'du na to, czy zdecydujesz si' na j'zyk C#, czy JavaScript, przydatne b'dzie prze-
czytanie obu dalszych fragmentów, poniewa1 zawieraj! on ogólne informacje o tworzeniu
skryptów i mog! równie1 pomóc w podj'ciu decyzji o wyborze okre#lonego j'zyka.
W terminologii #rodowiska Unity ka1dy nowo utworzony skrypt odpowiada zdefiniowaniu nowej
klasy. Je#li jeste# pocz!tkuj!cym programist!, potraktuj klas' jako zbiór dzia%a*, w%a#ciwo#ci i
innych zapami'tanych informacji, do których mo1na mie2 dost'p poprzez jej nazw'.
Na przyk%ad klasa o nazwie
Pies
mog%aby zawiera2 takie w%a#ciwo#ci, jak
kolor
,
rasa
,
rozmiar
i
p:e;
. Oprócz nich istnia%yby takie dzia%ania, jak
biegnij
czy
przynie@ patyk
. W%a#ciwo#ci mog!
by2 opisane jako zmienne, natomiast dzia%ania mog! zosta2 zdefiniowane w postaci funkcji,
zwanych tak1e metodami.
Aby odwo%a2 si' do zmiennej
rasa
, która jest w%a#ciwo#ci! klasy
Pies
, mogliby#my poda2 nazw'
klasy, nast'pnie u1y2 znaku kropki, a wreszcie wprowadzi2 nazw' zmiennej:
Pies.rasa;
Do wywo%ania funkcji klasy
Pies
mogliby#my zastosowa2 poni1szy zapis:
Pies.przyniesPatyk();
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
54
Funkcje mo1emy równie1 wywo%ywa2 z argumentami — nie maj! one jednak nic wspólnego
z tymi, których u1ywamy codziennie podczas dyskusji z innymi osobami! Przyjmij za%o1enie,
1e argumenty pozwalaj! na modyfikowanie dzia%ania funkcji. Na przyk%ad w przypadku funkcji
przyniesPatyk
mogliby#my u1y2 argumentu, który definiuje, jak szybko pies powinien przynie#2
patyk. Jej wywo%anie mog%oby wygl!da2 tak:
Pies.przyniesPatyk(25);
Mimo 1e zaprezentowane wy1ej przyk%ady s! abstrakcyjne, cz'sto pozwalaj! odwzorowa2 kod
programu na sytuacje wzi'te z 1ycia, co sprawia, 1e nabieraj! sensu. Podczas czytania tej ksi!1ki
postaraj si' do nich wraca2. Mo1esz tak1e tworzy2 w%asne odwzorowania, co pozwoli Ci lepiej
zrozumie2 dzia%anie klas informacji oraz ich w%a#ciwo#ci.
W czasie pisania skryptu w j'zyku C# lub JavaScript tworzysz now! klas' (lub klasy) zawiera-
j!c! w%a#ciwo#ci (zmienne) oraz polecenia (funkcje), których mo1esz u1y2 w okre#lonym miejscu
w swojej grze.
Jak wygl,da od $rodka dzia&anie skryptu w j1zyku C#?
Gdy w #rodowisku Unity utworzysz nowy skrypt w j'zyku C#, od razu otrzymasz pewien kod,
którego mo1esz u1y2:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
Kod rozpoczyna si' od dwóch niezb'dnych wierszy, zawieraj!cych odwo%ania do samego silnika
Unity:
using UnityEngine;
using System.Collections;
Nast'pnie jest tworzona nazwa klasy, zgodna z nazw! skryptu. W j'zyku C# musisz zdefinio-
wa2 tak! nazw' skryptu, która b'dzie odpowiada2 nazwie zadeklarowanej w nim klasy. Na
pocz!tku dokumentu widzimy zapis
public class NewBehaviourScript : MonoBehaviour {
,
poniewa1
NewBehaviourScript
jest domy#ln! nazw!, nadawan! przez #rodowisko Unity ka1demu
nowo utworzonemu skryptowi. Je#li w panelu Project zmienisz nazw' skryptu, system Unity
automatycznie zmieni tak1e nazw' zdefiniowanej w nim klasy.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
55
Kod sk&adaj,cy si1 z klas
Podczas pisania kodu wi'kszo & funkcji, zmiennych i innych sk"adników skryptu b'dzie umieszczana
wewn-trz klasy j'zyka C#.
Wewn-trz
w tym kontek cie oznacza, $e musi wyst-pi& po deklaracji klasy
i ko2czy& si' zamykaj-cym nawiasem klamrowym }, znajduj-cym si' na ko2cu skryptu. Podczas analizowania
polece2 zawartych w tej ksi-$ce mo$esz za"o$y&, $e Twój kod powinien zosta& umieszczony wewn-trz
klasy zdefiniowanej w skrypcie. Ka$dy wyj-tek od tej regu"y zostanie jawnie wskazany. Ta zasada nie
jest tak rygorystycznie przestrzegana w j'zyku JavaScript, poniewa$ ca"y skrypt jest w nim definiowany
jako oddzielna klasa. Aby zapozna& si' ze szczegó"ami, przeczytaj podrozdzia" zatytu"owany „Jak wygl-da
od rodka dzia"anie skryptu w j'zyku JavaScript?”.
Funkcje podstawowe
&rodowisko Unity zawiera wiele w%asnych funkcji, które mog! by2 u1ywane w celu uruchomienia
ró1nych opcji silnika gry. Dwie z nich s! szczególnie wa1ne podczas tworzenia nowego skryptu
w j'zyku C#.
Uwaga
Funkcje j'zyka C# (zwane równie$ metodami) najcz' ciej rozpoczynaj- si' od s"owa void. U$yta nazwa
okre la typ warto ci, która jest zwracana przez funkcj', czyli danej otrzymanej po jej wywo"aniu. Poniewa$
wi'kszo & funkcji jest tworzona wy"-cznie w celu wykonania okre lonych instrukcji, a nie zwracania jakich
informacji, na pocz-tku ich deklaracji b'dziesz cz'sto spotyka" s"owo void. Oznacza ono po prostu, $e
wywo"anie funkcji nie zwróci $adnych warto ci.
Funkcje te s! nast'puj!ce:
Start()
: Zostaje ona wywo%ana przy pierwszym uruchomieniu sceny, dlatego jest
cz'sto u1ywana (jak wynika z sugestii zawartej w kodzie) w celach inicjalizacyjnych.
Na przyk%ad móg%by# dysponowa2 zmienn! przechowuj!c! wynik, której musi zosta2
przypisana warto#2
0
podczas rozpoczynania gry. W funkcji
Start()
mog%aby tak1e
zosta2 wywo%ana procedura, która umieszcza posta2 gracza we w%a#ciwym miejscu
gry na pocz!tku danego poziomu.
Update()
: Poniewa1 stany ró1nych elementów gry mog! si' zmienia2 w trakcie jej
trwania, funkcja ta jest wywo%ywana w ka1dej iteracji podczas dzia%ania Twojego
programu i jest odpowiedzialna za ich sprawdzanie.
Zmienne w j1zyku C#
Aby zapami'ta2 informacj' w zmiennej j'zyka C#, nale1y u1y2 nast'puj!cej sk%adni:
typDanych nazwaZmiennej = warto=>;
Na przyk%ad:
int currentScore = 5;
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
56
lub:
float currentVelocity = 5.86f;
Zwró2 uwag' na to, 1e w powy1szych przyk%adach u1yto danych numerycznych:
int
oznacza
liczb2
ca3kowit6, natomiast
float
liczb2 zmiennoprzecinkow6. Ten drugi przypadek wymaga
dodatkowo w j'zyku C# umieszczenia litery
f
po warto#ci samej liczby. Ró1ni si' to w pewien
sposób od sk%adni u1ywanej w j'zyku JavaScript. Wi'cej szczegó%ów zostanie zaprezentowanych
w kolejnym punkcie „Zmienne w j'zyku JavaScript”.
Jak wygl,da od $rodka
dzia&anie skryptu w j1zyku JavaScript?
Nowo utworzony plik w j'zyku JavaScript zawiera mniej danych ni1 odpowiadaj!cy mu plik
j'zyka C#, poniewa1 ca%y skrypt jest uwa1any za definicj' klasy. Zak%ada si', 1e znajduj!ce si'
w nim tre#ci zawieraj! si' mi'dzy niewidocznymi dla u1ytkownika znacznikami otwieraj!cymi
i zamykaj!cymi klas', gdy1 sama jej deklaracja jest ukryta.
Mo1esz tak1e zauwa1y2, 1e wiersze
using UnityEngine;
i
using System.Collections;
s! rów-
nie1 niewidoczne w pliku j'zyka JavaScript, dlatego nowo utworzony skrypt zawiera tylko
funkcj'
Update()
:
function Update() {
}
Deklaracja funkcji w j'zyku JavaScript wygl!da inaczej i wymaga u1ycia s%owa kluczowego
function
przed jej nazw!. Deklaracje zmiennych i innych elementów skryptu s! tak1e zapisy-
wane w odmienny sposób — w kolejnych punktach zapoznamy si' z odpowiednimi przyk%adami.
Zmienne w j1zyku JavaScript
Sk%adnia s%u1!ca do deklarowania zmiennych w j'zyku JavaScript wygl!da nast'puj!co:
var nazwaZmiennej : TypDanych = warto!";
Jak wida2, deklaracja jest zawsze poprzedzona s%owem kluczowym
var
. Na przyk%ad:
var currentScore : int = 0;
lub:
var currentVelocity : float = 5.86;
Jak zapewne zauwa1y%e#, typ
float
, inaczej ni1 w j'zyku C#, nie wymaga podania litery
f
wyst'puj!cej za warto#ci!. Podczas analizy kolejnych skryptów napisanych w dwóch ró1nych
j'zykach b'dziesz tak1e móg% stwierdzi2, 1e j'zyk C# ma cz'sto bardziej rygorystyczne regu%y,
okre#laj!ce sposób tworzenia programów, szczególnie w przypadku niejawnie deklarowanych
typów danych, które maj! by2 u1ywane.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
57
Komentarze
Zarówno w j'zyku C#, jak i w JavaScript mo1esz tworzy2 komentarze za pomoc! nast'puj!cych
konstrukcji:
// dwa uko=niki oznaczaj? pojedynczy wiersz komentarza
lub:
/* uko=nik i gwiazdka rozpoczynaj? komentarz zawieraj?cy siA w wielu wierszach.
Jego zakoBczeniem s? gwiazdka i uko=nik */
Podczas czytania tej ksi!1ki komentarze mog! pomóc Ci przypomnie2 sobie zasad' dzia%ania
tworzonych przez Ciebie fragmentów kodu. Pami'taj, 1e komentarze nie wykonuj! si', dlatego
mo1esz w nich umieszcza2 dowolne teksty, w%!czaj!c w to równie1 wiersze kodu. Dopóki b'd!
si' one zawiera2 w komentarzu, nie zostan! potraktowane jako dzia%aj!cy kod.
Atakowanie $ciany
A teraz zastosujmy zdobyt! wiedz' w praktyce i zamie*my istniej!c! scen' w prototyp inte-
rakcyjnej fabu%y. W panelu Project zmie* nazw' nowo utworzonego skryptu poprzez jego
wybranie, naci#ni'cie klawisza F2 (PC) lub Return (Mac), a nast'pnie wprowadzenie tekstu
skryptu Shooter.
Je#li wykorzystujesz j'zyk C#, pami'taj o upewnieniu si', 1e Twoja deklaracja klasy znajduj!ca
si' wewn!trz skryptu odpowiada jego nazwie:
public class Shooter : MonoBehaviour {
Jak wcze#niej wspomniano, u1ytkownicy wykorzystuj!cy j'zyk JavaScript nie b'd! musieli sto-
sowa2 si' do powy1szej regu%y. By zastosowa2 w praktyce wiedz' o korzystaniu ze skryptów
w #rodowisku Unity, napiszemy skrypt steruj!cy kamer! i pozwalaj!cy na strzelanie pociskami
w kierunku postawionej przez nas #ciany.
Na pocz!tku utworzymy trzy zmienne:
bullet
: ta zmienna jest typu
Rigidbody
, poniewa1 przechowuje odwo%anie do obiektu
o w%a#ciwo#ciach fizycznych, który zostanie przez nas utworzony;
power
: jest to zmienna o typie zmiennoprzecinkowym, któr! wykorzystamy w celu
ustalenia si%y strza%u;
moveSpeed
: kolejna zmienna o typie zmiennoprzecinkowym, której u1yjemy,
by zdefiniowa2 pr'dko#2 poruszania kamer! za pomoc! klawiszy strza%ek.
Powy1sze zmienne musz! by2 sk3adowymi z dost2pem publicznym, co pozwoli je wy#wietli2
w panelu Inspector w postaci modyfikowanych ustawie*. Za chwil' zobaczysz, jak to dzia%a!
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
58
Deklarowanie zmiennych publicznych
Wa1ne jest, by zrozumie2 dzia%anie zmiennych o dost'pie publicznym, poniewa1 pozwala on na
odwo%ywanie si' do nich z innych skryptów. Ma to znaczenie podczas projektowania gier,
gdy1 umo1liwia definiowanie prostszej komunikacji mi'dzyobiektowej. Zmienne publiczne s!
tak1e przydatne z tego wzgl'du, 1e wyst'puj! w postaci ustawie*, które mo1na wizualnie mody-
fikowa2 w panelu Inspector, gdy tylko skrypt zostanie przypisany do obiektu. Zmienne pry-
watne zachowuj! si' przeciwnie — zosta%y zaprojektowane, by by2 dost'pne tylko z poziomu
skryptu, klasy lub funkcji, w których s! zdefiniowane. Nie pojawiaj! si' równie1 w postaci
ustawie* w panelu Inspector.
J2zyk C#:
Zanim rozpoczniemy dzia%ania, usuniemy funkcj'
Start()
ze skryptu, poniewa1 nie b'dziemy jej
u1ywa2. W tym celu po prostu skasuj tekst
void Start { }
. Aby stworzy2 wymagane zmienne,
umie#2 poni1szy fragment kodu w swoim skrypcie poni1ej wiersza otwieraj!cego klas':
using UnityEngine;
using System.Collections;
public class Shooter : MonoBehaviour {
public Rigidbody bullet;
public float power = 1500f;
public float moveSpeed = 2f;
void Update () {
}
}
Zwró2 uwag' na to, 1e w powy1szym przyk%adzie usun'li#my domy#lne komentarze, by zaosz-
cz'dzi2 miejsce.
J2zyk JavaScript:
Aby stworzy2 zmienne o dost'pie publicznym w j'zyku JavaScript, musisz si' upewni2, 1e zostan!
one zadeklarowane poza istniej!cymi funkcjami. Nale1y je po prostu umie#ci2 na samej górze
skryptu. Zadeklaruj wi'c trzy wymagane zmienne, wstawiaj!c poni1szy kod na pocz!tku skryptu
Shooter:
var bullet : Rigidbody;
var power : float = 1500;
var moveSpeed : float = 5;
function Update () {
}
Przypisywanie skryptów do obiektów
Aby skrypt móg% zosta2 u1yty w grze, musi by2 przypisany jako komponent do jednego z obiek-
tów gry znajduj!cych si' w istniej!cej scenie.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
59
Zapisz skrypt, wybieraj!c z g%ównego menu edytora opcj' File/Save (plik/zapisz), a nast'pnie wró2
do #rodowiska Unity. Oferuje ono kilka sposobów przypisywania skryptu do obiektu:
1. Przeci!gnij go z panelu Project i upu#2 na nazwie obiektu w panelu Hierarchy.
2. Przeci!gnij go z panelu Project i upu#2 na wizualn! reprezentacj' obiektu w panelu
Scene.
3. Wybierz obiekt, dla którego chcesz przypisa2 skrypt. Nast'pnie przeci!gnij i upu#2
skrypt w niezaj'tym obszarze w widoku Inspector tego obiektu.
4. Wybierz obiekt, do którego chcesz przypisa2 skrypt. Wybierz opcj' menu g%ównego
Component/Scripts (komponent/skrypty), a nast'pnie nazw' swojego skryptu.
Najcz'#ciej jest stosowana pierwsza metoda. W naszym przypadku b'dzie to rzeczywi#cie
najlepszy wybór, poniewa1 przeci!ganie skryptu do kamery w widoku Scene mog%oby by2 uci!1-
liwe z tego powodu, 1e nie zawiera ona wyra8nego obszaru, na którym mo1na by go upu#ci2.
Przeci!gnij wi'c nowy skrypt Shooter z panelu Project i upu#2 go na nazwie Main Camera,
znajduj!cej si' w panelu Hierarchy, co spowoduje jego przypisanie. B'dziesz móg% zauwa1y2,
1e skrypt zostanie wy#wietlony jako nowy sk%adnik poni1ej istniej!cego komponentu
Audio
Listener
. W panelu Inspector stwierdzisz tak1e istnienie trzech zmiennych publicznych:
Bullet
,
Power
i
Move Speed
:
Jak mo1esz zauwa1y2, #rodowisko Unity zmodyfikowa%o nazwy zmiennych, rozpoczynaj!c je od
wielkiej litery. Dodatkowo, w przypadku zmiennej
moveSpeed
, wielka litera wewn!trz jej nazwy
zosta%a potraktowana jako pocz!tek nowego s%owa. Dzi'ki temu uzyskano dwa wyrazy oddzielone
spacj!, które s! widoczne w panelu Inspector jako jedna zmienna publiczna.
Mo1na równie1 stwierdzi2, 1e zmienna
Bullet
nie zosta%a jeszcze zainicjalizowana, lecz ocze-
kuje si', i1 obiekt, który zostanie do niej przypisany, b'dzie u1ywa% komponentu bry%y sztywnej
(
Rigidbody
). Cz'sto zwany jest on po prostu obiektem typu
Rigidbody
. Pomimo tego, 1e w #ro-
dowisku Unity wszystkie elementy w scenie mog! by2 traktowane jako obiekty gry, podczas
definiowania w skrypcie obiektu o typie
Rigidbody
b'dziemy mogli si' odwo%ywa2 jedynie do
w%a#ciwo#ci i funkcji klasy o tej w%a#nie nazwie. Nie stanowi to jednak problemu — po prostu
sprawia, 1e skrypt staje si' bardziej efektywny ni1 w przypadku, gdyby#my odwo%ywali si' do
ca%ej klasy
GameObject
. Aby dowiedzie2 si' wi'cej na ten temat, zapoznaj si' z dokumentacj!
zwi!zan! z oprogramowaniem skryptowym dotycz!cym wspomnianych klas:
GameObject
: http://unity3d.com/support/documentation/ScriptReference/GameObject.html,
RigidBody
: http://unity3d.com/support/documentation/ScriptReference/Rigidbody.html.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
60
Uwaga
Pami'taj, $e podczas modyfikowania zmiennych publicznych, dost'pnych w panelu
Inspector
, dowolna
ich zmiana zamiast zast-pi& warto ci, które zosta"y zapisane w skrypcie, po prostu je przes"oni.
Kontynuujmy prace zwi!zane z tworzeniem skryptu i uzupe%nijmy go o pewn! interaktywno#2.
Wró2 wi'c z powrotem do edytora, do którego zosta% on wczytany.
Poruszanie kamer,
Teraz wykorzystamy zmienn!
moveSpeed
oraz odczytamy stan klawiatury, aby porusza2 kamer!
i faktycznie stworzy2 prosty mechanizm celowania dla strza%u. B'dzie on polega2 na ustawianiu
kamery w kierunku miejsca, w które b'dziemy strzelali.
Poniewa1 chcieliby#my u1ywa2 klawiszy strza%ek na klawiaturze, musimy si' najpierw dowie-
dzie2, w jaki sposób w kodzie mo1na si' do nich odwo%ywa2. &rodowisko Unity wykorzystuje
wiele sygna%ów wej#ciowych, które mo1na obserwowa2 i modyfikowa2 przy u1yciu mened@era
wejAB
(Input Manager) — patrz menu Edit/Project Settings/Input (edycja/ustawienia pro-
jektu/wej#cie).
Jak wida2 na poni1szym rysunku, istniej! dwa domy#lne parametry typu Input (wej#cie): Hori-
zontal (poziomy) i Vertical (pionowy). Wykorzystuj! one zasad' dzia%ania osi wspó%rz'dnych,
dzi'ki czemu naciskanie przycisku Positive Button (przycisk dodatni) generuje warto#2 równ!
1
,
natomiast naciskanie przycisku Negative Button (przycisk ujemny) tworzy warto#2
-1
. Zwolnienie
dowolnego przycisku oznacza, 1e warto#2 typu Input ponownie staje si' równa
0
, podobnie
jak mia%oby to miejsce podczas u1ywania spr'1ystego joysticka analogowego, znajduj!cego si'
w urz!dzeniu typu gamepad.
Poniewa1 typ
Input
jest równie1 nazw! klasy, a wszystkie nazwane elementy w mened1erze
wej#2 s! osiami lub przyciskami, w skrypcie mo1emy u1y2 nast'puj!cego zapisu:
Input.GetAxis("Horizontal");
Powy1szy wiersz pozwala na odczytanie bie1!cej warto#ci przycisków poziomych, zawieraj!cej
si' w zakresie od
-1
do
1
w zale1no#ci od tego, co jest naciskane przez u1ytkownika. Zastosujmy
go w naszym skrypcie, u1ywaj!c zmiennych lokalnych do reprezentowania osi.
Dzi'ki temu mo1emy pó8niej zmodyfikowa2 warto#2 zmiennej, u1ywaj!c operacji mno1enia,
dzi'ki czemu uzyskamy maksymaln! warto#2 wi'ksz! od
1
. Pozwoli nam to na przemieszczanie
kamery z pr'dko#ci! wi'ksz! ni1 jedna jednostka na iteracj'.
Dost'pu do tej zmiennej nie musimy mie2 w panelu Inspector, poniewa1 samo #rodowisko Unity
b'dzie przypisywa2 jej odpowiednie warto#ci w zale1no#ci od stanu sygna%ów wej#ciowych.
Wynika st!d, 1e powinna ona zosta2 zdefiniowana jako zmienna lokalna.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
61
Zmienne lokalne, prywatne i publiczne
Zanim b'dziemy kontynuowa2 prace zwi!zane z tworzeniem skryptu, zapoznajmy si' ze zmien-
nymi lokalnymi, prywatnymi i publicznymi:
Zmienne lokalne
. S! to zmienne tworzone wewn!trz funkcji. Nie b'd! prezentowane
w panelu Inspector i s! dost'pne wy%!cznie dla funkcji, w której si' znajduj!.
Zmienne prywatne
. S! tworzone na zewn!trz funkcji i dlatego dost'p do nich maj!
wszystkie funkcje danej klasy. Nie s! one jednak widoczne w panelu Inspector.
Zmienne publiczne
. S! tworzone na zewn!trz funkcji, dost'p do nich maj! wszystkie
funkcje danej klasy, a tak1e inne skrypty. Zmienne publiczne s! widoczne w panelu
Inspector i mog! by2 tam modyfikowane.
Zmienne lokalne i odczytywanie wej$;
Tworzenie zmiennych lokalnych w j'zykach C# i JavaScript zosta%o przedstawione w poni1-
szych fragmentach kodu:
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
62
J2zyk C#:
void Update () {
float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;
J2zyk JavaScript:
function Update () {
var h : float = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
var v : float = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;
Zadeklarowane zmienne:
h
dla osi poziomej i
v
dla osi pionowej mog%yby zosta2 dowolnie
nazwane, jednak1e u1ywanie pojedynczych liter jest po prostu szybsze. Ogólnie mówi!c, zazwy-
czaj powinno si' tworzy2 standardowe nazwy, poniewa1 niektóre pojedyncze litery nie mog!
by2 u1ywane. Na przyk%ad nazwy zmiennych
x
,
y
i
z
s! u1ywane do przechowywania warto#ci
wspó%rz'dnych i dlatego te1 zarezerwowano je wy%!cznie do tych zastosowa*.
Poniewa1 warto#ci osi mog! zawiera2 si' w przedziale od
-1
do
1
, zmienne s! liczbami dziesi't-
nymi i musimy je deklarowa2 z u1yciem typu zmiennoprzecinkowego. Mno1y si' je nast'pnie
za pomoc! symbolu gwiazdki
*
przez parametr
Time.deltaTime
. Oznacza to, 1e wyznaczana
warto#2 jest dzielona przez liczb' klatek na sekund' (parametr
deltaTime
jest czasem tworzenia
kolejnych klatek lub czasem liczonym od ostatniego wywo%ania funkcji
Update()
). Wynika st!d,
i1 warto#2 osi!ga pewn! spójn! wielko#2 na sekund', niezale1nie od szybko#ci klatek.
W kolejnym kroku zwi'kszamy warto#2 wynikow!, mno1!c j! przez zmienn! publiczn!, któr!
utworzyli#my wcze#niej, czyli
moveSpeed
. Oznacza to, 1e mimo i1 warto#ci
h
i
v
s! zmiennymi
lokalnymi, mo1emy wci!1 na nie wp%ywa2 poprzez modyfikowanie zmiennej publicznej
moveSpeed
,
dost'pnej w panelu Inspector, poniewa1 jest ona sk%adnikiem u1ywanego przez nas równania.
Jest to cz'sto spotykane rozwi!zanie podczas tworzenia skryptów, gdy1 wykorzystuje ono zalet'
u1ycia publicznie dost'pnych ustawie* po%!czonych z okre#lonymi warto#ciami generowanymi
przez funkcj'.
Zrozumienie zasady dzia$ania
polecenia Translate
Aby rzeczywi#cie u1y2 stworzonych zmiennych w celu przemieszczenia obiektu, musimy zasto-
sowa2 polecenie
Translate
. Podczas implementowania dowolnego fragmentu kodu musisz by2
pewien, 1e rozumiesz jego dzia%anie.
Translate
jest poleceniem pochodz!cym z klasy
Transform
: http://unity3d.com/support/
documentation/ScriptReference/Transform.html.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
63
Jest to klasa informacji przechowuj!ca w%a#ciwo#ci po%o1enia, obrotu i skali danego obiektu.
Zawiera ona równie1 funkcje, które mog! by2 u1ywane w celu jego przemieszczania lub
obracania.
Oczekiwane u1ycie funkcji
Translate
wygl!da nast'puj!co:
Transform.Translate(Vector3);
Istnienie parametru
Vector3
oznacza, 1e funkcja
Translate
wymaga jego u1ycia w formie g%ów-
nego argumentu. Dane reprezentowane przez
Vector3
s! po prostu informacjami zawieraj!cymi
warto#ci wspó%rz'dnych X, Y i Z. W naszym konkretnym przypadku oznaczaj! koordynaty
przesuni'cia obiektu.
Implementacja funkcji Translate
Zaimplementujmy polecenie
Translate
, u1ywaj!c utworzonych przez nas warto#ci wej#ciowych
h
i
v
i umieszczaj!c je w parametrze
Vector3
.
J2zyki C# i JavaScript:
Umie#2 poni1szy wiersz kodu wewn!trz funkcji
Update()
w Twoim skrypcie, a dok%adniej pomi'-
dzy jej otwieraj!cym
{
i zamykaj!cym
}
nawiasem klamrowym. Zwró2 uwag' na to, 1e zapis
wygl!da identycznie w obu j'zykach:
transform.Translate(h, v, 0);
Mo1emy tu skorzysta2 ze s%owa
transform
, poniewa1 wiemy, 1e dowolny obiekt, któremu
udost'pnimy skrypt, b'dzie wykorzystywa2 komponent
Transform
. Przy%!czone komponenty
danego obiektu mog! by2 adresowane poprzez u1ycie ich nazw zapisanych ma%ymi literami,
natomiast dost'p do komponentów innych obiektów wymaga zastosowania polecenia
GetComponent
i odpowiedniej nazwy zaczynaj!cej si' od wielkiej litery, na przyk%ad:
GameObject.Find("NazwaInnegoObiektu").GetComponent<Transform>.Translate(h,v,0);
W naszym przypadku nie musimy wykorzystywa2 powy1szej formy zapisu. Dost'p do kompo-
nentów przy%!czonych do innych obiektów zosta% dok%adniej opisany w podrozdziale rozdzia%u 4.,
zatytu%owanym „Komunikacja mi'dzyskryptowa oraz sk%adnia z kropk!”.
W skrypcie u1yjemy bie1!cej warto#ci zmiennej
h
dla osi X oraz
v
dla osi Y, natomiast osi Z
przeka1emy po prostu warto#2
0
, poniewa1 nie chcemy si' przesuwa2 do przodu ani do ty%u.
Zapisz teraz swój skrypt, u1ywaj!c opcji menu g%ównego File/Save (plik/zapisz), a nast'pnie wró2
do #rodowiska Unity. Zapami'taj tworzon! scen' za pomoc! opcji File/Save Scene As (plik/zapisz
scen' jako) i nazwij j! Prototype.
&rodowisko Unity zaproponuje zapisanie jej w domy#lnym folderze Assets (zasoby). Powiniene#
zawsze si' upewnia2, 1e zapami'tujesz sceny w tym folderze, poniewa1 w przeciwnym razie
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
64
nie b'dziesz mia% do nich dost'pu z panelu Project (projekt). By zapewni2 idealny porz!dek,
mo1esz tak1e utworzy2 podkatalog wewn!trz folderu Assets, w którym b'dziesz przechowywa2
swoje sceny. Takie dzia%anie nie jest jednak wymagane, lecz ogólnie uwa1a si' je za dobry wzo-
rzec post'powania.
Testujemy bie&%c% wersj# gry
W #rodowisku Unity mo1esz testowa2 gr' w ka1dym momencie, przy za%o1eniu, 1e skrypty nie
zawieraj! 1adnych b%'dów. Je#li w skryptach wykryto jakie# problemy, b'dziesz musia% je roz-
wi!za2 przed u1yciem trybu grania.
Gdy b%'dy zostan! naprawione, pasek Console (konsola), znajduj!cy si' na dolnej kraw'dzi
interfejsu Unity, nie b'dzie zawiera2 1adnych informacji. Pasek Console wy#wietla najnowsze wpisy
pojawiaj!ce si' w konsoli Unity. Mo1esz j! wy#wietli2, wybieraj!c opcj' menu Window/Console
(okno/konsola) (skrót klawiszowy to Ctrl+Shift+C dla PC lub Command+Shift+C dla kompu-
terów Mac). Ka1dy b%!d zostanie wy#wietlony na czerwono. Dwukrotne jego klikni'cie umo1liwi
wy#wietlenie odpowiedniego fragmentu skryptu, który spowodowa% pojawienie si' problemu.
Wi'kszo#2 b%'dów polega na pomini'ciu jakiego# znaku lub b%'dnym zapisie, dlatego te1 zawsze
dok%adnie sprawdzaj, co napisa%e#.
Je#li Twoja gra jest wolna od b%'dów, kliknij przycisk Play (granie), znajduj!cy si' w górnej cz'#ci
okna Unity, aby przej#2 do trybu grania. B'dziesz móg% porusza2 obiektem
Main Camera
za
pomoc! klawiszy strza%ek góra, dó%, lewo i prawo lub ich odpowiedników: W, A, S i D, tak jak
zaprezentowano na poni1szym rysunku.
Gdy przetestowa%e# ju1 gr' i upewni%e# si', 1e dzia%a poprawnie, ponownie naci#nij przycisk
Play, aby opu#ci2 tryb grania.
Uwaga
Opuszczenie trybu grania przed kontynuowaniem pracy jest wa$ne, poniewa$ podczas jego wy"-czania
wszystkie zmodyfikowane ustawienia komponentów i obiektów u$ywanych w bie$-cej scenie nie zostan-
zapami'tane. Pozostawienie rodowiska Unity w trybie grania i wprowadzanie dalszych modyfikacji b'dzie
oznacza"o, $e po prostu utracisz wyniki swojej pracy.
Uko*czmy prototyp mechaniki gry poprzez uzupe%nienie go o mo1liwo#2 wystrzeliwania poci-
sków w kierunku #ciany, aby j! zburzy2.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
65
Tworzenie pocisku
Aby wystrzeli2 pocisk w kierunku #ciany, musimy w ramach bie1!cej sceny najpierw go utwo-
rzy2, a nast'pnie zapami'ta2 w postaci prefabrykatu.
Uwaga
Prefabrykat jest obiektem gry, przechowywanym w projekcie w postaci zasobu. Zasób ten mo$e by&
konkretyzowany, czyli tworzony w trakcie dzia"ania gry, a nast'pnie przetwarzany poprzez u$ycie kodu.
Tworzenie prefabrykatu pocisku
Rozpocznij od klikni'cia przycisku Create (stwórz), znajduj!cego si' na górnej kraw'dzi panelu
Hierarchy (hierarchia). Nast'pnie z podr'cznego menu wybierz opcj' Sphere (kula). Jak wcze-
#niej wspomniano, dost'p do tworzenia kszta%tów podstawowych jest równie1 mo1liwy za
pomoc! opcji menu g%ównego GameObject/Create/Other (obiekt gry/utwórz/inny).
Teraz upewnij si', 1e utworzona przez Ciebie kula zosta%a zaznaczona w panelu Hierarchy,
a pó8niej przemie#2 kursor myszy na widok Scene (scena) i naci#nij klawisz F, by skoncentrowa2
si' na wybranym obiekcie.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
66
Uwaga
Je li Twoja kula ma takie samo po"o$enie, jak który z innych obiektów, mo$esz w prosty sposób przej &
do narz'dzia translacji (
W
), a nast'pnie przeci-gn-& uchwyt odpowiedniej osi, aby odsun-& j- od zas"a-
niaj-cego elementu. Po tej operacji ponownie skoncentruj widok na kuli poprzez naci ni'cie klawisza
F
.
Spogl!daj!c na panel Inspector (inspektor), mo1esz zauwa1y2, 1e podczas dodawania nowych
obiektów o kszta%tach podstawowych #rodowisko Unity oprócz istniej!cego komponentu
Transform
automatycznie przypisuje im trzy nowe komponenty. S! to:
1.
Mesh Filter
(filtr siatki). S%u1y do modyfikowania kszta%tu.
2.
Renderer
(renderer). S%u1y do modyfikowania wygl!du.
3.
Collider
(zderzacz). S%u1y do zarz!dzania interakcjami (zwanymi kolizjami) z innymi
obiektami.
Tworzenie i przypisywanie materia&u
Wygl!d pocisku da si' zmodyfikowa2 poprzez stworzenie materia%u, który mo1emy przekaza2
do renderera. Gdy chcesz zmieni2 wygl!d obiektu, powiniene# najcz'#ciej odszuka2 odpowied-
nie ustawienia zwi!zane z jakim# komponentem typu
Renderer
. W przypadku obiektów 3D
b'dzie to
Mesh Renderer
(renderer siatki), a dla systemów cz!stek b'dzie to
Particle Renderer
(renderer cz!stek) itd.
Aby zachowa2 porz!dek, utworzymy nowy podkatalog wewn!trz folderu Assets. B'dziemy w nim
przechowywa2 wszystkie materia%y u1ywane w bie1!cym projekcie. W panelu Project kliknij
przycisk Create, a nast'pnie z podr'cznego menu wybierz opcj' Folder (katalog). Zmie* jego
nazw' na Materials poprzez naci#ni'cie klawisza F2 (PC) lub Return (Mac). Teraz umie#2 w nim
materia% czerwonej ceg%y, który zosta% wcze#niej przez Ciebie stworzony.
Uwaga
Aby w panelu
Project
utworzy& nowy zasób w istniej-cym folderze, po prostu go wybierz, a nast'pnie
rozpocznij operacj' tworzenia poprzez klikni'cie przycisku
Create
.
Teraz utworzymy potrzebny materia% i zastosujemy go w naszym obiekcie:
1. Upewnij si', 1e folder Materials jest zaznaczony, a nast'pnie kliknij przycisk Create,
znajduj!cy si' w panelu Project. Z wy#wietlonego menu podr'cznego wybierz opcj'
Material (materia%). Spowoduje to utworzenie zasobu New Material, którego nazw'
powiniene# zmieni2 na bulletColor lub podobn!, przypominaj!c! Ci, 1e powinien
on zosta2 przypisany do pocisku.
2. Maj!c zaznaczony nowo utworzony materia%, kliknij obszar koloru, aby otworzy2 okno
Color Picker. Pó8niej wybierz jaki# odcie* koloru niebieskiego i zamknij to okno.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
67
3. Po wybraniu koloru przeci!gnij materia% bulletColor z panelu Project i upu#2 go na
nazwie kuli w panelu Hierarchy. Spowoduje to przypisanie materia%u do interesuj!cego
Ci' obiektu.
Uwaga
Je li chcesz sprawdzi&, jak b'dzie wygl-da& materia" przypisany do trójwymiarowego obiektu w rodo-
wisku Unity, mo$esz go przeci-gn-& do widoku
Scene
, a nast'pnie umie ci& kursor myszy nad okre lon-
siatk-. System Unity zaprezentuje podgl-d obiektu w wybranym kolorze. Aby uniewa$ni& wybór, mo$esz
przesun-& kursor poza obszar widoku lub nacisn-& klawisz
Esc
. By zastosowa& materia", zwalniasz po
prostu przycisk myszy.
Dodawanie parametrów fizycznych za pomoc, komponentu Rigidbody
Poprzez dodanie komponentu
Rigidbody
musimy zapewni2 to, 1e silnik fizyczny b'dzie móg%
sterowa2 pociskiem Sphere. Wybierz obiekt Sphere z panelu Hierarchy, a nast'pnie opcj'
Component/Physics/Rigidbody (komponent/parametry fizyczne/bry%a sztywna) z menu g%ównego.
Komponent bry%y sztywnej zosta% dodany, a jego parametry mog! by2 modyfikowane w panelu
Inspector. Na potrzeby obecnego prototypu nie musimy jednak niczego zmienia2.
Przechowywanie obiektów
jako prefabrykatów
Poniewa1 powinni#my wystrzeliwa2 pocisk w chwili, gdy gracz naci#nie jaki# klawisz, nie
chcemy, aby znajdowa% si' on ca%y czas w scenie. Zamiast tego powinien by2 przechowywany
i konkretyzowa2 si' dopiero podczas naciskania klawisza. Z tego powodu b'dziemy zapisywa2 nasz
obiekt w postaci prefabrykatu, a nast'pnie u1ywa2 skryptu w celu jego konkretyzacji (to znaczy
tworzenia jego instancji) w momencie naciskania klawisza.
Uwaga
Prefabrykaty w rodowisku Unity pozwalaj- na przechowywanie obiektów gry, które zosta"y zdefinio-
wane w okre lony sposób. Na przyk"ad mo$esz odpowiednio skonfigurowa& obiekt wrogiego $o"nierza,
zawieraj-cy pewne skrypty i w"a ciwo ci, które definiuj- jego zachowanie. Nast'pnie mo$esz zapisa&
ten obiekt w postaci prefabrykatu i w razie konieczno ci konkretyzowa& go. Podobnie móg"by u$ywa&
innego $o"nierza, zachowuj-cego si' odmiennie, który by"by kolejnym prefabrykatem. Móg"by tak$e
utworzy& instancj' pierwszego obiektu, a pó6niej zmodyfikowa& ustawienia jego komponentów, aby po
konkretyzacji porusza" si' wolniej lub szybciej. System prefabrykatów udost'pnia szeroki zakres swobody
w tym wzgl'dzie.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
68
Kliknij przycisk Create (stwórz), znajduj!cy si' na górze panelu Project (projekt), a nast'pnie
wybierz opcj' Folder (folder). Zmie* nazw' nowo utworzonego katalogu na Prefabs. W kolejnym
kroku przeci!gnij obiekt Sphere z panelu Hierarchy (hierarchia) i upu#2 go na folder Prefabs
w panelu Project. Przeci!gni'cie obiektu gry w dowolny obszar panelu Project spowoduje, 1e
zostanie on zapami'tany jako prefabrykat. Folder Prefabs zosta% przez nas utworzony jedynie
w celu zapewnienia porz!dku i stosowania si' do dobrych wzorców post'powania. Zmie* nazw'
nowo utworzonego prefabrykatu na Projectile.
Mo1esz ju1 usun!2 oryginalny obiekt Sphere z panelu Hierarchy: wybierz go, a nast'pnie na-
ci#nij klawisz Delete (PC) lub Command+Backspace (Mac). Alternatyw! dla tego rozwi!zania
jest klikni'cie prawym klawiszem myszy obiektu w panelu Hierarchy i wybranie opcji Delete
(usu*) z menu podr'cznego.
Wystrzelenie pocisku
Wró2my do skryptu Shooter, który w%a#nie tworzymy. W tym celu kliknij dwukrotnie jego ikon',
znajduj!c! si' w panelu Project, lub wybierz go, a nast'pnie kliknij przycisk Open (otwórz),
wy#wietlany na górze okna Inspector (inspektor).
U1yjemy wcze#niej zadeklarowanej zmiennej
bullet
, b'd!cej odwo%aniem do okre#lonego
obiektu, który zamierzamy skonkretyzowa2. Gdy tylko obiekt zostanie utworzony z prefabrykatu,
zastosujemy odpowiednie dzia%anie, aby wystrzeli2 go w kierunku #ciany znajduj!cej si' w scenie.
W funkcji
Update()
po wierszu
transform.Translate(h, v, 0)
dodaj nast'puj!cy kod, niezale1-
nie od tego, jakiego j'zyka programowania u1ywasz:
if(Input.GetButtonUp("Fire1")){
}
Polecenie
if
sprawdza, czy klawisz przypisany do wej#ciowego przycisku
Fire1
zosta% zwolniony.
Domy#lnie jest on odwzorowany na lewy klawisz Ctrl lub lewy przycisk myszy. Mo1esz go jed-
nak przypisa2 do innego klawisza, wprowadzaj!c odpowiedni! modyfikacj' w mened1erze
wej#2, co mo1na zrobi2 przez wybranie opcji menu g%ównego Edit/Project Settings/Input
(edycja/ustawienia projektu/wej#cia).
U&ycie funkcji Instantiate()
do konkretyzowania obiektów
Wewn!trz polecenia
if
(to znaczy pomi'dzy otwieraj!cym i zamykaj!cym nawiasem klamrowym)
umie#2 nast'puj!cy wiersz kodu:
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
69
J2zyk C#:
Rigidbody instance = Instantiate(bullet, transform.position,
transform.rotation) as Rigidbody;
J2zyk JavaScript:
var instance: Rigidbody = Instantiate(bullet, transform.position,
transform.rotation);
Jak wida2, stworzyli#my now! zmienn! zwan!
instance
. Przechowujemy w niej referencj' do
funkcji tworz!cej nowy obiekt o typie
Rigidbody
.
Polecenie
Instantiate
wymaga podania trzech parametrów:
Instantiate(co naleay stworzy;, gdzie naleay stworzy;, wielko@; obrotu);
W naszym przypadku chcemy, aby zosta%a utworzona instancja obiektu lub prefabrykatu, który
zosta% przypisany do zmiennej publicznej
bullet
. Po%o1enie i obrót instancji pobierzemy
z komponentu
transform
, u1ywanego w obiekcie, do którego zosta% przydzielony skrypt, czyli
Main Camera
. Dlatego te1 w skryptach b'dziesz móg% cz'sto zauwa1y2 zapis
transform.position
,
odnosz!cy si' do ustawie* zwi!zanych z komponentem
transform
i dotycz!cy po%o1enia obiektu,
do którego zosta% przy%!czony dany skrypt.
Zauwa1, 1e w j'zyku C# musisz umie#ci2 s%owo
Rigidbody
za wywo%aniem funkcji
Instantiate
,
aby jawnie wskaza2 typ danych.
Przy&o.enie wektora si&y do bry&y sztywnej
Po utworzeniu obiektu musimy go natychmiast wystrzeli2, u1ywaj!c w tym celu polecenia
AddForce()
. Dzia%a ono tak:
Rigidbody.AddForce(kierunek i wielko@; wektora si:y podane jako typ Vector3);
Zanim wi'c przy%o1ymy wektor si%y, musimy stworzy2 referencj' do kierunku, w którym chcemy
strzela2. Kamera jest zwrócona w stron' #ciany z cegie%, wi'c sensowne jest, by oddawa2 strza%y
w tym w%a#nie kierunku. Poni1ej wiersza zawieraj!cego funkcj'
Instantiate()
, a jednocze#nie
wci!1 w obr'bie polecenia
if
, umie#2 nast'puj!cy kod:
J2zyk C#:
Vector3 fwd = transform.TransformDirection(Vector3.forward);
J2zyk JavaScript:
var fwd: Vector3 = transform.TransformDirection(Vector3.forward);
Utworzyli#my zmienn!
fwd
o typie
Vector3
i przypisali#my jej kierunek do przodu dla kom-
ponentu
transform
w obiekcie, do którego jest przy%!czony nasz skrypt.
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Projektowanie gier w "rodowisku Unity 3.x
70
Polecenie
TransformDirection
mo1e zosta2 u1yte w celu przekszta%cenia lokalnego kierunku —
w naszym przypadku kierunku wskazywania kamery — na kierunek #wiata. Obiekty oraz #wiat
maj! w%asne systemy wspó%rz'dnych, wi'c mo1e si' zdarzy2, 1e kierunek wskazywania do
przodu dla jakiego# obiektu nie musi koniecznie odpowiada2 w%a#ciwemu kierunkowi #wiata.
Wynika st!d, i1 w takich przypadkach konwersja jest niezb'dna. Konstrukcja
Vector3.forward
,
u1yta w powy1szym kontek#cie, jest zwyk%ym uproszczeniem zapisu
Vector3(0, 0, 1)
. Wyst'-
puje w nim warto#2 jednostkowa d%ugo#ci dla osi Z.
Wreszcie b'dziemy mogli wystrzeli2 pocisk przez odwo%anie si' do naszej zmiennej, która
reprezentuje nowo utworzony obiekt
instance
, a nast'pnie u1ycie polecenia
AddForce()
w celu
przy%o1enia si%y w kierunku zdefiniowanym w zmiennej
fwd
, mno1!c j! przez wcze#niej utworzon!
zmienn! publiczn!
power
. Dodaj poni1szy wiersz kodu bezpo#rednio pod tym, który poprzednio
umie#ci%e# w skrypcie:
J2zyki C# i JavaScript:
instance.AddForce(fwd * power);
Zapami'taj skrypt i wró2 do #rodowiska Unity.
Zanim przetestujemy dzia%anie uko*czonej mechaniki gry, musimy przypisa2 prefabrykat
Projectile do zmiennej publicznej
Bullet
. W tym celu wybierz obiekt
Main Camera
w panelu
Hierarchy, aby wy#wietli2 skrypt Shooter w postaci komponentu w panelu Inspector.
Nast'pnie przeci!gnij prefabrykat Projectile z panelu Project i upu#2 go na zmienn!
Bullet
w panelu Inspector w miejscu, w którym znajduje si' napis None (Rigidbody), jak przedstawiono
na poni1szym rysunku:
Po wykonaniu tej czynno#ci b'dziesz móg% zobaczy2 nazw' Projectile w obszarze zmiennej
Bullet
. Zapisz scen' za pomoc! opcji File/Save Scene (plik/zapisz scen'), a pó8niej przetestuj gr',
naciskaj!c przycisk Play znajduj!cy si' w górnej cz'#ci interfejsu.
Teraz b'dziesz móg% przemieszcza2 kamer' i strzela2 pociskami za pomoc! lewego klawisza
Ctrl na klawiaturze. Je#li chcesz zmieni2 si%' wystrza%u pocisku, po prostu zmodyfikuj zmienn!
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ
Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów
71
publiczn! Power poprzez wybranie obiektu
Main Camera
, a nast'pnie wprowadzenie innej
warto#ci w miejsce liczby
1500
przypisanej do komponentu
Shooter (Script)
. Pami'taj, aby
zawsze nacisn!2 przycisk Play w celu zako*czenia testowania.
Podsumowanie
Gratulacje! W%a#nie stworzy%e# swój pierwszy prototyp w #rodowisku Unity.
W tym rozdziale pozna%e# zasady u1ywania interfejsu Unity, obiektów gry i komponentów,
a tak1e podstawy tworzenia skryptów. Miejmy nadziej', 1e wiedza ta b'dzie solidnym funda-
mentem, na którym zostanie zbudowane dalsze do#wiadczenie w tworzeniu gier komputerowych
w #rodowisku Unity.
A teraz chwila odpoczynku. Zagraj w stworzony przez siebie prototyp gry, a mo1e stwórz kolejny
w oparciu o informacje zaprezentowane w tym rozdziale. By2 mo1e jeste# jednak 1!dny wie-
dzy — je#li tak, kontynuuj czytanie ksi!1ki!
Skoro pozna%e# ju1 podstawowe operacje dost'pne w #rodowisku projektowym Unity, zajmijmy
si' w%a#ciw! gr!, która b'dzie omawiana w dalszych rozdzia%ach tej ksi!1ki.
W nast'pnym rozdziale rozpoczniemy tworzenie gry zwanej Survival Island (wyspa przetrwania).
Poznasz, w jaki sposób mo1na b'dzie wykorzysta2 narz'dzia tworzenia terenu, aby ukszta%towa2
tropikaln! wysp', która ma nawet swój wulkan! W dalszej kolejno#ci umie#cisz na niej prefa-
brykat postaci gracza i zwiedzisz nowo utworzony raj tropikalny!
Pole
ü ksiąĪkĊ
Kup ksi
ąĪkĊ