Professional Documents
Culture Documents
Projektowanie gier w środowisku Unity 3.x - W. Goldstone (2012)
Projektowanie gier w środowisku Unity 3.x - W. Goldstone (2012)
Projektowanie gier w środowisku Unity 3.x - W. Goldstone (2012)
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.
Autor oraz Wydawnictwo HELION dooyli wszelkich stara, by zawarte w tej ksice informacje
byy kompletne i rzetelne. Nie bior jednak adnej odpowiedzialnoci ani za ich wykorzystanie,
ani za zwizane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz
Wydawnictwo HELION nie ponosz równie adnej odpowiedzialnoci za ewentualne szkody
wynike z wykorzystania informacji zawartych w ksice.
Wydawnictwo HELION
ul. Kociuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (ksigarnia internetowa, katalog ksiek)
Drogi Czytelniku!
Jeeli chcesz oceni t ksik, zajrzyj pod adres
http://helion.pl/user/opinie/prgun3_ebook
Moesz tam wpisa swoje uwagi, spostrzeenia, recenzj.
Printed in Poland.
x Oceń książkę
Spis treci
Przedmowa 9
O autorze 11
O recenzentach 12
Wstp 15
Okno Project 39
Widok Game 40
Podsumowanie 40
4
Spis treci
5
Projektowanie gier w rodowisku Unity 3.x
6
Spis treci
7
Projektowanie gier w rodowisku Unity 3.x
Sowniczek 441
Skorowidz 451
8
Przedmowa
Osignicie obecnego poziomu nie byo proste. ylimy w niewygodzie, powicajc pracy
cae dnie i noce, spoywajc stosy kanapek i tworzc strony internetowe dla firm prawniczych.
Od jednego z potencjalnych inwestorów (który w kocu zrezygnowa z transakcji) usyszeli-
my kiedy, e nasze marzenie o „zdemokratyzowaniu procesu projektowania gier” ma jedn
szans na sto, by si urzeczywistni .
Mimo e Will pracuje obecnie w Unity Technologies, wci posiada bardzo due dowiadczenie
zwizane z nauczaniem i pomaga nam we wspieraniu pocztkujcych uytkowników poprzez
tworzenie materiaów szkoleniowych, prowadzenie wykadów oraz aktywne uczestnictwo
w naszej spoecznoci. Kolejne wydanie ksiki Projektowanie gier w rodowisku Unity 3.x,
które trzymasz w rkach (lub wywietlasz na ekranie laptopa albo komputera stacjonarnego),
zostao cakowicie odnowione, jednake zachowao wszystkie elementy skadajce si na sukces
Projektowanie gier w rodowisku Unity 3.x
pierwszego wydania. Kady rozdzia ksiki zosta poszerzony, ulepszony lub uzupeniony.
Obecnie zawieraj one opisy wielu opcji, które w tym czasie pojawiy si w rodowisku Unity.
Mimo tego ksika nie skada si jedynie z prezentacji samych nowoci. Will dokadnie omawia
podstawy uytkowania systemu oraz stosowania skryptów, a nawet próbuje rozwiza odwieczn
zagadk Unity: jakiego jzyka naley uywa: C# czy JavaScript?. Dziki omówieniu w ksice
obu jzyków masz moliwo wybrania tego, który bardziej Ci odpowiada.
Bez wzgldu na to, czy jeste grafikiem, projektantem poziomów, czy po prostu modym czowie-
kiem wybierajcym dziedzin tworzenia gier komputerowych jako ciek swojej potencjalnej
kariery zawodowej, ksika ta jest fascynujcym poradnikiem pozwalajcym na zdobycie wiedzy
o dziaaniu rodowiska Unity. Rozpoczynajc od zapoznania si z podstawami grafiki trójwy-
miarowej, bdziesz móg nauczy si wszystkiego od samego pocztku. Nie jest tu wymagana
adna wstpna wiedza, a mimo tego ksika zachowuje odpowiednie tempo, pozwalajc Ci na
przewracanie jej kartek i tworzenie kodu!
Chciabym osobicie powita Ci w spoecznoci Unity. Mam nadziej, e bdziesz mia tyle
radoci z przeczytania tej ksiki, ile my mamy dziki pracy w Unity Technologies.
David Helgason
Prezes i wspózaoyciel Unity Technologies
10
O autorze
Will Goldstone od dawna naley do spoecznoci Unity. Pracujc w firmie Unity Technologies,
oferuje wsparcie techniczne, zajmuje si zagadnieniami edukacyjnymi, kontaktami ze spo-
ecznoci oraz udzielaniem pomocy projektantom. Stopie naukowy zwizany z kreatywn
edukacj oraz wieloletnie dowiadczenie w pracy jako wykadowca wyszej uczelni pomogy
mu w napisaniu pierwszej na rynku ksiki dotyczcej rodowiska Unity, zatytuowanej Unity
Game Development Essentials, a take w stworzeniu odpowiednich poradników wideo. Wyko-
rzystujc swoj stron internetow http://www.unity3dstudent.com, Will zaprasza codziennie
nowych uytkowników do rozwijajcej si spoecznoci projektantów gier. Nieregularnie publi-
kuje take swoje artykuy na stronie http://willgoldstone.com.
Oto osoby, którym chciabym podzikowa za wsparcie przy tworzeniu niniejszej ksiki, jak równie za to,
e byy po prostu wspaniae: Teck Lee Tan (@LoTeKk) (podzikowanie za stworzenie zasobów graficz-
nych); wszyscy wojownicy ninja z Unity Technologies: Rune Skovbo Johansen, Nicholas Francis (@unitynich),
David Helgason (@davidhelgason), Joachim Ante, Graham Dunnett, Andy Brammall (@andybrammall),
Andy Stark, Charles Hinshaw, Roald Hoyer-Hansen (@brokenpoly), Carl Callewaert (@carlunity), Chris
Pope (@CreativeChris1), Dave Shorter, Mark Harkness (@IAmRoflHarris), Ricardo Arango, Rob Fairchild
(@robfairchild), Olly Nicholson, Cathy Yates, Adam Buckner, Richard Sykes, Emil Johansen (@AngryAnt),
Ethan Vosburgh, Joe Robins (@JoeRobins)… i wiele innych wspaniaych osób, których nie mogem tu
wymieni!
Na licie musz si take pojawi moi przyjaciele, którzy s zwizani z Unity: Bob Berkebile (@pixelpla-
cement), Tom Jackson (@quickfingerz), Thomas Pasieka (@thomaspasieka), Cat Burton (@catburton),
Mike Renwick (@runonthespot), Mark Backler, Russ Morris (@therussmorris), Jasper Stocker (@jas-
perstocker), Paul Tondeur (@paultondeur), David Fugère-Lamarre, Benjamin Lee, Steffen Franz, Aaron
Grove, Bastien Fontaine. Nie mog oczywicie zapomnie o Mamie, Tacie, Rach, Penny i pozostaych
przyjacioach.
Projektowanie gier w rodowisku Unity 3.x
O recenzentach
Rune Skovbo Johansen od 2009 roku naley do zespou projektantów w firmie Unity Techno-
logies. Zajmuje si poszerzaniem moliwoci edytora oraz usprawnianiem interfejsu i sposobu
dziaania systemu. Rune mieszka w Danii, w Kopenhadze. Oprócz zada zwizanych z edycj
opracowa szereg formalnych narzdzi animacyjnych, by wspóautorem dokumentacji rodowiska
Unity, a take uczestniczy w programowaniu wielu oficjalnych pakietów prezentacyjnych.
Ogólnie rzecz biorc, Rune pasjonuje si tworzeniem rozwiza, które sprawiaj, e zaawan-
sowana, a jednoczenie interesujca technologia staje si przyjazna dla uytkownika. Ukoczone
studia z dziedziny tworzenia gier i multimediów pozwalaj mu stosowa twórcze i interdyscy-
plinarne podejcie do projektowania oprogramowania. Rune od samego dziecistwa interesuje
si grafik, animacj i kodowaniem.
W wolnym czasie Rune preferuje czytanie ksiek, lubi uprawia turystyk piesz w parkach
i lasach oraz codziennie jedzi na rowerze. Powica take swój czas na tworzenie grafiki
i animacji oraz projektowanie nieduych gier. Jest zawsze bardzo zainteresowany procedural-
nym podejciem do zagadnie i wci próbuje odkry najlepszy sposób pozwalajcy zmusi
komputer do wygenerowania olbrzymich, a jednoczenie nieregularnych wiatów wirtualnych.
Swoje projekty prezentuje na stronie http://runevision.com.
Mark Backler jest projektantem gier, który zajmuje si tym zagadnieniem od ponad piciu lat.
Poprzednio pracowa w firmach EA i Kuju, a obecnie jest zatrudniony w Lionhead Studios i two-
rzy gr Fable. The Journey. Wspópracowa przy wielu projektach — tworzy midzy innymi gry,
takie jak Harry Potter i Zakon Feniksa, Milo i Kate oraz Fable 2, która otrzymaa nagrod BAFTA.
Jest dostpny na Twitterze jako @MarkBackler.
12
O recenzentach
Chciabym podzikowa Willowi za napisanie tej ksiki, która pomoga mi sprawnie rozpocz prac
w rodowisku Unity, Catowi przede wszystkim za moliwo poznania Willa, utalentowanym i twórczym
osobom z firmy Lionhead, od których ucz si kadego dnia, moim przyjacioom, w szczególnoci Anis-
howi, Tomowi oraz Chuckowi, a wreszcie mojej rodzinie za to, e jest po prostu wspaniaa.
Bdc zatrudnionym w firmie Creative Patterns (Strasburg, Francja), Bastien uywa rodowiska
Unity, aby tworzy oprogramowanie na platform iPhone.
Pracowa take w firmie Illogika Studio (Montreal, Kanada), w której równie projektowa gry dla
iPhone’a. Wspópracowa tam z Davidem Fugère’em-Lamarre’em, innym recenzentem niniejszej
ksiki.
13
Projektowanie gier w rodowisku Unity 3.x
Chciabym podzikowa autorowi za moliwo udostpnienia czytelnikom mojej wiedzy oraz profesjo-
nalnego dowiadczenia z silnikiem Unity. Przede wszystkim chciabym przekaza podzikowania mojej
rodzinie, a w szczególnoci dwuletniemu brzdcowi, który dziki temu, e uwielbia spa, pozwoli mi na
zrecenzowanie niniejszej ksiki. Mam nadziej, e udowodni ona, jak ambitnym, a jednoczenie cieka-
wym zajciem jest programowanie gier komputerowych.
Aaron Grove jest nagrodzonym szefem zespou tworzcego efekty wizualne, posiadajcym ponad
dziesicioletnie dowiadczenie w swojej pracy. Tworzy najwyszej jakoci efekty wizualne dla
reklam telewizyjnych oraz klipów wideo w Australii, Wielkiej Brytanii oraz Stanach Zjednoczo-
nych Ameryki. Kreatywno Aarona i jego wiedza o grafice trójwymiarowej oraz efektach wizu-
alnych (zarówno na poziomie technicznym, jak i artystycznym), poczone z zainteresowaniem
technologi gier komputerowych, pozwalaj mu tworzy wizualnie oszaamiajce aplikacje.
W 2010 roku Aaron zarzdza zespoem tworzcym efekty wizualne dla nagrodzonego klipu wideo
Two Weeks zespou Grizzly Bear. Obecnie jest dyrektorem twórczym oraz wspózaoycielem
firmy Blowfish Studios, która zajmuje si wycznie projektowaniem gier przy uyciu rodowi-
ska Unity. Wicej informacji mona znale na stronie http://www.blowfishstudios.com.
Ben Lee jest inynierem oprogramowania i od trzynastu lat zajmuje si zagadnieniami zwiza-
nymi z grami komputerowymi. Realizowa projekty dla firm EA, Intel, nVidia oraz 3M. Ma bogate
dowiadczenie w projektowaniu i programowaniu silników gier komputerowych, a take w innych
aspektach tworzenia oprogramowania na róne platformy sprztowe. Ostatnio wspózaoy firm
Blowfish Studios (http://www.blowfishstudios.com) i od tej pory skoncentrowa si wycznie
na projektowaniu gier przy uyciu rodowiska Unity.
14
Wstp
Silniki gier takie jak Unity s znanymi, docenianymi, a przede wszystkim potnymi narz-
dziami wspierajcymi tworzenie gier. rodowisko Unity jest jednym z najczciej uywanych
oraz najbardziej cenionych pakietów pozwalajcych na projektowanie gier komputerowych. Moe
by ono wykorzystywane przez szerokie spektrum uytkowników, poczynajc od hobbystów,
a koczc na duych firmach; pozwala tworzy gry oraz interaktywne aplikacje dla przegldarek
internetowych, komputerów stacjonarnych, urzdze przenonych oraz konsol. Dziki intuicyj-
nemu i prostemu w obsudze zestawowi narzdzi rodowiska Unity oraz niniejszej ksice moesz
tak atwo jak nigdy dotd sta si twórc gier komputerowych.
Ksika udostpnia szereg prostych do wykonania przykadów, których zwieczeniem jest stwo-
rzenie gry 3D wykorzystujcej perspektyw pierwszej osoby oraz interakcyjne rodowisko
zdefiniowane w postaci wyspy. Wszystkie koncepcje zaprezentowane w ksice mog zosta
zastosowane w innych rodzajach gier. Dziki wprowadzeniu ogólnych poj zwizanych z two-
rzeniem gier i rodowisk trójwymiarowych bdziesz móg uy systemu Unity w celu okrelenia
poziomu interakcyjnoci gracza ze wiatem gry oraz zaplanowania zada, które powinien on
rozwiza , by j ukoczy . Pod koniec ksiki bdziesz dysponowa w peni dziaajc gr
trójwymiarow oraz umiejtnociami pozwalajcymi na jej rozbudow i udostpnienie koco-
wemu uytkownikowi, czyli graczowi, najpeniejszych wrae odbioru. Wkrótce w prosty sposób
bdziesz tworzy wasne gry 3D oraz aplikacje interakcyjne!
Projektowanie gier w rodowisku Unity 3.x
Rozdzia 3. „Tworzenie rodowiska”. Gdy wiesz ju, jak naley uywa systemu Unity i jego pro-
cesów, moesz rozpocz projektowanie wiata zewntrznego za pomoc narzdzia Terrain, co
umoliwi Ci utworzenie rodowiska w postaci wyspy.
Rozdzia 6. „Kolekcja, inwentarz i HUD”. Masz ju wiedz o procesie interakcji, ale moesz
j lepiej wykorzysta , jeli nauczysz si, jak stworzy dla gracza prosty inwentarz oraz zwi-
zany z nim przezroczysty wywietlacz (HUD), w którym bd prezentowane zgromadzone
przedmioty.
Rozdzia 9. „Projektowanie menu”. Kada dobra gra wymaga uycia interfejsu uytkownika.
W tym rozdziale zapoznamy si z dwoma sposobami tworzenia menu w rodowisku Unity: za
pomoc komponentów GUI Texture oraz klasy skryptowej GUI.
16
Wstp
Rozdzia 10. „Podstawy animacji”. Dziki zastosowaniu animacji gry tworzone w rodowisku
Unity staj si dynamiczne. W tym rozdziale stworzymy sekwencj kocow gry z napisami
oraz dowiemy si, w jaki sposób mona j animowa , korzystajc ze skryptów, a take z okna
Animation systemu Unity.
Rozdzia 11. „Poprawa wydajnoci i kocowe modyfikacje”. Mimo e wane jest uzyskanie dobrej
grywalnoci, przed udostpnieniem gry odbiorcom kocowym naley si upewni , i jest ona
dopracowana. W tym rozdziale zajmiemy si tworzeniem kolejnych efektów wizualnych oraz
zoptymalizujemy gr w taki sposób, by dobrze si prezentowaa i wydajnie dziaaa.
Rozdzia 12. „Budowanie i udostpnianie”. Aby rozwija swoje umiejtnoci zwizane z pro-
jektowaniem, powiniene udostpnia swoje prace innym graczom i uzyskiwa od nich infor-
macje zwrotne. W tym rozdziale dowiemy si, jak mona umieszcza gr w samodzielnym pliku
wykonywalnym lub wykorzystywa w sieciowym odtwarzaczu gier.
Rozdzia 13. „Testy i dalsze zdobywanie wiedzy”. W ostatnim rozdziale zapoznamy si z meto-
dami pozwalajcymi na otrzymywanie informacji zwrotnej od graczy, a take przekaemy kilka
porad, przydatnych projektantom chccym wykorzystywa rodowisko Unity. Zaprezentujemy
równie pozycje, które warto przeczyta , aby sta si profesjonalnym projektantem gier kom-
puterowych.
Dodatek A „Sowniczek”. Sowniczek zawiera opisy czsto uywanych terminów, które moesz
napotka , a take spenia funkcj porcznej bazy odnoników.
Czego potrzebujesz
do przeczytania tej ksiki?
Aby w peni skorzysta z tej ksiki, bdziesz musia pobra darmow wersj rodowiska Unity,
dostpn pod adresem: http://www.unity3d.com/unity/download.
Twój komputer powinien take spenia okrelone wymagania, zgodnie z informacjami poda-
nymi na stronie Unity:
17
Projektowanie gier w rodowisku Unity 3.x
Uzyskiwanie pomocy
dotyczcej ksiki i aktualizacji
Ksika ta zostaa napisana i przetestowana z wykorzystaniem rodowiska Unity w wersji 3.4.2.
Pomimo cisej kontroli tekstu w pewnych rzadkich przypadkach wydanie moe zawiera bdy
dezorientujce czytelników. Oprócz tego, w wyniku procesu rozwojowego rodowiska Unity oraz
udostpniania jego nowych wersji, pewne fragmenty ksiki bd wymaga uaktualnienia.
Konwencje
W tej ksice napotkasz kilka rónych stylów tekstu, które pozwol na odrónienie rodzajów
przekazywanych informacji. Oto kilka ich przykadów wraz z objanieniami.
Kod zawarty w tekcie jest prezentowany tak: „Przypisz zmiennej fps warto zaokrglonej
liczby klatek”.
Niektóre polecenia kodu s tak dugie, e nie mieszcz si w jednym wierszu — upewnij si,
e nie bdziesz mia do czynienia z tak sytuacj. Pamitaj, i wiersze kodu kocz si red-
18
Wstp
nikiem. Postaraj si wic, jeli to moliwe, umieszcza kod w pojedynczym wierszu. W poni-
szym przykadzie brak miejsca spowodowa, e kod zosta rozmieszczony w dwóch wierszach.
W uywanym przez Ciebie edytorze skryptów nie powiniene jednake stosowa znaku nowego
wiersza, by uzyska taki ukad:
new Vector3(Mathf.Lerp(xStartPosition, xEndPosition,
´(Time.time -startTime)*speed), transform.position.y, transform.position.z);
Nazwy polece menu lub tytuy pól w oknach dialogowych s wydrukowane kursyw: „Wybierz
opcj Plik/Zapisz w edytorze tekstów, a nastpnie wró do rodowiska Unity”.
Uwaga
Ostrzeenia lub wane uwagi pojawiaj si w takiej formie.
Wskazówka
W ten sposób s podawane wskazówki.
Pomoc techniczna
Jeli jeste ju dumnym posiadaczem ksiki Helionu, moemy zaoferowa Ci rónorodn
pomoc, która pozwoli na jak najlepsze wykorzystanie publikacji.
19
Projektowanie gier w rodowisku Unity 3.x
Errata
Mimo e podjlimy wszelkie kroki, aby zapewni najwysz jako treci tej ksiki, pomyki
si jednak zdarzaj. Jeli znajdziesz bd w jednej z naszych ksiek — by moe w tekcie
lub kodzie — bdziemy wdziczni, jeeli przelesz nam o tym informacj. Dziki temu inni
czytelnicy nie bd sfrustrowani, za my bdziemy mogli poprawi kolejne wersje ksiki. Jeli
znalaze jaki bd, przelij go do nas za pomoc formularza zgoszenia do erraty, który znaj-
duje si pod adresem: http://helion.pl/user/erraty/. Po pozytywnej weryfikacji Twojego
zgoszenia zostanie ono zaakceptowane, za errata pojawi si na naszej stronie pod adresem:
http://helion.pl/erraty.htm.
Piractwo
Piractwo internetowe materiau chronionego prawem autorskim jest cigym problemem doty-
kajcym wszystkie rodzaje mediów. Wydawnictwo Helion bardzo powanie traktuje ochron
swoich praw autorskich oraz licencji. Jeli gdzie w internecie natkne si na nielegalne kopie
naszych prac, powiadom nas o tym, przesyajc adres lub nazw strony, na której znajduj
si pirackie pliki. W tym celu wykorzystaj formularz dostpny pod adresem: http://helion.pl/
piracy.html.
Jestemy wdziczni za pomoc w chronieniu naszych autorów oraz wspieranie nas podczas
dostarczania Ci wartociowych treci.
20
1
Q wspórzdne i wektory,
Q formy trójwymiarowe,
Q materiay i tekstury,
Q dynamika bryy sztywnej,
Q wykrywanie kolizji,
Q obiekty gry i komponenty,
Q zasoby i sceny,
Q prefabrykaty,
Q interfejs edytora rodowiska Unity.
Wspórzdne
Jeli uywae ju wczeniej jakiej aplikacji 3D, najprawdopodobniej znasz pojcie osi Z.
Istniejce osie X i Y, okrelajce pooenie odpowiednio w poziomie i pionie, zostay uzupenione
o trzeci o Z, reprezentujc gbi. Mona zauway , e w aplikacjach 3D informacje o obiek-
cie s wywietlane w formacie X, Y, Z — to tak zwane wspórzdne kartezjaskie. Tak mog
zosta opisane wymiary, wartoci obrotu oraz pooenia w wiecie trójwymiarowym. W niniej-
szej ksice, tak jak w innych dokumentach zwizanych ze rodowiskiem 3D, wspórzdne 3D
s zapisywane w nawiasach, na przykad:
(3, 5, 3)
Taki zapis wynika przede wszystkim z koniecznoci zachowania porzdku oraz z faktu, e
programowanie wymaga dokadnie takiego podania wartoci wspórzdnych. Bez wzgldu na
sposób prezentacji moesz przyj , i dowolny zbiór trzech wartoci oddzielonych przecinkami
bdzie reprezentowa osie X, Y, Z.
22
Rozdzia 1. • Odkryj trzeci wymiar
wym zdefiniowano wic punkt pocztkowy, zwany pocztkiem lub punktem zerowym, który
ma wspórzdne (0, 0, 0).
Przestrze modelu zakada, e kady obiekt ma swój punkt zerowy, z którego rozpoczynaj si
osie wspórzdnych. Jest nim zazwyczaj rodek danego obiektu. Poprzez tworzenie powiza
midzy obiektami moemy porównywa ich pooenie wzgldem siebie. Oznacza to, e przy
uyciu przestrzeni modelu moemy wyznacza odlegoci od innych obiektów, wykorzystujc
wspórzdne obiektu nadrzdnego jako nowy punkt zerowy dla kadego z jego obiektów pod-
rzdnych.
Powysza uwaga jest szczególnie wana podczas pracy z zasobami graficznymi w narzdziach
modelowania 3D, gdy zawsze powiniene upewni si, e modele tworzone w uywanym
przez Ciebie pakiecie oprogramowania maj pooenie równe (0, 0, 0). Dziki temu po ich
zaimportowaniu do rodowiska Unity wspórzdne zostan poprawnie odczytane.
Q Pierwszy wykres (i) przedstawia dwa obiekty w przestrzeni wiata. Duy szecian ma
wspórzdne (3, 3), natomiast mniejszy — (6, 7).
Q Na drugim wykresie (ii) mniejszy szecian sta si obiektem podrzdnym wikszego
szecianu. Wynika std, e wspórzdne mniejszej bryy s obecnie równe (3, 4),
poniewa jej punktem zerowym jest pooenie rodzica w przestrzeni wiata.
Wektory
Bdziesz take mia do czynienia z wektorami opisanymi za pomoc wspórzdnych kartezja-
skich. Wektory 3D, podobnie jak ich dwuwymiarowe odpowiedniki, s zwykymi prostymi
umieszczonymi w przestrzeni trójwymiarowej, które maj kierunek i dugo . Wektory mog
by przemieszczane w przestrzeni wiata, lecz same si nie zmieniaj. S one przydatne
w kontekcie silnika gry, pozwalaj bowiem na wyznaczanie odlegoci, wzgldnych któw midzy
obiektami oraz ich kierunków.
23
Projektowanie gier w rodowisku Unity 3.x
Kamery
Kamery s niezbdne, poniewa funkcjonuj jako okno na ekranie monitora, przez które moemy
obserwowa wiat trójwymiarowy.
Kamery mog by umieszczane w dowolnym punkcie wiata; mog by take animowane lub
przymocowane do postaci albo obiektów w zalenoci od okrelonego scenariusza gry. W danej
scenie moe si znajdowa wiele kamer, lecz zakada si, e pojedyncza kamera gówna bdzie
zawsze wywietla to, co widzi gracz. Dlatego te w momencie, gdy rozpoczynasz tworzenie
nowej sceny, rodowisko Unity zawsze udostpnia obiekt Main Camera (kamera gówna).
24
Rozdzia 1. • Odkryj trzeci wymiar
W silnikach gier bdziesz móg zauway , e efekty, jak owietlenie czy rozmycie ruchu, s
stosowane w kamerze, aby poprawi symulacj wygldu wiata z punktu widzenia gracza. Moesz
równie dodawa pewne efekty kinowe, których ludzkie oko nigdy nie zobaczy, jak odbicie
wiata w soczewkach podczas spogldania na soce!
Dziki posiadanej wiedzy o pooeniu wierzchoków silniki gier mog przeprowadza oblicze-
nia wyznaczajce punkty zderzenia zwane kolizjami. Wykrywanie kolizji przy uyciu zoo-
nego systemu wykorzystujcego komponent Mesh Collider pozwala na przykad w strzelance
wyznaczy dokadne pooenie miejsca na obiekcie, w które uderzy pocisk. Oprócz tworzenia
25
Projektowanie gier w rodowisku Unity 3.x
trójwymiarowych ksztatów, które s widoczne dla gracza, siatki mog mie wiele innych zada.
Na przykad mog by uywane do zdefiniowania obiektu wykorzystywanego podczas wyzna-
czania kolizji, który powinien by mniej zoony od waciwego przedmiotu, lecz mie w przy-
blieniu taki sam ksztat jak on. Dziki temu uzyskuje si popraw wydajnoci, poniewa silnik
fizyczny nie musi sprawdza zoonej siatki, aby wykry kolizj. Taki przypadek jest widoczny
na poniszym rysunku, pochodzcym z podrcznika szkoleniowego tworzenia samochodu
w rodowisku Unity. Sam pojazd jest bardziej zoony ni odpowiadajca mu siatka kolizji.
26
Rozdzia 1. • Odkryj trzeci wymiar
Przy tworzeniu gier kluczowe dla projektanta staje si zrozumienie wanoci parametru liczby
wieloktów. Liczba wieloktów jest sum wieloktów w uywanych modelach, ale czasem rów-
nie w rekwizytach czy te na caym poziomie gry (w rodowisku Unity zwanym scen). Im
wiksza jest liczba wieloktów, tym wicej pracy musi powici sprzt komputerowy, by wyge-
nerowa obiekty na ekranie. Dlatego te moemy zauway rónic w poziomie szczegóowoci
midzy wczesnymi grami 3D a obecnymi. Na przykadzie gier takich jak Quake (1996) firmy id
Software oraz Gears Of War (2006) firmy Epic zwró uwag na to, jak w cigu jednej dekady
zmieni si ten poziom. W wyniku postpu technologicznego projektanci mog obecnie mode-
lowa postacie i wiaty trójwymiarowe dla gier, które zawieraj duo wicej wieloktów, a dziki
temu maj odpowiednio lepszy poziom realizmu. Ta tendencja bdzie aktualna równie w kolej-
nych latach. Poniewa coraz wicej platform staje si mobilnych i sieciowych, gry dostpne
kiedy na dedykowane konsole mog dziki rodowisku Unity by teraz uruchamianie w prze-
gldarce internetowej. W tym przypadku ograniczenia sprztowe s obecnie równie wane jak
kiedy, poniewa sprzt z niszej póki, taki jak telefony komórkowe i tablety, staje si zdolny
do uruchamiania gier trójwymiarowych. Z tego powodu podczas modelowania dowolnego
obiektu dla tworzonej gry powiniene bra pod uwag jego szczegóowo oraz obszary, w któ-
rych jest ona najbardziej wymagana.
27
Projektowanie gier w rodowisku Unity 3.x
Rozpocznijmy od zwykego koloru oraz moliwoci uycia jednego obrazu zwanego tekstur lub
wikszej ich liczby. Pojedynczy materia wspópracuje z procedur cieniowania, która jest
skryptem definiujcym sposób jego renderowania. Na przykad w czasie procedury cieniowania
odbijajcego na materiale zostan utworzone odbicia otaczajcych go obiektów, lecz zachowa
on swój kolor lub wygld obrazu uytego jako tekstura.
Uycie materiaów w rodowisku Unity jest prost czynnoci. Dowolne materiay stworzone
w uywanym przez Ciebie pakiecie modelowania trójwymiarowego zostan zaimportowane
i automatycznie odtworzone przez silnik, a nastpnie przeksztacone na zasoby, które mog by
wielokrotnie wykorzystywane. Moesz take tworzy wasne materiay od samego pocztku,
przypisujc obrazy do tekstur i wybierajc odpowiedni procedur cieniowania z obszernej
biblioteki, która jest dostarczana razem z programem. Istnieje równie moliwo napisania
wasnych skryptów cieniowania lub skopiowania i wklejenia tych, które zostay stworzone przez
projektantów w ramach spoecznoci Unity. Dziki temu uzyskujesz wiksz swobod dziaania,
przekraczajc granice zdefiniowane przez domylny zestaw zasobów.
Podczas tworzenia tekstur dla gry przy uyciu pakietu graficznego takiego jak Photoshop czy
GIMP powiniene zwraca uwag na rozdzielczoci tych tekstur. Wiksze tekstury umoliwi
uzyskanie wyszego poziomu szczegóowoci modeli, lecz bd trudniejsze do renderowania.
Tekstury importowane do rodowiska Unity zostan odpowiednio przeskalowane do rozdziel-
czoci bdcej potg liczby 2. Na przykad:
Q 64 piksele × 64 piksele,
Q 128 pikseli × 128 pikseli,
Q 256 pikseli × 256 pikseli,
Q 512 pikseli × 512 pikseli,
Q 1024 piksele × 1024 piksele.
Tworzenie tekstur o powyszych rozmiarach z zawartoci, która mieci si w ich obszarze,
bdzie skutkowa tym, e zostan one poprawnie zaimportowane do rodowiska Unity. Oczywi-
cie moesz równie uywa tekstur o rozmiarach, które nie s wielokrotnociami liczby 2, lecz
w wikszoci przypadków s one wykorzystywane w graficznych elementach interfejsu uyt-
kownika, o czym bdziesz móg si przekona w dalszej czci tej ksiki.
28
Rozdzia 1. • Odkryj trzeci wymiar
W silnikach gier nie istnieje zaoenie, i obiekty powinny podlega prawom fizyki — po pierw-
sze dlatego, e wymagaoby to duej mocy obliczeniowej, a po drugie, e po prostu nie ma
takiej potrzeby. Na przykad w grze wycigowej 3D samochody powinny by przetwarzane
przez silnik fizyczny, lecz nie dotyczy to samego toru czy otaczajcych go obiektów, takich jak
drzewa, ciany itp., które pozostaj nieruchome w trakcie caej rozgrywki. Z tego powodu pod-
czas tworzenia gier w rodowisku Unity komponent fizyki bryy sztywnej jest przydzielany do
kadego obiektu, który powinien pozostawa pod kontrol silnika fizycznego — w idealnym
przypadku wszystkim poruszajcym si obiektom. Dziki temu silnik fizyczny obsuguje tylko
obiekty w ruchu, przez co poprawia si wydajno dziaania aplikacji.
Silniki fizyczne dla gier uywaj systemu dynamiki bryy sztywnej do tworzenia realistycznego
ruchu. Oznacza to po prostu, e obiekty w wiecie trójwymiarowym nie s statyczne, lecz
charakteryzuj si takimi parametrami, jak masa, ciar, prdko i tarcie.
Poniewa moc przetwarzania sprztu i oprogramowania wzrasta, fizyka bryy sztywnej znajduje
coraz szersze zastosowanie w grach, gdy pozwala uzyska bardziej urozmaicon i realistyczn
symulacj. Dynamik bryy sztywnej bdziemy wykorzystywa jeszcze w tym rozdziale podczas
tworzenia prototypu, a take w gównej grze w rozdziale 7. zatytuowanym „Konkretyzowanie
obiektów i bryy sztywne”.
Wykrywanie kolizji
Wykrywanie kolizji jest w silnikach gier zagadnieniem waniejszym od animacji trójwymiaro-
wej. Jest to metoda analizy naszego wiata 3D pod ktem detekcji kolizji zachodzcych midzy
obiektami. Poprzez przypisanie obiektowi komponentu zderzacza tworzymy w rzeczywistoci
wokó niego niewidzialn sie . Zazwyczaj odzwierciedla ona jego ksztat i wykrywa dowolne
kolizje z innymi zderzaczami, co powoduje, e silnik gry odpowiednio na nie reaguje.
W rodowisku Unity istniej dwa zasadnicze rodzaje zderzaczy (ang. collider): podstawowe (ang.
primitives) i siatkowe (ang. meshes). Ksztaty podstawowe w rodowisku 3D s prostymi geo-
metrycznymi obiektami, takimi jak skrzynki (ang. box), kule (ang. sphere) i kapsuy (ang. capsule).
Wynika std, e prosty zderzacz, na przykad typu skrzynkowego, ma w rodowisku Unity taki
wanie ksztat bez wzgldu na to, jak wyglda rzeczywisty obiekt 3D, któremu zosta on przypi-
sany. Podstawowe zderzacze s czsto wykorzystywane, poniewa atwiej je przetworzy .
Uywa si ich take w przypadkach, gdy nie zachodzi potrzeba uzyskania duej dokadnoci
dziaania. Zderzacz siatkowy jest bardziej kosztowny, wykorzystuje bowiem ksztat obiektu,
do którego zosta przypisany. Wynika std, e im bardziej zoona jest siatka, tym bardziej
29
Projektowanie gier w rodowisku Unity 3.x
szczegóowy i dokadny bdzie zderzacz, ale równoczenie stanie si on trudniejszy do przetwo-
rzenia. Jak zaprezentowano we wczeniejszym przykadzie dotyczcym tworzenia samo-
chodu, mona jednake utworzy mniej zoon siatk ni ta, która bdzie renderowana, aby
uzyska prostszy i bardziej wydajny zderzacz siatkowy.
Na przykad w grze w krgle prosty zderzacz kulisty bdzie otacza kul, natomiast same krgle
bd wykorzystywa prosty zderzacz kapsuowy lub (w celu uzyskania bardziej realistycznej
kolizji) zderzacz siatkowy, którego ksztat bdzie odpowiada trójwymiarowej siatce krgla.
Podczas uderzenia zderzacze biorcych w nim udzia obiektów poinformuj o tym zdarzeniu
silnik fizyczny, który wygeneruje odpowiedni reakcj opart na kierunku uderzenia, prdkoci
i innych czynnikach.
Podstawowe pojcia
zwizane ze rodowiskiem Unity
rodowisko Unity upraszcza proces tworzenia gier komputerowych przez udostpnienie sze-
regu logicznych etapów pozwalajcych na zbudowanie dowolnego scenariusza moliwego do
wymylenia. System Unity nie jest zwizany z okrelonym typem gier i oferuje moliwo
stworzenia projektu od samego pocztku dziki zestawowi spójnych procedur, co pozwala na
maksymalne wykorzystanie Twojej twórczej wyobrani. Korzystajc z koncepcji obiektu gry,
moesz podzieli projekt na atwo zarzdzane elementy, które skadaj si z wielu pojedynczych
komponentów (ang. components). Dziki udostpnieniu obiektom okrelonej funkcjonalnoci
poprzez wybór komponentów moesz wci rozwija swoj gr.
Komponent z kolei skada si ze zmiennych (ang. variables), które zasadniczo opisuj jego
waciwoci lub zawieraj ustawienia pozwalajce nim sterowa . Dziki modyfikacji zmiennych
moesz mie pen kontrol nad tym, jaki wpyw wywiera komponent na dany obiekt. Na poni-
szym rysunku zaprezentowano omówione przed chwil powizania:
30
Rozdzia 1. • Odkryj trzeci wymiar
Na kolejnym rysunku widzimy interfejs rodowiska Unity zawierajcy obiekt gry z komponen-
tem owietlenia.
Teraz przyjrzymy si, w jaki sposób przedstawiona powyej metoda moe zosta uyta w prostym
kontekcie rozgrywki.
31
Projektowanie gier w rodowisku Unity 3.x
W tej chwili kula bdzie w trakcie gry spadaa na ziemi. Jak jednak spowodowa , by si od niej
odbijaa? To proste! Komponent zderzacza zawiera zmienn zwan Physic Material (materia
fizyczny). Jest to ustawienie uywane przez silnik fizyczny, definiujce sposób oddziaywania
na powierzchnie innych obiektów. W naszym przypadku moemy wybra warto Bouncy (odbi-
janie) — gotowy materia fizyczny udostpniany w rodowisku Unity jako element pakietu do
zaimportowania — i to wszystko! Odbijajca si pika jest gotowa zaledwie po kilku klikni-
ciach mysz.
Ta uproszczona metoda, uywana w wikszoci prostych przypadków, takich jak cho by powy-
szy przykad, wydaje si na pierwszy rzut oka nieciekawa. Wkrótce jednake zauwaysz, e jej
uycie w bardziej zoonych zadaniach powoduje, i staj si one atwiejsze do wykonania.
Poniej zaprezentowano inne kluczowe pojcia stosowane w rodowisku Unity, które powinie-
ne pozna przed rozpoczciem jego uywania.
Zasoby
Zasoby s elementami skadajcymi si na kady projekt utworzony w rodowisku Unity. Mog
to by tekstury w postaci plików graficznych, modele trójwymiarowe dla siatek oraz pliki
z efektami dwikowymi. W rodowisku Unity zaoono, e kady plik uywany w grze bdzie
zasobem. Std te wszystkie pliki kadego folderu odpowiadajcego projektowi w rodowisku
Unity s przechowywane w podrzdnym katalogu zwanym Assets (zasoby). Folder Assets jest
odwzorowany w interfejsie Unity w panelu projektu (patrz podrozdzia „Interfejs” znajdujcy
si w dalszej czci tego rozdziau).
Sceny
Pracujc w rodowisku Unity, powiniene traktowa sceny jako pojedyncze poziomy lub ob-
szary zawierajce treci gry. Bywa te tak, e projektanci umieszczaj ca gr (np. ukadank)
w jednej scenie poprzez dynamiczne adowanie treci za pomoc kodu. Dziki zastosowaniu
wielu scen bdziesz móg usprawni adowanie zasobów i oddzielnie przetestowa kad
z czci gry. Nowe sceny s czsto wykorzystywane niezalenie od tej, nad któr trwaj prace
projektowe, by utworzy prototyp lub przetestowa ewentualn rozgrywk.
Kada otwarta scena staje si t, nad któr pracujesz, poniewa w systemie nie mona jedno-
czenie projektowa wikszej ich liczby. Sceny mog by modyfikowane i tworzone przy uyciu
widoków Hierarchy (hierarchia) i Scene (scena).
Obiekty gry
Aktywny obiekt w otwartej scenie ma nazw GameObject (obiekt gry). Pewne zasoby, pobrane
z panelu Project (projekt), takie jak modele i prefabrykaty, staj si obiektami gry przez ich
umieszczenie (lub „konkretyzowanie”) w biecej scenie. Inne obiekty, takie jak systemy czstek
i ksztaty podstawowe, mog by umieszczane w scenie za pomoc przycisku Create (utwórz)
32
Rozdzia 1. • Odkryj trzeci wymiar
znajdujcego si w widoku Hierarchy lub przy uyciu opcji menu gównego GameObject. Wszyst-
kie nowo tworzone obiekty gry zawieraj przynajmniej jeden skadnik — jest nim komponent
Transform (transformacja). Komponent Transform przekazuje po prostu silnikowi Unity pooe-
nie, obrót i skal obiektu. Kady z tych parametrów jest opisany za pomoc trzech wspórzd-
nych X, Y, Z (w przypadku skali zawieraj one rozmiary). Z kolei ten komponent moe zosta
uyty w skrypcie w celu zdefiniowania pooenia, obrotu lub skali danego obiektu. Obiekty gry
moesz uzupenia o nastpne komponenty, dodajc wymagane funkcjonalnoci i tworzc kolejne
fragmenty gry zgodnie ze scenariuszem, jaki sobie tylko moesz wyobrazi .
Na poniszym rysunku moesz zauway najbardziej podstawow posta obiektu gry, widoczn
w panelu Inspector (inspektor):
Komponenty
Komponenty przyjmuj róne postacie. Mog definiowa zachowanie obiektu poprzez okrela-
nie wygldu oraz wpywanie na inne aspekty jego funkcjonowania w grze. Doczanie kom-
ponentów pozwala na uywanie okrelonych skadników silnika gry w danym obiekcie. Najcz-
ciej uywane komponenty zwizane z tworzeniem gier s ju wbudowane do systemu Unity.
Mona wród nich wymieni wspomniany wczeniej komponent fizyki bryy sztywnej, a take
prostsze elementy, takie jak wiata, kamery, emitery czstek i wiele innych. Aby dodawa do
gry kolejne interaktywne skadniki, bdziesz pisa skrypty, które równie s rozpoznawane przez
rodowisko Unity jako komponenty. Potraktuj skrypt jako co, co poszerza lub modyfikuje istnie-
jc funkcjonalno , moliw do uzyskania w Unity, albo generuje odpowiedni sposób zacho-
wania si obiektu przy uyciu dostpnych klas skryptowych.
Skrypty
Skrypty nale do komponentów rodowiska Unity. S uwaane za kluczowy skadnik wykorzy-
stywany w procesie produkcji gier. W tej ksice bdziemy tworzy skrypty w jzykach C Sharp
(czciej zapisywanym jako C#) oraz JavaScript. Powiniene by take wiadomy tego, e
33
Projektowanie gier w rodowisku Unity 3.x
Unity oferuje moliwo uycia jzyka Boo (pochodzcego od jzyka Python). Zamierzamy si
jednak skoncentrowa na C# i JavaScript, poniewa s one dwoma podstawowymi jzykami
stosowanymi przez uytkowników rodowiska Unity. Poza tym Boo nie mona wykorzystywa
do oskryptowania urzdze przenonych. Z tego powodu nie jest on zalecany do nauki pisania
skryptów w rodowisku Unity.
Podczas uywania systemu Unity nie jest wymagane zrozumienie, w jaki sposób zosta zako-
dowany jego wasny silnik czy te jak mona go zmodyfikowa , jednake skrypty bd przez
Ciebie wykorzystywane praktycznie podczas tworzenia kadego scenariusza gry. Prostota uycia
skryptów w rodowisku Unity polega na tym, i kady z nich bdzie zrozumiay dla Ciebie po
przeanalizowaniu zaledwie kilku przykadów. Wynika to std, e Unity zawiera wasn klas
typu Behaviour o nazwie Monobehaviour. Jest to zestaw skryptowych polece, które moesz wyko-
rzystywa . Dla wielu pocztkujcych projektantów nauka tworzenia skryptów moe by do
zniechcajc perspektyw, która moe spowodowa , e uytkownicy przyzwyczajeni do
projektowania mog zrezygnowa z uywania rodowiska Unity. Jeli nie masz dowiadczenia
w tworzeniu gier ani programowaniu, nie martw si. Wprowadzimy Ci bardzo agodnie
w zagadnienie pisania skryptów, pamitajc jednoczenie o tym, aby przedstawia nie tylko
znaczenie, lecz równie si tkwic w sprawnym tworzeniu skryptów dla gier projektowanych
przy uyciu rodowiska Unity.
Prefabrykaty
Projektowanie w rodowisku Unity opiera si nie tylko na zastosowaniu obiektów gry, lecz rów-
nie pozwala przechowywa je w postaci zasobów moliwych do ponownego uycia w rónych
czciach aplikacji. Mog by one konkretyzowane (inaczej mówic, „mnoone” lub „klonowane”)
w dowolnym momencie. Poprzez tworzenie zoonych obiektów, zawierajcych róne kompo-
nenty i ustawienia, moesz sprawnie konstruowa szablon sucy do wygenerowania jego wielu
egzemplarzy (std te pochodzi pojcie „konkretyzacja”), z których kady moe by nastpnie
indywidualnie modyfikowany.
Wemy pod uwag skrzynk — mógby zdefiniowa dla niej okrelon mas, a póniej napisa
skrypty obsugujce jej niszczenie. Prawdopodobnie jednak bdziesz chcia uy tego obiektu
wielokrotnie w tej samej grze, a by moe innych ni ta, dla której zosta zaprojektowany.
34
Rozdzia 1. • Odkryj trzeci wymiar
Interfejs
Interfejs systemu Unity, podobnie jak wielu innych rodowisk, ma ukad, który moe zosta
dopasowany do potrzeb uytkownika. Poniewa skada si on z kilku zadokowanych widoków,
moesz zdecydowa , które z nich powinny znajdowa si w okrelonych miejscach. Spójrzmy na
typowy ukad interfejsu Unity:
Jak wida na powyszym rysunku (wykonanym w wersji dla komputera typu Mac), znajduje
si tam pi rónych paneli lub widoków, z których bdziesz korzysta :
35
Projektowanie gier w rodowisku Unity 3.x
Widok Scene jest zwizany z panelem Hierarchy, który zawiera list (posortowan w rosncym
porzdku alfabetycznym) wszystkich obiektów gry nalecych do biecej sceny.
Narzdzia sterujce
Z oknem Scene s zwizane cztery przydatne narzdzia sterujce, które zaprezentowano na
poniszym rysunku.
Q Narzdzie Hand (rka) (klawisz Q): To narzdzie pozwala na poruszanie si po oknie
Scene. Po naciniciu lewego przycisku myszy, a nastpnie jej przemieszczeniu,
umoliwia zmian widoku prezentowanego w panelu Scene. Przytrzymanie klawisza
Alt przy jednoczesnym wybraniu narzdzia Hand i naciniciu lewego przycisku
myszy pozwala na obracanie widoku wokó punktu centralnego, na który spogldasz.
Z drugiej strony, naciskajc prawy klawisz myszy, uzyskujemy moliwo przybliania
i oddalania widoku, podobnie jak w przypadku obracania kókiem myszy. Nacinicie
klawisza Shift przyspiesza wykonywanie powyszych dwóch operacji.
Q Narzdzie Translate (translacja) (klawisz W): Jest to Twoje aktywne narzdzie selekcji.
Dziki temu, e masz moliwo penej interakcji z oknem Scene, wybieranie obiektów
w nim, a take w panelu Hierarchy oznacza, i potrafisz zaznaczy i „chwyci ” obiekt
w celu jego przemieszczenia.
Q Narzdzie Rotate (obrót) (klawisz E): Dziaa ono podobnie jak narzdzie Translate,
wykorzystujc widoczne „uchwyty”, pozwalajce na obracanie obiektu wokó
kadej osi.
36
Rozdzia 1. • Odkryj trzeci wymiar
Q Narzdzie Scale (skala) (klawisz R): Równie jego funkcjonalno jest podobna do
dziaania narzdzi Translate i Rotate. Pozwala ono na zmian rozmiaru lub skalowanie
obiektu przy uyciu widocznych uchwytów.
Po wybraniu obiektów w jednym z paneli Scene lub Hierarchy zostan one automatycznie zazna-
czone w drugim panelu. Pozwala to na wywietlenie waciwoci obiektu w oknie Inspector.
Jeli w oknie Scene nie jeste w stanie zobaczy obiektu, który zosta wybrany w panelu Hierar-
chy, moesz nacisn klawisz F, co spowoduje, e obiekt zostanie umieszczony na rodku okna.
Po prostu zaznacz obiekt w panelu Hierarchy, przemie kursor myszy nad okno Scene, a nastp-
nie nacinij klawisz F. Taki sam rezultat moesz osign poprzez dwukrotne kliknicie nazwy
obiektu gry w panelu Hierarchy.
Pasek sterujcy
Oprócz samych narzdzi sterujcych jest dostpny take pasek zawierajcy dodatkowe opcje,
które wspieraj Ci podczas pracy ze scenami w rodowisku Unity. Zosta on przedstawiony
na poniszym rysunku:
Jest to pasek sterujcy dla widoku sceny, który zawiera nastpujce opcje (od lewej do prawej):
37
Projektowanie gier w rodowisku Unity 3.x
Pole wyszukiwania
Mimo e widok Scene jest wewntrznie zwizany z panelem Hierarchy, czsto moesz mie
potrzeb znalezienia jakiego elementu lub jego typu poprzez przeprowadzenie operacji wyszu-
kiwania. W tym przypadku po prostu wprowad nazw obiektu lub jego typ danych (inaczej
mówic, nazw przypisanego komponentu) w polu wyszukiwania, co spowoduje, e wszystkie
inne obiekty w widoku Scene zostan wywietlone w kolorze szarym, aby uwydatni ten, który
chciae znale . Jest to bardzo przydatna operacja podczas pracy ze zoonymi scenami
i powinna by uywana w powizaniu z klawiszem F, który aktywuje podwietlony obiekt
w oknie Scene.
Przycisk Create
Poniewa wiele zasobów gry, których bdziesz uywa w rodowisku Unity, zostanie zbudowa-
nych w samym edytorze, panel Hierarchy zawiera przycisk Create (stwórz) pozwalajcy na two-
rzenie obiektów. Opcje z nim zwizane s take dostpne w menu GameObject. Dziaaj podob-
nie jak przycisk Create, umoliwiajc utworzenie obiektu i jego natychmiastowe zaznaczenie.
Dziki temu moesz przydzieli mu inn nazw lub rozpocz edycj w panelach Scene albo
Inspector.
Panel Inspector
Przyjmij, e panel Inspector (inspektor) jest czym w rodzaju Twojego osobistego zestawu narz-
dzi, dziki któremu moesz modyfikowa kady parametr obiektu gry lub zasobu w Twoim pro-
jekcie. Ma on podobn zasad dziaania do rozwizania Property Inspector, stosowanego przez
firm Adobe w produktach Flash i Dreamweaver, które polega na uyciu okna o zawartoci
zalenej od biecego kontekstu. Oznacza to po prostu, e panel Inspector bdzie wywietla
waciwoci wybranego przez Ciebie obiektu. Analizuje on kontekst tego, nad czym obecnie
pracujesz.
Okno Inspector nie suy jedynie do inspekcji obiektów. Umoliwia równie wprowadzanie zmian,
by prezentowa róne opcje dostpne dla Twojego projektu podczas wybierania ich z menu Edit
(edycja). Jest ono take idealnym miejscem pozwalajcym na wywietlanie waciwoci kompo-
nentu, gdy tylko zostanie wybrany okrelony obiekt lub zasób.
38
Rozdzia 1. • Odkryj trzeci wymiar
Okno Project
Okno Project (projekt) jest bezporednim widokiem folderu Assets Twojego projektu. Kady
projekt tworzony w rodowisku Unity skada si z folderu nadrzdnego, zawierajcego trzy pod-
foldery: Assets (zasoby), Library (biblioteka) oraz — w czasie, gdy jest aktywny edytor Unity —
folder Temp (tymczasowy). Umieszczenie zasobów w folderze Assets oznacza, e bdziesz móg
je od razu zobaczy w oknie Project i zostan one automatycznie zaimportowane do Twojego pro-
jektu Unity. Podobnie te, w przypadku zmiany dowolnego zasobu umieszczonego w folderze
Assets i zapisania go z poziomu innej aplikacji, takiej jak Photoshop, rodowisko Unity raz
jeszcze dokona jego importu, natychmiast uwzgldniajc wprowadzone zmiany w projekcie oraz
aktywnych scenach, które go wykorzystuj.
Zarzdzanie zasobami
Powiniene pamita, e moesz zmienia nazwy i pooenie zasobów, uywajc w tym celu jedynie
okna Project. Wykorzystanie do tego aplikacji Finder (Mac) lub Eksploratora Windows (PC) moe uszkodzi
odpowiednie poczenia z Twoim projektem Unity. Aby wic przemieszcza lub zmienia nazwy obiektów
w folderze Assets, zamiast systemu operacyjnego uywaj okna Project, dostpnego w rodowisku Unity.
39
Projektowanie gier w rodowisku Unity 3.x
Okno Project, podobnie jak Hierarchy, zawiera przycisk Create. Pozwala on na tworzenie dowol-
nych zasobów w rodowisku Unity, takich jak skrypty, prefabrykaty czy materiay.
Widok Game
Widok Game (gra) jest aktywowany poprzez nacinicie przycisku Play (granie) i pozwala na
wykonanie realistycznego testu Twojej gry. Zawiera on take ustawienia umoliwiajce zdefi-
niowanie wspóczynnika proporcji ekranu. Ta opcja jest przydatna podczas sprawdzania, czy
widok prezentowany graczowi bdzie ograniczony w porównaniu z ekranem panoramicznym,
na przykad dla wspóczynnika proporcji równego 4:3. Po naciniciu przycisku Play powiniene
zawsze pamita o poniszej wskazówce:
Poprzez wczenie opcji Maximize on Play (powikszenie przy graniu) widok Game moe zosta
powikszony w trakcie rozpoczynania trybu grania, dziki czemu uzyskujesz lepszy widok gry
zajmujcej obszar równy prawie caemu ekranowi. Okno zostaje poszerzone do rozmiaru caego
interfejsu rodowiska Unity. Mona take powiksza obszar kadego panelu, umieszczajc nad
nim mysz, a nastpnie naciskajc klawisz spacji.
Oprócz przycisku Play, który suy do uruchomienia cigego trybu testowania, moesz wyko-
rzysta przycisk Pause (zatrzymanie) znajdujcy si obok niego. Jego uycie spowoduje zatrzy-
manie gry. Do chwilowego uruchomienia aplikacji suy wówczas trzeci przycisk Advance Frame
(chwilowe uruchomienie), znajdujcy si obok przycisku Pause. Jest on przydatny podczas uru-
chamiania gry w celu wyszukiwania i rozwizywania problemów lub bdów zawartych w Twojej
aplikacji.
Podsumowanie
W tym rozdziale zapoznae si z gównymi koncepcjami niezbdnymi do zrozumienia i wyko-
nania wicze zawartych w tej ksice. Grafika trójwymiarowa jest jednak bardzo zoonym
przedmiotem, którego bdziesz si uczy nie tylko podczas korzystania ze rodowiska Unity,
ale równie przy innych okazjach. Wynika std, e w celu uzupenienia wiedzy zwizanej
z projektowaniem gier trójwymiarowych powiniene dokadniej pozna zagadnienia przedsta-
wione w tym rozdziale. Kady rodzaj oprogramowania uywanego przez Ciebie bdzie udo-
40
Rozdzia 1. • Odkryj trzeci wymiar
stpnia wasne poradniki i zasoby przeznaczone do szkolenia. Jeli zamierzasz nauczy si
tworzenia grafiki trójwymiarowej, aby uzupeni swoj wiedz zwizan ze rodowiskiem Unity,
powiniene dokadnie przeanalizowa list narzdzi wspópracujcych z nim, a nastpnie wybra
to, które Ci najbardziej odpowiada.
Nastpnie zajmiemy si bardziej powanym przykadem. Przyjrzymy si rodowiskom gry
i zapoznamy si z dziaaniem edytora powierzchni. Dziki zastosowaniu metody interakcyjnego
definiowania wysokoci terenu edytor powierzchni jest prostym w uyciu narzdziem, pozwa-
lajcym na projektowanie gier wykorzystujcych rodowiska zewntrzne. Uyjemy go do zbu-
dowania wyspy, któr w kolejnych rozdziaach uzupenimy o dodatkowe opcje, tworzc w rezul-
tacie niewielk gr. Jej celem bdzie rozpalenie przez gracza ogniska zapakami wyniesionymi
z zamknitego posterunku. Rozpocznijmy wic nasze dziaania!
41
Projektowanie gier w rodowisku Unity 3.x
42
2
Podstawy tworzenia
prototypów i skryptów
Jeli uruchomisz rodowisko Unity po raz pierwszy, zostanie do niego wczytany przykadowy
projekt. Zapoznawanie si z najlepszymi wzorami, stosowanymi w najwyszej jakoci projektach,
jest bardzo przydatne. Jednake w przypadku pocztkujcych uytkowników przegldanie
profesjonalnie utworzonych zasobów i skryptów mogoby by deprymujce, dlatego te pomi-
niemy projekt przykadowy i rozpoczniemy prace od samego pocztku!
W menu gównym rodowiska Unity wybierz opcj File/New Project (plik/nowy projekt), co
spowoduje wywietlenie okna dialogowego Project Wizard (kreator projektu — na poniszym
rysunku przedstawiono wersj dla komputera typu Mac). Kliknij zakadk Create new Project
(stwórz nowy projekt).
Uwaga
Jeli chciaby, by za kadym razem po uruchomieniu rodowiska Unity okno dialogowe Project Wizard
byo automatycznie wywietlane, powiniene wywoywa aplikacj z nacinitym klawiszem Alt (Mac i PC).
Taki sposób dziaania mona równie skonfigurowa w opcji menu File/Preferences (plik/ustawienia).
44
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Kliknij przycisk Set1 (umie ), aby zdefiniowa lokalizacj folderu dla nowego projektu Unity.
W niniejszej ksice zosta on nazwany UGDE i umieszczony na pulpicie, by mie do niego
atwy dostp.
Kreator projektu pozwala take na zaimportowanie wielu pakietów z zasobami, które s udo-
stpnione za darmo przez firm Unity Technologies. Zawieraj one zoone skrypty, gotowe
obiekty i inne elementy graficzne, które s przydatne podczas rozpoczynania pracy z rónymi
rodzajami projektów. Te pakiety moesz take zaimportowa w kadej chwili, wybierajc opcj
menu Assets/Import Package (zasoby/import pakietu), a nastpnie odpowiedni pozycj z dostp-
nej listy. Wybierajc opcj Assets/Import Package/Custom Package (zasoby/import pakietu/pakiet
uytkownika), mógby równie zaimportowa pakiet znajdujcy si w dowolnej lokalizacji na
Twoim dysku twardym. Taka funkcjonalno pozwala wspódzieli zasoby z innymi uytkowni-
kami oraz umoliwia instalacj pakietów, które uzyskae poprzez wybranie opcji Window/Asset
Store (okno/sklep z zasobami).
Po zaznaczeniu pakietów kliknij przycisk Create Project (stwórz projekt), znajdujcy si w dolnej
czci okna dialogowego. Spowoduje to rozpoczcie procesu tworzenia nowego projektu,
podczas którego bdziesz móg obserwowa paski postpu, reprezentujce import poszczegól-
nych pakietów.
1
W wersji dla PC przycisk nazywa si Browse (przegldaj) — przyp. tum.
45
Projektowanie gier w rodowisku Unity 3.x
Definiowanie sceny
Poniewa kada nowa scena zawiera domylnie obiekt Main Camera (gówna kamera), dziaania
rozpoczniemy od utworzenia powierzchni dla rodowiska prototypowego.
W panelu Hierarchy (hierarchia) kliknij przycisk Create (stwórz), a nastpnie z rozwijanego menu
wybierz opcj Cube (szecian). Elementy znajdujce si na licie s take dostpne w opcji
GameObject/Create Other (obiekt gry/stwórz inny) menu gównego aplikacji. Obecnie moesz
zauway obiekt o nazwie Cube, znajdujcy si w panelu Hierarchy. Wybierz go, a póniej
nacinij klawisz F2 (PC) lub Return (Mac) albo dwukrotnie z opónieniem kliknij nazw obiektu,
eby j zmieni . Wprowad sowo Floor (powierzchnia), a nastpnie nacinij klawisz Enter (PC)
lub Return (Mac), by zatwierdzi wprowadzenie zmian.
46
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Jak zapewne zauwaye, oznacza to, e wiato nie dociera do caej powierzchni. Przecignij
wic óty punkt, który znajduje si na przeciciu linii tworzcych zarys wiata punktowego
w widoku Scene, by uzyska warto parametru Range (zasig) równ 40. Parametr ten jest
elementem komponentu Light (wiato) dostpnego w widoku Inspector. Wykonane przez Cie-
bie dziaanie spowoduje, e na obiekcie tworzcym powierzchni pojawi si lekka powiata.
47
Projektowanie gier w rodowisku Unity 3.x
Wskazówka
Pamitaj, e wikszo komponentów jest powizana z odpowiednimi narzdziami, sucymi do wizualnej
edycji i znajdujcymi si w widoku Scene. Modyfikacja wartoci takich jak Range w komponencie Light,
dostpnym w panelu Inspector, spowoduje uaktualnienie wygldu obiektu w widoku Scene w trakcie
wprowadzania zmian. Zostan one zatwierdzone po naciniciu klawisza Return (Enter).
1. Kliknij przycisk Create, znajdujcy si w górnym obszarze panelu Hierarchy, a nastpnie
wybierz opcj Cube. Uywajc wartoci Position w komponencie Transform, umie
obiekt w pooeniu (0, 1, 0). Upewnij si, czy wci jest wybrany w panelu
Hierarchy, a nastpnie przybli jego widok przez przemieszczenie kursora myszy
nad okno Scene i nacinicie klawisza F.
2. Uzupenij obiekt Cube o parametry fizyczne, wybierajc opcj menu gównego
Component/Physics/Rigidbody (komponent/parametry fizyczne/brya sztywna).
Oznacza to, e Twój obiekt bdzie od tej pory bry sztywn, charakteryzujc si
takimi parametrami, jak masa czy ciar. Moe take oddziaywa na inne obiekty
dziki wykorzystaniu silnika fizycznego w celu uzyskania realistycznych wyników
w wiecie 3D.
3. Wreszcie stwórzmy kolor dla obiektu poprzez wygenerowanie odpowiedniego
materiau. Materiay su do uzupeniania obiektów trójwymiarowych o kolor
i tekstur. Aby utworzy nowy materia, kliknij przycisk Create, znajdujcy si
w panelu Project, a nastpnie z menu rozwijanego wybierz opcj Material (materia).
Nacinij klawisz F2 (PC) lub Return (Mac), aby zmieni jego domyln nazw New
Material (nowy materia) na Red (czerwony).
4. Gdy materia zostanie wybrany, jego waciwoci s wywietlane w panelu Inspector.
Kliknij pole koloru (1), znajdujce si po prawej stronie etykiety Main Color (gówny
kolor), aby otworzy okno dialogowe Color Picker (wybór koloru) (2). Bdzie ono róni
si wygldem w zalenoci od tego, czy uywasz komputera typu Mac lub PC.
Po prostu wybierz jaki odcie koloru czerwonego, a nastpnie zamknij okno. Pole
koloru Main Color powinno zosta odpowiednio zaktualizowane.
48
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
49
Projektowanie gier w rodowisku Unity 3.x
7. Nacinij przycisk Play ponownie, aby zatrzyma symulacj. Nie naciskaj przycisku
Pause, poniewa spowodowaoby to tylko tymczasowe zatrzymanie animacji, natomiast
póniejsze zmiany w scenie nie zostayby zapamitane.
8. Przywró poprzednie ustawienia dla szecianu: parametrowi Y Position przypisz
warto 1, a X Rotation — warto 0.
Aby zastosowa opcj przycigania, przytrzymaj nacinity klawisz Control (PC) lub Command
(Mac) podczas uywania narzdzia Translate (W) w celu rozmieszczenia obiektów w widoku
Scene. By rozpocz budow ciany, przy uyciu skrótu klawiszowego Ctrl+D (PC) lub Com-
mand+D (Mac) skopiuj obiekt cegy, którym ju dysponujemy. Nastpnie przecignij go, chwy-
tajc za uchwyt czerwonej osi i jednoczenie trzymajc wcinity klawisz Control (PC) lub
Command (Mac). Dziki temu obiekt bdzie si przemieszcza skokowo po siatce przycigania.
Przesuwaj ceg w osi X, a znajdzie si w bezporednim ssiedztwie innej, tak jak przedsta-
wiono na poniszym rysunku:
50
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Przyciganie do wierzchoków
Podstawowa procedura przycigania, której uylimy wczeniej, dziaaa poprawnie, poniewa nasze sze-
ciany charakteryzuj si ogóln skal o wielkoci 1. Jednake podczas skalowania obiektów o bardziej zoo-
nych ksztatach powiniene zastosowa opcj przycigania do wierzchoków. Aby jej uy, upewnij si,
e wybrae narzdzie Translate, a nastpnie wcinij i przytrzymaj klawisz V. Gdy umiecisz kursor myszy
nad punktem wybranego wierzchoka, przecignij cay element do wierzchoka nalecego do innego obiektu.
Zaznacz wszystkie szeciany w panelu Hierarchy: wybierz szecian znajdujcy si najwyej,
przytrzymaj klawisz Shift, a nastpnie wybierz szecian najniszy. W dalszej kolejnoci prze-
cignij zaznaczony zbiór szecianów do pustego obiektu CubeHolder, znajdujcego si w panelu
Hierarchy, aby uczyni go obiektem nadrzdnym. Po wykonaniu tej operacji widok Hierarchy
powinien si przedstawia nastpujco:
Moesz zauway , e obok nazwy obiektu nadrzdnego pojawia si ikona w postaci strzaki.
Oznacza to, e moesz j klikn , co spowoduje rozwinicie i zwinicie listy z obiektami pod-
rzdnymi. Aby zaoszczdzi miejsce w panelu Hierarchy, kliknij strzak, by ukry wszystkie
obiekty podrzdne, a nastpnie ponownie wybierz CubeHolder.
Gdy cay rzd cegie zosta utworzony i przyporzdkowany do obiektu nadrzdnego, moemy go
w prosty sposób zduplikowa poprzez przecignicie z uyciem opcji przycigania w osi
Y. Tak jak poprzednio uyj skrótu klawiszowego sucego do klonowania (PC: Ctrl+D, Mac:
51
Projektowanie gier w rodowisku Unity 3.x
Powtarzaj powysz procedur, a utworzysz osiem rzdów cegie umieszczonych jeden nad
drugim. ciana powinna wyglda jak na poniszym rysunku. Zwró uwag na to, e zostay na
nim zaznaczone wszystkie obiekty CubeHolder znajdujce si w panelu Hierarchy.
Zbuduj i zniszcz!
Gdy zbudowalimy cian z cegie, nadszed czas na stworzenie prostej mechaniki gry, w któ-
rej gracz moe przemieszcza kamer i wystrzeliwa pociski w kierunku ciany, by j zburzy .
Definiowanie widoku
Ustaw kamer w taki sposób, by bya skierowana na cian. W tym celu zaznacz obiekt Main
Camera, znajdujcy si w panelu Hierarchy, a nastpnie w komponencie Transform zdefiniuj
jego pozycj równ (4, 3, -15). Upewnij si take, e wszystkie parametry zwizane z obrotem
s równe zeru.
52
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Uwaga
Kolejne wiczenia moesz wykonywa, uywajc zarówno jzyka JavaScript, jak i C#. Jednake w dalszej
czci ksiki powiniene zdecydowa si na ten jzyk, który bardziej Ci odpowiada.
Rozpocznij od kliknicia przycisku Create (stwórz), znajdujcego si w panelu Project (projekt),
a nastpnie wybrania opcji Javascript lub C# Script.
Twój skrypt zostanie umieszczony w panelu Project pod nazw NewBehaviourScript, obok któ-
rej widnieje niewielka ikona w ksztacie strony z napisem JS lub C#. W trakcie dokonywania
wyboru skryptu masz dostp do podgldu jego kodu w oknie Inspector (inspektor). Znajduje si
tam take przycisk Open (otwórz), którego kliknicie powoduje otwarcie skryptu w domylnym
edytorze o nazwie Monodevelop. Moesz go take otworzy , klikajc dwukrotnie jego ikon
w panelu Project.
W terminologii rodowiska Unity kady nowo utworzony skrypt odpowiada zdefiniowaniu nowej
klasy. Jeli jeste pocztkujcym programist, potraktuj klas jako zbiór dziaa, waciwoci i
innych zapamitanych informacji, do których mona mie dostp poprzez jej nazw.
Na przykad klasa o nazwie Pies mogaby zawiera takie waciwoci, jak kolor, rasa, rozmiar
i pe. Oprócz nich istniayby takie dziaania, jak biegnij czy przynie patyk. Waciwoci mog
by opisane jako zmienne, natomiast dziaania mog zosta zdefiniowane w postaci funkcji,
zwanych take metodami.
Aby odwoa si do zmiennej rasa, która jest waciwoci klasy Pies, moglibymy poda nazw
klasy, nastpnie uy znaku kropki, a wreszcie wprowadzi nazw zmiennej:
Pies.rasa;
53
Projektowanie gier w rodowisku Unity 3.x
Funkcje moemy równie wywoywa z argumentami — nie maj one jednak nic wspólnego
z tymi, których uywamy codziennie podczas dyskusji z innymi osobami! Przyjmij zaoenie,
e argumenty pozwalaj na modyfikowanie dziaania funkcji. Na przykad w przypadku funkcji
przyniesPatyk moglibymy uy argumentu, który definiuje, jak szybko pies powinien przynie
patyk. Jej wywoanie mogoby wyglda tak:
Pies.przyniesPatyk(25);
W czasie pisania skryptu w jzyku C# lub JavaScript tworzysz now klas (lub klasy) zawiera-
jc waciwoci (zmienne) oraz polecenia (funkcje), których moesz uy w okrelonym miejscu
w swojej grze.
Kod rozpoczyna si od dwóch niezbdnych wierszy, zawierajcych odwoania do samego silnika
Unity:
using UnityEngine;
using System.Collections;
Nastpnie jest tworzona nazwa klasy, zgodna z nazw skryptu. W jzyku C# musisz zdefinio-
wa tak nazw skryptu, która bdzie odpowiada nazwie zadeklarowanej w nim klasy. Na
pocztku dokumentu widzimy zapis public class NewBehaviourScript : MonoBehaviour {,
poniewa NewBehaviourScript jest domyln nazw, nadawan przez rodowisko Unity kademu
nowo utworzonemu skryptowi. Jeli w panelu Project zmienisz nazw skryptu, system Unity
automatycznie zmieni take nazw zdefiniowanej w nim klasy.
54
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Funkcje podstawowe
rodowisko Unity zawiera wiele wasnych funkcji, które mog by uywane w celu uruchomienia
rónych opcji silnika gry. Dwie z nich s szczególnie wane podczas tworzenia nowego skryptu
w jzyku C#.
Uwaga
Funkcje jzyka C# (zwane równie metodami) najczciej rozpoczynaj si od sowa void. Uyta nazwa
okrela typ wartoci, która jest zwracana przez funkcj, czyli danej otrzymanej po jej wywoaniu. Poniewa
wikszo funkcji jest tworzona wycznie w celu wykonania okrelonych instrukcji, a nie zwracania jakich
informacji, na pocztku ich deklaracji bdziesz czsto spotyka sowo void. Oznacza ono po prostu, e
wywoanie funkcji nie zwróci adnych wartoci.
Funkcje te s nastpujce:
Q Start(): Zostaje ona wywoana przy pierwszym uruchomieniu sceny, dlatego jest
czsto uywana (jak wynika z sugestii zawartej w kodzie) w celach inicjalizacyjnych.
Na przykad mógby dysponowa zmienn przechowujc wynik, której musi zosta
przypisana warto 0 podczas rozpoczynania gry. W funkcji Start() mogaby take
zosta wywoana procedura, która umieszcza posta gracza we waciwym miejscu
gry na pocztku danego poziomu.
Q Update(): Poniewa stany rónych elementów gry mog si zmienia w trakcie jej
trwania, funkcja ta jest wywoywana w kadej iteracji podczas dziaania Twojego
programu i jest odpowiedzialna za ich sprawdzanie.
Zmienne w jzyku C#
Aby zapamita informacj w zmiennej jzyka C#, naley uy nastpujcej skadni:
typDanych nazwaZmiennej = warto;
Na przykad:
int currentScore = 5;
55
Projektowanie gier w rodowisku Unity 3.x
lub:
float currentVelocity = 5.86f;
Zwró uwag na to, e w powyszych przykadach uyto danych numerycznych: int oznacza
liczb cakowit, natomiast float liczb zmiennoprzecinkow. Ten drugi przypadek wymaga
dodatkowo w jzyku C# umieszczenia litery f po wartoci samej liczby. Róni si to w pewien
sposób od skadni uywanej w jzyku JavaScript. Wicej szczegóów zostanie zaprezentowanych
w kolejnym punkcie „Zmienne w jzyku JavaScript”.
Deklaracja funkcji w jzyku JavaScript wyglda inaczej i wymaga uycia sowa kluczowego
function przed jej nazw. Deklaracje zmiennych i innych elementów skryptu s take zapisy-
wane w odmienny sposób — w kolejnych punktach zapoznamy si z odpowiednimi przykadami.
Jak wida , deklaracja jest zawsze poprzedzona sowem kluczowym var. Na przykad:
var currentScore : int = 0;
lub:
var currentVelocity : float = 5.86;
Jak zapewne zauwaye, typ float, inaczej ni w jzyku C#, nie wymaga podania litery
f wystpujcej za wartoci. Podczas analizy kolejnych skryptów napisanych w dwóch rónych
jzykach bdziesz take móg stwierdzi , e jzyk C# ma czsto bardziej rygorystyczne reguy,
okrelajce sposób tworzenia programów, szczególnie w przypadku niejawnie deklarowanych
typów danych, które maj by uywane.
56
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Komentarze
Zarówno w jzyku C#, jak i w JavaScript moesz tworzy komentarze za pomoc nastpujcych
konstrukcji:
// dwa ukoniki oznaczaj pojedynczy wiersz komentarza
lub:
/* ukonik i gwiazdka rozpoczynaj komentarz zawierajcy si w wielu wierszach.
Jego zakoczeniem s gwiazdka i ukonik */
Podczas czytania tej ksiki komentarze mog pomóc Ci przypomnie sobie zasad dziaania
tworzonych przez Ciebie fragmentów kodu. Pamitaj, e komentarze nie wykonuj si, dlatego
moesz w nich umieszcza dowolne teksty, wczajc w to równie wiersze kodu. Dopóki bd
si one zawiera w komentarzu, nie zostan potraktowane jako dziaajcy kod.
Atakowanie ciany
A teraz zastosujmy zdobyt wiedz w praktyce i zamiemy istniejc scen w prototyp inte-
rakcyjnej fabuy. W panelu Project zmie nazw nowo utworzonego skryptu poprzez jego
wybranie, nacinicie klawisza F2 (PC) lub Return (Mac), a nastpnie wprowadzenie tekstu
skryptu Shooter.
Jeli wykorzystujesz jzyk C#, pamitaj o upewnieniu si, e Twoja deklaracja klasy znajdujca
si wewntrz skryptu odpowiada jego nazwie:
public class Shooter : MonoBehaviour {
Jak wczeniej wspomniano, uytkownicy wykorzystujcy jzyk JavaScript nie bd musieli sto-
sowa si do powyszej reguy. By zastosowa w praktyce wiedz o korzystaniu ze skryptów
w rodowisku Unity, napiszemy skrypt sterujcy kamer i pozwalajcy na strzelanie pociskami
w kierunku postawionej przez nas ciany.
57
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
Zanim rozpoczniemy dziaania, usuniemy funkcj Start() ze skryptu, poniewa nie bdziemy jej
uywa . W tym celu po prostu skasuj tekst void Start { }. Aby stworzy wymagane zmienne,
umie poniszy fragment kodu w swoim skrypcie poniej wiersza otwierajcego klas:
using UnityEngine;
using System.Collections;
public class Shooter : MonoBehaviour {
public Rigidbody bullet;
public float power = 1500f;
public float moveSpeed = 2f;
void Update () {
}
}
Jzyk JavaScript:
Aby stworzy zmienne o dostpie publicznym w jzyku JavaScript, musisz si upewni , e zostan
one zadeklarowane poza istniejcymi funkcjami. Naley je po prostu umieci na samej górze
skryptu. Zadeklaruj wic trzy wymagane zmienne, wstawiajc poniszy kod na pocztku skryptu
Shooter:
var bullet : Rigidbody;
var power : float = 1500;
var moveSpeed : float = 5;
function Update () {
}
58
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Zapisz skrypt, wybierajc z gównego menu edytora opcj File/Save (plik/zapisz), a nastpnie wró
do rodowiska Unity. Oferuje ono kilka sposobów przypisywania skryptu do obiektu:
Przecignij wic nowy skrypt Shooter z panelu Project i upu go na nazwie Main Camera,
znajdujcej si w panelu Hierarchy, co spowoduje jego przypisanie. Bdziesz móg zauway ,
e skrypt zostanie wywietlony jako nowy skadnik poniej istniejcego komponentu Audio
Listener. W panelu Inspector stwierdzisz take istnienie trzech zmiennych publicznych: Bullet,
Power i Move Speed:
Mona równie stwierdzi , e zmienna Bullet nie zostaa jeszcze zainicjalizowana, lecz ocze-
kuje si, i obiekt, który zostanie do niej przypisany, bdzie uywa komponentu bryy sztywnej
(Rigidbody). Czsto zwany jest on po prostu obiektem typu Rigidbody. Pomimo tego, e w ro-
dowisku Unity wszystkie elementy w scenie mog by traktowane jako obiekty gry, podczas
definiowania w skrypcie obiektu o typie Rigidbody bdziemy mogli si odwoywa jedynie do
waciwoci i funkcji klasy o tej wanie nazwie. Nie stanowi to jednak problemu — po prostu
sprawia, e skrypt staje si bardziej efektywny ni w przypadku, gdybymy odwoywali si do
caej klasy GameObject. Aby dowiedzie si wicej na ten temat, zapoznaj si z dokumentacj
zwizan z oprogramowaniem skryptowym dotyczcym wspomnianych klas:
Q GameObject: http://unity3d.com/support/documentation/ScriptReference/GameObject.html,
Q RigidBody: http://unity3d.com/support/documentation/ScriptReference/Rigidbody.html.
59
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Pamitaj, e podczas modyfikowania zmiennych publicznych, dostpnych w panelu Inspector, dowolna
ich zmiana zamiast zastpi wartoci, które zostay zapisane w skrypcie, po prostu je przesoni.
Poruszanie kamer
Teraz wykorzystamy zmienn moveSpeed oraz odczytamy stan klawiatury, aby porusza kamer
i faktycznie stworzy prosty mechanizm celowania dla strzau. Bdzie on polega na ustawianiu
kamery w kierunku miejsca, w które bdziemy strzelali.
Poniewa chcielibymy uywa klawiszy strzaek na klawiaturze, musimy si najpierw dowie-
dzie , w jaki sposób w kodzie mona si do nich odwoywa . rodowisko Unity wykorzystuje
wiele sygnaów wejciowych, które mona obserwowa i modyfikowa przy uyciu menedera
wej (Input Manager) — patrz menu Edit/Project Settings/Input (edycja/ustawienia pro-
jektu/wejcie).
Jak wida na poniszym rysunku, istniej dwa domylne parametry typu Input (wejcie): Hori-
zontal (poziomy) i Vertical (pionowy). Wykorzystuj one zasad dziaania osi wspórzdnych,
dziki czemu naciskanie przycisku Positive Button (przycisk dodatni) generuje warto równ 1,
natomiast naciskanie przycisku Negative Button (przycisk ujemny) tworzy warto -1. Zwolnienie
dowolnego przycisku oznacza, e warto typu Input ponownie staje si równa 0, podobnie
jak miaoby to miejsce podczas uywania sprystego joysticka analogowego, znajdujcego si
w urzdzeniu typu gamepad.
Poniewa typ Input jest równie nazw klasy, a wszystkie nazwane elementy w menederze
wej s osiami lub przyciskami, w skrypcie moemy uy nastpujcego zapisu:
Input.GetAxis("Horizontal");
Dziki temu moemy póniej zmodyfikowa warto zmiennej, uywajc operacji mnoenia,
dziki czemu uzyskamy maksymaln warto wiksz od 1. Pozwoli nam to na przemieszczanie
kamery z prdkoci wiksz ni jedna jednostka na iteracj.
Dostpu do tej zmiennej nie musimy mie w panelu Inspector, poniewa samo rodowisko Unity
bdzie przypisywa jej odpowiednie wartoci w zalenoci od stanu sygnaów wejciowych.
Wynika std, e powinna ona zosta zdefiniowana jako zmienna lokalna.
60
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
61
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
void Update () {
float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;
Jzyk 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 mogyby zosta dowolnie
nazwane, jednake uywanie pojedynczych liter jest po prostu szybsze. Ogólnie mówic, zazwy-
czaj powinno si tworzy standardowe nazwy, poniewa niektóre pojedyncze litery nie mog
by uywane. Na przykad nazwy zmiennych x, y i z s uywane do przechowywania wartoci
wspórzdnych i dlatego te zarezerwowano je wycznie do tych zastosowa.
Poniewa wartoci osi mog zawiera si w przedziale od -1 do 1, zmienne s liczbami dziesit-
nymi i musimy je deklarowa z uyciem typu zmiennoprzecinkowego. Mnoy si je nastpnie
za pomoc symbolu gwiazdki * przez parametr Time.deltaTime. Oznacza to, e wyznaczana
warto jest dzielona przez liczb klatek na sekund (parametr deltaTime jest czasem tworzenia
kolejnych klatek lub czasem liczonym od ostatniego wywoania funkcji Update()). Wynika std,
i warto osiga pewn spójn wielko na sekund, niezalenie od szybkoci klatek.
W kolejnym kroku zwikszamy warto wynikow, mnoc j przez zmienn publiczn, któr
utworzylimy wczeniej, czyli moveSpeed. Oznacza to, e mimo i wartoci h i v s zmiennymi
lokalnymi, moemy wci na nie wpywa poprzez modyfikowanie zmiennej publicznej moveSpeed,
dostpnej w panelu Inspector, poniewa jest ona skadnikiem uywanego przez nas równania.
Jest to czsto spotykane rozwizanie podczas tworzenia skryptów, gdy wykorzystuje ono zalet
uycia publicznie dostpnych ustawie poczonych z okrelonymi wartociami generowanymi
przez funkcj.
62
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Jest to klasa informacji przechowujca waciwoci pooenia, obrotu i skali danego obiektu.
Zawiera ona równie funkcje, które mog by uywane w celu jego przemieszczania lub
obracania.
Istnienie parametru Vector3 oznacza, e funkcja Translate wymaga jego uycia w formie gów-
nego argumentu. Dane reprezentowane przez Vector3 s po prostu informacjami zawierajcymi
wartoci wspórzdnych X, Y i Z. W naszym konkretnym przypadku oznaczaj koordynaty
przesunicia obiektu.
Jzyki C# i JavaScript:
Umie poniszy wiersz kodu wewntrz funkcji Update() w Twoim skrypcie, a dokadniej pomi-
dzy jej otwierajcym { i zamykajcym } nawiasem klamrowym. Zwró uwag na to, e zapis
wyglda identycznie w obu jzykach:
transform.Translate(h, v, 0);
W naszym przypadku nie musimy wykorzystywa powyszej formy zapisu. Dostp do kompo-
nentów przyczonych do innych obiektów zosta dokadniej opisany w podrozdziale rozdziau 4.,
zatytuowanym „Komunikacja midzyskryptowa oraz skadnia z kropk”.
W skrypcie uyjemy biecej wartoci zmiennej h dla osi X oraz v dla osi Y, natomiast osi Z
przekaemy po prostu warto 0, poniewa nie chcemy si przesuwa do przodu ani do tyu.
Zapisz teraz swój skrypt, uywajc opcji menu gównego File/Save (plik/zapisz), a nastpnie wró
do rodowiska Unity. Zapamitaj tworzon scen za pomoc opcji File/Save Scene As (plik/zapisz
scen jako) i nazwij j Prototype.
rodowisko Unity zaproponuje zapisanie jej w domylnym folderze Assets (zasoby). Powiniene
zawsze si upewnia , e zapamitujesz sceny w tym folderze, poniewa w przeciwnym razie
63
Projektowanie gier w rodowisku Unity 3.x
nie bdziesz mia do nich dostpu z panelu Project (projekt). By zapewni idealny porzdek,
moesz take utworzy podkatalog wewntrz folderu Assets, w którym bdziesz przechowywa
swoje sceny. Takie dziaanie nie jest jednak wymagane, lecz ogólnie uwaa si je za dobry wzo-
rzec postpowania.
Gdy bdy zostan naprawione, pasek Console (konsola), znajdujcy si na dolnej krawdzi
interfejsu Unity, nie bdzie zawiera adnych informacji. Pasek Console wywietla najnowsze wpisy
pojawiajce si w konsoli Unity. Moesz j wywietli , wybierajc opcj menu Window/Console
(okno/konsola) (skrót klawiszowy to Ctrl+Shift+C dla PC lub Command+Shift+C dla kompu-
terów Mac). Kady bd zostanie wywietlony na czerwono. Dwukrotne jego kliknicie umoliwi
wywietlenie odpowiedniego fragmentu skryptu, który spowodowa pojawienie si problemu.
Wikszo bdów polega na pominiciu jakiego znaku lub bdnym zapisie, dlatego te zawsze
dokadnie sprawdzaj, co napisae.
Jeli Twoja gra jest wolna od bdów, kliknij przycisk Play (granie), znajdujcy si w górnej czci
okna Unity, aby przej do trybu grania. Bdziesz móg porusza obiektem Main Camera za
pomoc klawiszy strzaek góra, dó, lewo i prawo lub ich odpowiedników: W, A, S i D, tak jak
zaprezentowano na poniszym rysunku.
Gdy przetestowae ju gr i upewnie si, e dziaa poprawnie, ponownie nacinij przycisk
Play, aby opuci tryb grania.
Uwaga
Opuszczenie trybu grania przed kontynuowaniem pracy jest wane, poniewa podczas jego wyczania
wszystkie zmodyfikowane ustawienia komponentów i obiektów uywanych w biecej scenie nie zostan
zapamitane. Pozostawienie rodowiska Unity w trybie grania i wprowadzanie dalszych modyfikacji bdzie
oznaczao, e po prostu utracisz wyniki swojej pracy.
64
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Tworzenie pocisku
Aby wystrzeli pocisk w kierunku ciany, musimy w ramach biecej sceny najpierw go utwo-
rzy , a nastpnie zapamita w postaci prefabrykatu.
Uwaga
Prefabrykat jest obiektem gry, przechowywanym w projekcie w postaci zasobu. Zasób ten moe by
konkretyzowany, czyli tworzony w trakcie dziaania gry, a nastpnie przetwarzany poprzez uycie kodu.
Teraz upewnij si, e utworzona przez Ciebie kula zostaa zaznaczona w panelu Hierarchy,
a póniej przemie kursor myszy na widok Scene (scena) i nacinij klawisz F, by skoncentrowa
si na wybranym obiekcie.
65
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Jeli Twoja kula ma takie samo pooenie, jak który z innych obiektów, moesz w prosty sposób przej
do narzdzia translacji (W), a nastpnie przecign uchwyt odpowiedniej osi, aby odsun j od zasa-
niajcego elementu. Po tej operacji ponownie skoncentruj widok na kuli poprzez nacinicie klawisza F.
Aby zachowa porzdek, utworzymy nowy podkatalog wewntrz folderu Assets. Bdziemy w nim
przechowywa wszystkie materiay uywane w biecym projekcie. W panelu Project kliknij
przycisk Create, a nastpnie z podrcznego menu wybierz opcj Folder (katalog). Zmie jego
nazw na Materials poprzez nacinicie klawisza F2 (PC) lub Return (Mac). Teraz umie w nim
materia czerwonej cegy, który zosta wczeniej przez Ciebie stworzony.
Uwaga
Aby w panelu Project utworzy nowy zasób w istniejcym folderze, po prostu go wybierz, a nastpnie
rozpocznij operacj tworzenia poprzez kliknicie przycisku Create.
1. Upewnij si, e folder Materials jest zaznaczony, a nastpnie kliknij przycisk Create,
znajdujcy si w panelu Project. Z wywietlonego menu podrcznego wybierz opcj
Material (materia). Spowoduje to utworzenie zasobu New Material, którego nazw
powiniene zmieni na bulletColor lub podobn, przypominajc Ci, e powinien
on zosta przypisany do pocisku.
2. Majc zaznaczony nowo utworzony materia, kliknij obszar koloru, aby otworzy okno
Color Picker. Póniej wybierz jaki odcie koloru niebieskiego i zamknij to okno.
66
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Uwaga
Jeli chcesz sprawdzi, jak bdzie wyglda materia przypisany do trójwymiarowego obiektu w rodo-
wisku Unity, moesz go przecign do widoku Scene, a nastpnie umieci kursor myszy nad okrelon
siatk. System Unity zaprezentuje podgld obiektu w wybranym kolorze. Aby uniewani wybór, moesz
przesun kursor poza obszar widoku lub nacisn klawisz Esc. By zastosowa materia, zwalniasz po
prostu przycisk myszy.
Komponent bryy sztywnej zosta dodany, a jego parametry mog by modyfikowane w panelu
Inspector. Na potrzeby obecnego prototypu nie musimy jednak niczego zmienia .
Przechowywanie obiektów
jako prefabrykatów
Poniewa powinnimy wystrzeliwa pocisk w chwili, gdy gracz nacinie jaki klawisz, nie
chcemy, aby znajdowa si on cay czas w scenie. Zamiast tego powinien by przechowywany
i konkretyzowa si dopiero podczas naciskania klawisza. Z tego powodu bdziemy zapisywa nasz
obiekt w postaci prefabrykatu, a nastpnie uywa 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 zostay zdefinio-
wane w okrelony sposób. Na przykad moesz odpowiednio skonfigurowa obiekt wrogiego onierza,
zawierajcy pewne skrypty i waciwoci, które definiuj jego zachowanie. Nastpnie moesz zapisa
ten obiekt w postaci prefabrykatu i w razie koniecznoci konkretyzowa go. Podobnie mógby uywa
innego onierza, zachowujcego si odmiennie, który byby kolejnym prefabrykatem. Mógby take
utworzy instancj pierwszego obiektu, a pó niej zmodyfikowa ustawienia jego komponentów, aby po
konkretyzacji porusza si wolniej lub szybciej. System prefabrykatów udostpnia szeroki zakres swobody
w tym wzgldzie.
67
Projektowanie gier w rodowisku Unity 3.x
Kliknij przycisk Create (stwórz), znajdujcy si na górze panelu Project (projekt), a nastpnie
wybierz opcj Folder (folder). Zmie nazw nowo utworzonego katalogu na Prefabs. W kolejnym
kroku przecignij obiekt Sphere z panelu Hierarchy (hierarchia) i upu go na folder Prefabs
w panelu Project. Przecignicie obiektu gry w dowolny obszar panelu Project spowoduje, e
zostanie on zapamitany jako prefabrykat. Folder Prefabs zosta przez nas utworzony jedynie
w celu zapewnienia porzdku i stosowania si do dobrych wzorców postpowania. Zmie nazw
nowo utworzonego prefabrykatu na Projectile.
Moesz ju usun oryginalny obiekt Sphere z panelu Hierarchy: wybierz go, a nastpnie na-
cinij klawisz Delete (PC) lub Command+Backspace (Mac). Alternatyw dla tego rozwizania
jest kliknicie prawym klawiszem myszy obiektu w panelu Hierarchy i wybranie opcji Delete
(usu) z menu podrcznego.
Wystrzelenie pocisku
Wró my do skryptu Shooter, który wanie tworzymy. W tym celu kliknij dwukrotnie jego ikon,
znajdujc si w panelu Project, lub wybierz go, a nastpnie kliknij przycisk Open (otwórz),
wywietlany na górze okna Inspector (inspektor).
Polecenie if sprawdza, czy klawisz przypisany do wejciowego przycisku Fire1 zosta zwolniony.
Domylnie jest on odwzorowany na lewy klawisz Ctrl lub lewy przycisk myszy. Moesz go jed-
nak przypisa do innego klawisza, wprowadzajc odpowiedni modyfikacj w menederze
wej , co mona zrobi przez wybranie opcji menu gównego Edit/Project Settings/Input
(edycja/ustawienia projektu/wejcia).
68
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
Jzyk C#:
Rigidbody instance = Instantiate(bullet, transform.position,
´transform.rotation) as Rigidbody;
Jzyk JavaScript:
var instance: Rigidbody = Instantiate(bullet, transform.position,
´transform.rotation);
Jak wida , stworzylimy now zmienn zwan instance. Przechowujemy w niej referencj do
funkcji tworzcej nowy obiekt o typie Rigidbody.
W naszym przypadku chcemy, aby zostaa utworzona instancja obiektu lub prefabrykatu, który
zosta przypisany do zmiennej publicznej bullet. Pooenie i obrót instancji pobierzemy
z komponentu transform, uywanego w obiekcie, do którego zosta przydzielony skrypt, czyli
Main Camera. Dlatego te w skryptach bdziesz móg czsto zauway zapis transform.position,
odnoszcy si do ustawie zwizanych z komponentem transform i dotyczcy pooenia obiektu,
do którego zosta przyczony dany skrypt.
Zanim wic przyoymy wektor siy, musimy stworzy referencj do kierunku, w którym chcemy
strzela . Kamera jest zwrócona w stron ciany z cegie, wic sensowne jest, by oddawa strzay
w tym wanie kierunku. Poniej wiersza zawierajcego funkcj Instantiate(), a jednoczenie
wci w obrbie polecenia if, umie nastpujcy kod:
Jzyk C#:
Vector3 fwd = transform.TransformDirection(Vector3.forward);
Jzyk JavaScript:
var fwd: Vector3 = transform.TransformDirection(Vector3.forward);
Utworzylimy zmienn fwd o typie Vector3 i przypisalimy jej kierunek do przodu dla kom-
ponentu transform w obiekcie, do którego jest przyczony nasz skrypt.
69
Projektowanie gier w rodowisku Unity 3.x
Wreszcie bdziemy mogli wystrzeli pocisk przez odwoanie si do naszej zmiennej, która
reprezentuje nowo utworzony obiekt instance, a nastpnie uycie polecenia AddForce() w celu
przyoenia siy w kierunku zdefiniowanym w zmiennej fwd, mnoc j przez wczeniej utworzon
zmienn publiczn power. Dodaj poniszy wiersz kodu bezporednio pod tym, który poprzednio
umiecie w skrypcie:
Jzyki C# i JavaScript:
instance.AddForce(fwd * power);
Po wykonaniu tej czynnoci bdziesz móg zobaczy nazw Projectile w obszarze zmiennej
Bullet. Zapisz scen za pomoc opcji File/Save Scene (plik/zapisz scen), a póniej przetestuj gr,
naciskajc przycisk Play znajdujcy si w górnej czci interfejsu.
Teraz bdziesz móg przemieszcza kamer i strzela pociskami za pomoc lewego klawisza
Ctrl na klawiaturze. Jeli chcesz zmieni si wystrzau pocisku, po prostu zmodyfikuj zmienn
70
Rozdzia 2. • Podstawy tworzenia prototypów i skryptów
publiczn Power poprzez wybranie obiektu Main Camera, a nastpnie wprowadzenie innej
wartoci w miejsce liczby 1500 przypisanej do komponentu Shooter (Script). Pamitaj, aby
zawsze nacisn przycisk Play w celu zakoczenia testowania.
Podsumowanie
Gratulacje! Wanie stworzye swój pierwszy prototyp w rodowisku Unity.
W tym rozdziale poznae zasady uywania interfejsu Unity, obiektów gry i komponentów,
a take podstawy tworzenia skryptów. Miejmy nadziej, e wiedza ta bdzie solidnym funda-
mentem, na którym zostanie zbudowane dalsze dowiadczenie w tworzeniu gier komputerowych
w rodowisku Unity.
A teraz chwila odpoczynku. Zagraj w stworzony przez siebie prototyp gry, a moe stwórz kolejny
w oparciu o informacje zaprezentowane w tym rozdziale. By moe jeste jednak dny wie-
dzy — jeli tak, kontynuuj czytanie ksiki!
Skoro poznae ju podstawowe operacje dostpne w rodowisku projektowym Unity, zajmijmy
si waciw gr, która bdzie omawiana w dalszych rozdziaach tej ksiki.
W nastpnym rozdziale rozpoczniemy tworzenie gry zwanej Survival Island (wyspa przetrwania).
Poznasz, w jaki sposób mona bdzie wykorzysta narzdzia tworzenia terenu, aby uksztatowa
tropikaln wysp, która ma nawet swój wulkan! W dalszej kolejnoci umiecisz na niej prefa-
brykat postaci gracza i zwiedzisz nowo utworzony raj tropikalny!
71
Projektowanie gier w rodowisku Unity 3.x
72
3
Tworzenie rodowiska
W tym rozdziale zapoznamy si z dziaaniem edytora terenu, a take dowiemy si, w jaki sposób
moemy wykorzysta jego zestaw narzdzi, aby stworzy rodowisko gry. Odpowiednie apli-
kacje do projektowania rzeby terenu, geometrii oraz malowania za pomoc tekstur pozwol
na wygenerowanie caego terenu wyspy. Szczególnie dokadnie zostan omówione nastpujce
zagadnienia:
Zanim uyjemy narzdzi edytora terenu do zbudowania wyspy, spróbujmy zastanowi si,
co zamierzamy stworzy , aby podczas czytania tej ksiki pamita o naszym celu.
Projektowanie gry
By waciwie przygotowa si do zrealizowania zadania polegajcego na stworzeniu wikszej gry,
zastanówmy si dobrze, co waciwie zamierzamy zbudowa . Dziki temu bdziesz móg lepiej
zrozumie sens nastpnych dziaa i ich odpowiednie zalenoci od siebie.
Gra, któr chcemy zaprojektowa , bdzie si nazywa Survival Island. Oczywicie moesz
wymyli dowoln nazw i jej uy ! Podstawowa koncepcja gry polega na tym, e posta sterowana
Projektowanie gier w rodowisku Unity 3.x
przez Ciebie pojawia si na bezludnej wyspie, gdzie znajduje si aktywny wulkan i barak zbu-
dowany przez jak firm. Twoim celem jest przetrwanie nocy na wyspie dziki rozpaleniu
ognia, który oprócz tego, e bdzie Ci ogrzewa , pozwoli na wezwanie pomocy. Aby rozpali
ogie, potrzebujesz zapaek, lecz one znajduj si w zamknitym baraku. By otworzy barak,
gracz musi znale kilka ogniw pozwalajcych zasili generator sterujcy drzwiami baraku.
Ostatnie ogniwo bdzie dostpne w minigrze, w któr bdziesz musia zagra . Bdzie ona polega
na rzucaniu orzechami kokosowymi do celów w strzelnicy. Jeli uda Ci si je wszystkie zaliczy ,
wygrasz najwaniejsz i ostatni bateri! Gracz rozpocznie gr na play i bdzie musia znale
budynki, wdrujc po ciece na wyspie.
Oto ogólny szkic wyspy — oczywicie budynki, ognisko i wulkan nie zostay przedstawione
we waciwej skali!
Nastpnie zaimportujemy pozostae elementy gry: barak, ogniwa oraz inne skadniki. Bd one
dostpne w pakiecie zasobów przygotowanym specjalnie dla tej ksiki. W dalszych rozdziaach
uzupenimy teren wyspy o dodatkowe szczegóy; bdzie on wyglda podobnie jak drugi rysunek
na nastpnej stronie
Konwencje nazewnicze
Pamitaj o tym, by nazywajc elementy, zwraca uwag na wielko liter, poniewa podczas tworzenia kodu
dotyczcego przykadowo nowej sceny bdziemy uywa nazwy „Island” zaczynajcej si od wielkiej litery.
74
Rozdzia 3. • Tworzenie rodowiska
W rodowisku Unity teren jest po prostu obiektem gry, który zawiera doczony komponent
ze specjalnymi narzdziami. Tworzenie terenu rozpoczynasz od wygenerowania zwykej pasz-
czyzny, czyli jednostronnego i paskiego trójwymiarowego ksztatu. Moe by on nastpnie szybko
przeksztacony na zoony zestaw realistycznych obiektów geometrycznych uzupenionych
o szczegóy, takie jak drzewa, skay, roliny, a nawet efekty atmosferyczne, np. wiatr.
75
Projektowanie gier w rodowisku Unity 3.x
Zanim zaczniesz modyfikowa swój teren, powiniene zdefiniowa okrelone parametry charak-
teryzujce jego rozmiar i poziom szczegóowoci.
Gówna opcja menu Terrain (teren) pozwala nie tylko na tworzenie terenu dla gry, lecz równie
umoliwia przeprowadzenie operacji omówionych w poniszych punktach (teraz zostan one
zaprezentowane ogólnie; dokadny opis pojawi si w dalszej czci ksiki).
Uwaga
Podczas uywania narzdzi Paint Tools w rodowisku Unity jest w rzeczywistoci tworzona niewidoczna
dla uytkownika mapa wysokociowa. Narzdzia te pozwalaj na prostsz jej obsug, ni ma to miejsce
w innych aplikacjach. Czytelnicy, którzy zajmuj si grafik, mog wykorzysta t moliwo w celu zaim-
portowania lub wyeksportowania istniejcych map stworzonych przez siebie przy uyciu innych pakietów.
Ustalanie rozdzielczoci
Zaprezentowane niej okno dialogowe pozwala na zdefiniowanie szeregu waciwoci dla ka-
dego nowo utworzonego obiektu terenu.
Ustawienia te powinny zosta zdefiniowane zawsze przed stworzeniem topografii terenu. Ich
póniejsza zmiana moe spowodowa , e wprowadzone przez Ciebie modyfikacje zostan
uniewanione.
76
Rozdzia 3. • Tworzenie rodowiska
Q Terrain Width (szeroko obszaru terenu), Terrain Height (wysoko obszaru terenu)
i Terrain Length (dugo obszaru terenu). Wielkoci te s wyraone w metrach. Zwró
uwag na to, e parametr Terrain Height oznacza maksymaln wysoko , jak moe
osign topografia terenu.
Q Heightmap Resolution (rozdzielczo mapy wysokociowej). Jest to rozdzielczo
tekstury, któr przechowuje rodowisko Unity w celu reprezentowania topografii
za pomoc pikseli. Pomimo tego, e wikszo tekstur terenów w systemie Unity
ma rozmiary równe potdze dwójki (128×128, 256×256, 512×512 itd.), rozdzielczoci
mapy wysokociowej wymagaj uwzgldnienia dodatkowego piksela. Wynika to std,
i kady piksel definiuje punkt wierzchoka, dlatego na przykad dla terenu o rozmiarze
4×4 istniej cztery wierzchoki, które s obecne w kadym rzdzie siatki. Mimo tego
liczba punktów, w których te wierzchoki si cz (wliczajc w to krawdzie terenu),
wynosi 5.
Q Detail Resolution (rozdzielczo szczegóów). Rozdzielczo grafiki, znana jako
mapa rozdzielczoci szczegóów, któr rodowisko Unity przechowuje w metadanych
projektu. Definiuje ona poziom dokadnoci szczegóów terenu. Szczegóami
s dodatkowe skadniki terenu, takie jak roliny, skay czy krzewy. Im wysza jest
warto parametru, tym dokadniej moesz rozmieci szczegóy na terenie, biorc
pod uwag ich lokalizacj.
Q Detail Resolution Per Patch (rozdzielczo szczegóów dla fragmentu).
Rozdzielczo kadego fragmentu terenu.
Q Control Texture Resolution (rozdzielczo tekstury sterujcej). Jest to rozdzielczo
tekstur podczas ich nakadania na powierzchni terenu. Inna nazwa tego parametru
w rodowisku Unity to tekstury Splatmap. Definiuje on szczegóy gradientów przej
midzy teksturami umieszczanymi na powierzchni terenu. Podobnie jak w przypadku
kadej rozdzielczoci tekstur jest zalecane, aby warto tego parametru bya niewielka,
gdy poprawia to sprawno dziaania systemu. Pamitajc o tym, dobrze jest zachowa
jego domyln warto równ 512. Im parametr jest wyszy, tym dokadniej mona
poczy krawdzie wielu tekstur znajdujcych si na tym samym obszarze.
Q Base Texture Resolution (rozdzielczo tekstury podstawowej). Rozdzielczo tekstury
uywanej przez rodowisko Unity podczas renderowania obszarów terenu, które
s odpowiednio odlege od wykorzystywanej przez gr kamery, lub w przypadku
sprztu o gorszej wydajnoci.
77
Projektowanie gier w rodowisku Unity 3.x
Funkcji tej nie powinno si uywa w kadym przypadku, poniewa nie pozwala ona kontro-
lowa pooenia drzew, lecz jedynie wpywa na gsto ich rozmieszczenia, a take grubo
i wysoko pni, co wynika z parametrów samego komponentu. Zaleca si, aby zamiast tej funkcji
uywa narzdzia Place Trees (rozmieszczanie drzew), które pozwala na samodzielne definio-
wanie bardziej realistycznej metody rozmieszczania drzew.
Stworzye ju wasny teren, wic powinien on by widoczny w panelu Hierarchy (hierarchia).
Jeli nie zosta jeszcze wybrany, zrób to teraz, aby wywietli jego waciwoci w panelu Inspector.
Skrypt terenu
Zestaw narzdzi edycji terenu widoczny w panelu Inspector jest dostpny w postaci kompo-
nentu o nazwie Terrain (Script) (skrypt terenu). Komponent ten pozwala na wykorzystanie rónych
narzdzi i zdefiniowanie ustawie terenu, poniewa jest uzupenieniem wczeniej omówionych
funkcji, dostpnych w menu gównym aplikacji.
Komponent Terrain (Script) zosta podzielony na kilka sekcji, które s atwo dostpne dziki
widocznym ikonom. Poniej zaprezentujemy krótki przegld ich moliwoci w dziedzinie two-
rzenia terenów.
78
Rozdzia 3. • Tworzenie rodowiska
Masz równie moliwo okrelenia stylów pdzli, a take rozmiaru i stopnia przezroczystoci
(skutecznoci) deformacji, któr tworzysz. Nacinicie i przytrzymanie klawisza Shift podczas
uywania tego narzdzia powoduje efekt przeciwny, czyli obnienie wysokoci, co zaprezento-
wano na poniszym rysunku.
Ustalanie wysokoci
Narzdzie to dziaa podobnie jak wczeniej omówiona opcja zwikszania wysokoci, pozwala
jednak ustali t wysoko .
79
Projektowanie gier w rodowisku Unity 3.x
Oznacza to, e moesz zdefiniowa poziom wysokoci, który nie zostanie przekroczony. Jeli
na przykad definiowany przez Ciebie obszar terenu osignie okrelon wysoko , zostanie
spaszczony, co pozwoli na utworzenie paskowyu. Przedstawiono to na poniszym rysunku.
Wygadzanie powierzchni
Ta opcja jest uywana przede wszystkim w celu uzupenienia dziaania pozostaych narzdzi,
takich jak definiowanie wysokoci, aby wygadzi strome obszary topografii.
Nakadanie tekstur
Narzdzie to jest uywane do nakadania tekstur (zwanych w rodowisku Unity Splats) na po-
wierzchni terenu (patrz drugi rysunek na nastpnej stronie).
80
Rozdzia 3. • Tworzenie rodowiska
Aby móc umieci tekstur na terenie, musi ona zosta najpierw dodana do palety dostpnej
w obszarze Textures (tekstury) tego narzdzia. Tekstury mog by dodawane poprzez kliknicie
przycisku Edit Textures (edycja tekstury), a nastpnie wybranie opcji Add Texture (dodaj tek-
stur). Pozwala to na uycie w projekcie dowolnego pliku graficznego, a take zdefiniowanie
parametrów okrelajcych jego podzia na mniejsze elementy.
Pierwsza tekstura, jak dodasz do palety, bdzie domylnie umieszczona na caej powierzchni
terenu. Dziki poczeniu kilku tekstur o rónych poziomach przezroczystoci, które samo-
dzielnie naoysz na teren, bdziesz móg uzyska realistycznie wygldajce obszary o takim typie
powierzchni, jaki sobie zayczysz.
Aby wybra tekstur, któr chcesz umieci na terenie, po prostu kliknij jej miniaturk widoczn
na palecie Textures. Uywana tekstura jest wyróniona niebieskim prostoktem.
Umieszczanie drzew
Oto kolejne narzdzie, które wykonuje czynno zgodn z jego nazw. Poprzez malowanie przy
uyciu myszy lub zastosowanie pojedynczych klikni mona za jego pomoc umieszcza drzewa
na terenie, okrelajc jednoczenie, jaki zasób naley w tym celu wykorzysta .
81
Projektowanie gier w rodowisku Unity 3.x
Równie tutaj, podobnie jak w przypadku narzdzia nakadania tekstur, masz dostp do przycisku
Edit Trees (edycja drzew), pozwalajcego na dodawanie, edycj i usuwanie zasobów z palety.
S one prefabrykatami drzew bdcych obiektami gry. Podczas projektowania gry bdziesz
wykorzystywa prefabrykat drzewa palmowego, który zosta zaimportowany razem z innymi
zasobami terenu w trakcie tworzenia nowego projektu na samym pocztku ksiki.
Mona równie wykorzysta klawisz Shift, by odwróci efekty dziaania tego narzdzia. W tym
przypadku uycie klawisza Shift usuwa istniejce drzewa z terenu. Dodatkowe wcinicie kla-
wisza Ctrl pozwala na usuwanie drzew o typie, który jest wybrany w palecie.
Umieszczanie szczegóów
Opcja ta jest podobna w dziaaniu do narzdzia umieszczania drzew, lecz uywa si jej dla
mniejszych obiektów, takich jak kwiaty, roliny czy skay.
Ustawienia terenu
Opcja ustawie terenu dostpna w palecie ikon Terrain (Script) zawiera róne parametry zwi-
zane z generowaniem terenu przez procesor karty graficznej (GPU).
82
Rozdzia 3. • Tworzenie rodowiska
W ustawieniach terenu moesz przykadowo zmodyfikowa parametr Base Map Distance (odle-
go mapy podstawowej), aby zdefiniowa , w jakiej odlegoci od gracza grafika o wysokiej
jakoci powinna zosta zastpiona teksturami o mniejszej rozdzielczoci. Dziki temu genero-
wanie odlegych obiektów bdzie mniej kosztowne.
Przy tworzeniu pierwszego projektu nie chcemy, aby wyspa bya zbyt rozlega, dlatego zdefiniuj
parametry Terrain Width (szeroko ) i Terrain Length (dugo ) równe 500 jednostkom. Pamitaj,
by naciska klawisz Enter po wprowadzeniu kadej z wartoci. Dziki temu bdziesz móg je
skutecznie zapamita po klikniciu przycisku Set Resolution (ustaw rozdzielczo ).
Poziom wyspy powinien si znajdowa na wysokoci ziemi, a nie w pooeniu zerowym, które jest
domylnie przyjmowane dla kadego nowo tworzonego terenu. Jeli zakadasz, e pooenie
zerowe wyspy powinno by równe poziomowi morza, wówczas poziom ziemi powinien zosta
podwyszony i sta si wysokoci, na której znajduje si powierzchnia wyspy. Przejd do opcji
menu Terrain/Flatten Heightmap (teren/wyrównanie mapy wysokociowej).
Kliknij mysz wewntrz pola edycji Height (wysoko ), a nastpnie wprowad warto 30 metrów
i zatwierd j klawiszem Enter. Kliknij przycisk Flatten (wyrównanie), by zapamita zmiany.
83
Projektowanie gier w rodowisku Unity 3.x
Powysza modyfikacja wprowadza bardzo niewielk rónic w widoku Scene (scena), ponie-
wa to, co zrobilimy, byo tylko niewielkim podniesieniem terenu w gór. Jednake powodem
wprowadzenia tej modyfikacji bdzie due zaoszczdzenie czasu w przyszoci, gdy moemy
teraz obniy krawdzie terenu przy uyciu odwróconej opcji zwikszania wysokoci, co pozwoli
na uzyskanie podwyszonej wyspy porodku tworzonego obszaru. Ta metoda jest bardziej wydajna
czasowo ni tworzenie terenu o wysokoci zerowej, a nastpnie podwyszanie jego centralne-
go miejsca.
Wybierz pierwszy pdzel z palety i ustaw jego parametr Brush Size (rozmiar pdzla) na war-
to 100. Przypisz parametrowi Opacity (nieprzezroczysto ) warto 75.
Klikajc o Y (zielony stoek) w gadecie znajdujcym si w prawym górnym naroniku okna,
zmie widok w panelu Scene, co umoliwi spogldanie z góry na tworzony teren.
Uywajc klawisza Shift w celu obnienia wysokoci, rozpocznij rysowanie ksztatu terenu: stwórz
lini brzegow, która opada do poziomu zerowego. atwo poznasz, e osigna ona minimaln
wysoko , poniewa teren zostanie automatycznie wyrównany na tej wysokoci.
Mimo e nie musimy dokadnie odwzorowywa wyspy zaprezentowanej na pocztku tego roz-
dziau, postaraj si nie tworzy zbyt dziwnego ksztatu, poniewa bdziesz potrzebowa wik-
szego obszaru paskiego terenu, eby umieci na nim budynki. Jeli potrzebujesz pomocy, spójrz
na poniszy szkic lub skorzystaj z rysunku przedstawionego we wczeniejszej czci tego roz-
dziau. Po zakoczeniu pracy powiniene uzyska ksztat podobny do tego, który wida na poni-
szym rysunku.
Powi troch czasu, aby utworzy dodatkowe elementy topograficzne. W tym celu uyj narz-
dzia Raise/Lower Terrain. Moesz take zastosowa klawisz Shift, by utworzy jezioro. Nastpnie
wykorzystaj narzdzie Smooth Height (wygadzanie powierzchni) do wyrównania zbyt ostrych
krawdzi. Pozostaw paski obszar w poudniowo-zachodniej czci terenu (lewy dolny naronik
na powyszym rysunku), na którym umiecimy wulkan!
84
Rozdzia 3. • Tworzenie rodowiska
Etap 3. Wulkan!
A teraz stwórzmy wulkan! W tym celu musisz zastosowa kombinacj narzdzi Paint Height
(ustalanie wysokoci), Raise/Lower Terrain oraz Smooth Height. Najpierw jednak uyj opcji
Paint Height.
Wybierz pierwszy pdzel z palety, a nastpnie ustal warto parametru Brush Size na 75, Opacity
na 50, a Height (wysoko ) na 100. Ponownie zmie widok w panelu Scene, co umoliwi spogl-
danie z góry na tworzony teren. Rozpocznij rysowanie na paskowyu w poudniowo-zachodniej
czci wyspy, któr pozostawie niezmienion podczas tworzenia terenu. Pamitaj, e narzdzie
przestanie dziaa po osigniciu wysokoci równej 100 jednostek.
A teraz, trzymajc wcinity przycisk myszy, rozpocznij rysowanie: zacznij od rodka pasko-
wyu z wulkanem i kieruj si równomiernie w stron jego krawdzi. Wykonuj dziaanie dopóty,
dopóki nie uzyskasz odpowiedniego wydrenia oraz wskich cian wokó niego, tak jak zapre-
zentowano na drugim rysunku na nastpnej stronie.
85
Projektowanie gier w rodowisku Unity 3.x
Wci jednak krawdzie wierzchoka s zbyt ostre. Gdy wybierzesz widok perspektywiczny,
sam bdziesz móg si przekona , e wulkan nie wyglda zbyt adnie. Aby go poprawi , powi-
niene uy narzdzia Smooth Height. Wybierz je, a nastpnie przypisz parametrowi Brush Size
warto 30, a Opacity — warto 100. Trzymajc nacinity klawisz myszy, staraj si przemiesz-
cza pdzlem po wierzchoku i wygadzaj jego krawdzie a do momentu, gdy uzyskasz agodny
grzbiet, tak jak przedstawiono na poniszym rysunku:
86
Rozdzia 3. • Tworzenie rodowiska
Wreszcie powi troch czasu na stworzenie kilku nierównoci na caym terenie, pamitaj jed-
nak o pozostawieniu cieki wiodcej z poudniowej czci wyspy (dolnego fragmentu ksztatu
widocznego na powyszym rysunku) do miejsca, gdzie umiecisz budynki pokazane na mapie
zaprezentowanej wczeniej w tym rozdziale.
Gdy wulkan uzyska ju odpowiedni ksztat, moemy si zaj nakadaniem tekstur na wysp
w celu uzyskania wikszego realizmu.
W pakiecie Terrain Assets (zasoby terenu), który dodalimy podczas rozpoczynania projektu,
znajdziesz róne zasoby pozwalajce na dopasowanie terenu do wasnych potrzeb. W panelu
Project odszukaj folder o nazwie Standard Textures (standardowe tekstury), który z kolei zawiera
podfolder Terrain Assets. Rozwi go, klikajc szar strzak po lewej stronie jego nazwy, a nastp-
nie otwórz podkatalog Terrain Textures (tekstury terenu). Tam znajdziesz niezbdne pliki
graficzne z teksturami.
W folderze Terrain Textures zawarto cztery tekstury, których uyjesz podczas tworzenia terenu
wyspy. Rozpocznijmy od dodania ich do palety. Upewnij si, e obiekt gry Terrain jest wci
aktywny w panelu Hierarchy, a nastpnie wybierz narzdzie Paint Texture (nakadanie tekstur)
z komponentu Terrain (Script), dostpnego w obszarze Inspector.
87
Projektowanie gier w rodowisku Unity 3.x
Pozostaw niezmienione wartoci parametrów Tile Size X (rozmiar X kafla) i Tile Size Y (rozmiar
Y kafla) równe 15. Poniewa uyta tekstura pokryje ca map, taka niewielka warto parame-
trów pozwoli na uzyskanie odwzorowania o wikszej liczbie szczegóów. Parametry Tile Offset
(przesunicie kafla) powinny by równe 0, gdy tekstura jest zaprojektowana do standardowego
kafelkowania i nie musi zosta przesunita.
Kliknij przycisk Add (dodaj), aby zakoczy . Cay teren zosta automatycznie przykryty trawiast
tekstur, poniewa wybrano j jako pierwsz. Kada kolejna tekstura dodana do palety bdzie
musiaa zosta naoona przez Ciebie samodzielnie.
Powtarzaj powysz czynno , by doda jeszcze trzy tekstury do palety: wybierz nazwy
Grass&Rock (trawa i skay), GoodDirt (solidny kurz) oraz Cliff (Layered Rock) (warstwowa
ciana skalna). Dla ostatniej tekstury ustal warto parametrów Tile Size X i Tile Size Y na 70,
poniewa zostanie ona uyta w rozcignitym obszarze mapy. Gdyby rozmiar kafli by nieduy,
tekstura mogaby wydawa si znieksztacona.
Obszary piasku
W palecie znajduj si teraz cztery tekstury. Wybór tekstury o nazwie GoodDirt powinien
spowodowa , e bezporednio pod ni ukae si niebieska linia. Wartoci parametrów powinny
by nastpujce: Brush Size — 60, Opacity — 50, a Target Strength (natenie) — 1. Moesz
zacz malowa wybrzee wyspy, uywajc widoku z góry lub perspektywicznego.
88
Rozdzia 3. • Tworzenie rodowiska
Uwaga
Jeli do nakadania tekstur uywasz widoku perspektywicznego, dobrze jest pamita o tym, e w celu
obrócenia makiety moesz podczas przecigania myszy uy klawisza Alt. Ta metoda dziaa, gdy zostao
wybrane narzdzie Hand (skrót klawiszowy Q) lub Transform (skrót klawiszowy W). Moesz take powik-
sza rozmiar dowolnego panelu nalecego do interfejsu Unity poprzez umieszczenie kursora myszy nad
nim, a nastpnie nacinicie klawisza spacji.
Jeli podczas malowania popenisz jaki bd, moesz usun rezultat pojedynczego uycia pdzla
(czyli jednorazowego ruchu myszy przy wcinitym jej przycisku), wybierajc opcj menu
Edit/Undo (edycja/wycofanie zmian). Moesz take wybra tekstur z palety i uy jej do ponow-
nego pomalowania terenu.
Trawa i skay
Wybierz tekstur Grass&Rock poprzez kliknicie drugiej miniaturki znajdujcej si na palecie.
Ustaw nastpujce wartoci parametrów: Brush Size — 25, Opacity — 30 i Target Strength — 0,5.
Pomaluj obszary pagórkowate oraz górn cz wierzchoka wulkanu.
89
Projektowanie gier w rodowisku Unity 3.x
Pomaluj górn zewntrzn cz wierzchoka oraz cay wewntrzny obszar stoka nalecy
do wulkanu. Nastpnie powoli zmniejszaj warto parametrów Opacity i Brush Size w miar
malowania coraz niszych partii terenu. Dziki temu tekstura skay bdzie pynnie przeksztaca
si w tekstur trawy. Uywajc niszych wartoci nieprzezroczystoci, moesz take pomalowa
inne wysze wzniesienia na wyspie.
Jeli powicisz troch czasu na eksperymenty, docelowy wygld Twojego wulkanu powinien by
podobny do tego, który zosta przedstawiony na poniszym rysunku.
90
Rozdzia 3. • Tworzenie rodowiska
Teraz uyjemy jednak drzewa palmowego, które zostao dla nas wykonane. Wybierz narzdzie
Place Trees (umieszczanie drzew), a nastpnie kliknij przycisk Edit Trees (edycja drzew). Z menu
podrcznego wybierz opcj Add Tree (dodaj drzewo).
Pojawi si okno Add Tree (dodaj drzewo). Tak jak ma to miejsce w przypadku innych narzdzi
edycji terenu, to okno dialogowe pozwala na wybranie z folderu Assets obiektu o odpowied-
nim typie.
Dla zasobów terenu nie istniej ograniczenia dotyczce drzew. Oznacza to, e moesz doda
modele wasnych drzew poprzez skopiowanie ich do folderu Assets (w celu dokadniejszego
zapoznania si z tym zagadnieniem przeczytaj odpowiedni dokumentacj dotyczc obiek-
tów drzew). My jednak bdziemy uywa drzewa palmowego dostarczonego razem z zasobami
terenu. Kliknij ikon koa znajdujc si po prawej stronie ustawienia Tree (drzewo). Podobnie
jak w przypadku omówionej wczeniej opcji nakadania tekstur, równie i tutaj spowoduje
to otwarcie okna dialogowego Select GameObject (wybór obiektu gry), w którym moesz wybra
obiekt Palm (drzewo palmowe).
Atrybut Bend Factor (wspóczynnik uginania) umoliwia uzyskanie efektu uginania drzew pod
wpywem wiatru. Jest on jednak wymagajcy obliczeniowo i kada jego warto róna od zera
moe spowodowa ograniczenie wydajnoci dziaania aplikacji podczas testowania gry. Jeli
to zauwaysz, przypisz parametrowi Bend Factor ponownie warto 0. W celu uzyskania niewiel-
kiego ugicia drzew uyjemy niskiej wartoci atrybutu równej 2. Po jej wprowadzeniu nie zapo-
mnij o naciniciu klawisza Enter. Jeli stwierdzisz, e podany parametr wpywa na nisk wydaj-
no dziaania programu, moesz zawsze wprowadzi warto 0. Kliknij przycisk Add (dodaj),
by zapamita dokonane zmiany.
Moesz zobaczy drzewo palmowe na niewielkim obrazku otoczonym niebiesk ramk, która
oznacza, e zostao ono wybrane.
Ustal nastpujce wartoci parametrów: Brush Size — 15 (rysowanie pitnastu drzew za jednym
razem), Tree Density (gsto drzew) — 40 (szeroki rozrzut drzew), Color Variation (poziom
zmiennoci koloru) — 0,4, a take Tree Height (wysoko drzewa) — 50, Tree Width (grubo
drzewa) — 50 i towarzyszce im atrybuty Variation (poziom zmiennoci) — 30, dziki czemu
uzyskamy rónorodny zestaw drzew.
Uywajc pojedynczych klikni mysz, umieszczaj drzewa na wybrzeu wyspy niedaleko obsza-
rów piaszczystych, tam gdzie w rzeczywistoci powinny si one pojawia . Nastpnie, aby
uzupeni wygld terenu, umie jeszcze troch drzew palmowych w przypadkowych miejscach
na samej wyspie.
Pamitaj, e za kadym razem, gdy bdnie umiecisz drzewa, moesz je usuwa poprzez naci-
nicie i przytrzymanie klawisza Shift oraz malowanie (przeciganie) mysz.
91
Projektowanie gier w rodowisku Unity 3.x
W komponencie Terrain (Script) wybierz ikon Paint Details (umieszczanie szczegóów), a nastp-
nie kliknij przycisk Edit Details (edycja szczegóów). Wybierz opcj Add Grass Texture (dodaj
tekstur trawy) z menu podrcznego.
Pakiet zasobów terenu zawiera gotow tekstur trawy, dlatego kliknij ma ikon w ksztacie
koa, znajdujc si po prawej stronie ustawienia Detail Texture (tekstura szczegóów), aby
wywietli okno dialogowe Select Texture 2D (wybierz tekstur dwuwymiarow). Nastpnie
wybierz w nim tekstur nazwan po prostu Grass (trawa).
Po jej wybraniu pozostaw niezmienione wartoci parametrów Width (grubo ) i Height (wyso-
ko ) oraz upewnij si, e zostaa zaznaczona najniej pooona opcja Billboard. Poniewa tek-
stury definiujce szczegóy trawy s dwuwymiarowe, moemy uy techniki billboardingu,
wykorzystywanej podczas projektowania gier. Polega ona na tym, i dana tekstura jest zawsze
odwrócona przodem w stron kamery, co sprawia, e robi wraenie przestrzennej.
Jeli uywasz okien wyboru koloru, upewnij si, e atrybuty Healthy Color (kolor ywej roliny)
i Dry Color (kolor wyschnitej roliny) maj odcienie podobne do tekstury naoonej na teren.
Wybór zbyt jaskrawego koloru spowoduje, e tekstura bdzie wyglda sztucznie.
Kliknij przycisk Add (dodaj), znajdujcy si w dolnej czci okna dialogowego, aby potwierdzi
dodanie tekstury do palety.
92
Rozdzia 3. • Tworzenie rodowiska
lecz atrybutowi Opacity przypiszemy warto 0,1, a Target Strength — 0,3. Dziki temu uzy-
skamy duy obszar pokrycia przy niewielkiej iloci trawy. Wybierajc pdzel punktowy (patrz
poniszy rysunek), moemy stworzy niejednolite obszary pokryte traw.
Uwaga
Przyblienie powierzchni terenu podczas rysowania szczegóów w widoku Scene jest niezbdne, poniewa
z powodu oszczdzania pamici nie s one wywietlane przy zbyt duej skali mapy. Bdziesz móg czsto
zauway, e podczas oddalania si trawa i inne szczegóy nagle znikaj. Ale nie przejmuj si, one wci
znajduj si na swoim miejscu!
93
Projektowanie gier w rodowisku Unity 3.x
1. Owietlenie kierunkowe. Uywane jako gówne ródo wiata, czsto symuluje wiato
soneczne. Nie promieniuje ono z jednego punktu, lecz zamiast tego równomiernie
owietla scen z okrelonego kierunku.
2. Owietlenie punktowe. To wiato promieniuje z pojedynczego punktu przestrzeni
trójwymiarowej i symuluje pozostae róda, takie jak owietlenie wewntrz budynków,
ogie, wiecce obiekty itd.
3. Owietlenie reflektorowe. wiato to take pochodzi z jednego punktu,
lecz charakteryzuje si tym, e ma okrelony kierunek i rozproszenie, którego promie
mona modyfikowa , podobnie jak ma to miejsce w przypadku reflektora.
wiato kierunkowe nie promieniuje z jednego punktu, wic jego pooenie jest zupenie nie-
istotne, poniewa i tak nie moe by widoczne dla gracza. Widzimy jedynie generowane wiato.
Jednake w niniejszym poradniku zamierzamy uy owietlenia kierunkowego, które bdzie
reprezentowao soce. W tym celu zastosujemy efekt odbicia wiata w obiektywie kamery
(tzw. flar).
Aby zasymulowa soce, umiecimy ródo wiata wysoko nad wysp. By upewni si, e odpo-
wiada ono kierunkowi wysyanych promieni wietlnych, dodatkowo zdefiniujemy jego pooenie
na osi Z w duej odlegoci od pocztku ukadu wspórzdnych.
Umie ródo wiata w pooeniu (0, 250, -200) poprzez wprowadzenie odpowiednich war-
toci dla komponentu Transform w panelu Inspector. Parametr X rotation (obrót w osi X) ustaw
na warto 15, aby nachyli promienie w dó wzgldem osi X. Spowoduje to zwikszenie stopnia
owietlenia terenu wyspy.
Teraz musimy sprawi , by wiato stao si widzialne. W tym celu uyjemy efektu flary. rodo-
wisko Unity udostpnia go w standardowym pakiecie, który moemy zaimportowa . Zauwa,
e nie poprosiem Ci, aby doczy ten efekt na samym pocztku tworzenia naszego projektu.
Zrobiem to specjalnie, by móg teraz przetestowa czynno importowania nowego pakietu
zasobów.
Wczytajmy interesujcy nas pakiet, wybierajc opcj menu gównego Assets/Import Package/Light
Flares (zasoby/import pakietu/flary wietlne).
Pojawi si okno dialogowe Importing Package (importowanie pakietu), w którym moesz po prostu
klikn przycisk Import (importuj) w celu potwierdzenia wczytania pakietu. Jak widzisz, nie jest
to skomplikowane.
94
Rozdzia 3. • Tworzenie rodowiska
W tym momencie moesz klikn przycisk w ksztacie maego koa, znajdujcy si po prawej
stronie ustawienia Flare (flara) w komponencie Light (owietlenie). Spowoduje to otwarcie okna
dialogowego Select Flare (wybór flary), które zawiera kilka rodzajów wanie zaimportowanych
efektów flar. Wybierz t o nazwie Sun (soce), a nastpnie zamknij okno.
Etap 8. A co z d wikami?
Dwik jest czsto pomijanym zagadnieniem podczas projektowania gier. Aby uzyska naprawd
gbok immersj, gracz musi nie tylko widzie otoczenie, które mu udostpniasz, ale take je
sysze .
Dwik w rodowisku Unity jest obsugiwany za pomoc dwóch komponentów — róda audio
i odbiornika audio. Potraktuj ródo audio jako co w rodzaju gonika znajdujcego si w Twoim
wiecie gry, za odbiornik audio — jako mikrofon lub ucho gracza. Obiekt kamery ma w rodo-
wisku Unity domylnie doczony komponent odbiornika audio. Zakadajc wic, e w swojej
grze zawsze uywasz kamery, prawdopodobnie bdziesz musia jedynie zdefiniowa róda
dwiku. Dodatkowo komponent odbiornika audio nie wymaga adnych ustawie — po prostu
dziaa. Unity poinformuje Ci o bdzie, jeli przypadkowo usuniesz jedyny odbiornik audio
z danej sceny lub skorzystasz w danej chwili z wicej ni jednego aktywnego odbiornika.
Oznacza to, e rodowisko Unity bdzie automatycznie modyfikowao si dwików przy odda-
laniu si od ich róde, co jednak w przypadku dwiku otaczajcego nie jest podan opcj.
Dwik, nad którym pracujemy, powinnimy wic zmieni na paski — pozwoli nam to na uzy-
skanie staego poziomu sygnau bez wzgldu na to, gdzie znajduje si odbiornik, czyli ucho gracza.
Przykadowo:
Q Dwik paski jest najlepsz opcj dla muzyki w grze, poniewa jej sia powinna
by staa bez wzgldu na to, w którym miejscu wiata gry znajduje si gracz.
Q Dwik przestrzenny jest najlepszym wyborem w celu zdefiniowania efektu szafy
grajcej wewntrz budynku. Chocia efekt dwikowy moe odtwarza muzyk,
uycie dwiku przestrzennego sprawi, e stanie si ona goniejsza dla gracza
zbliajcego si do szafy grajcej, a take bdzie si przemieszcza midzy gonikami
w odpowiedzi na konkretne ruchy odbiornika, co docelowo spowoduje uzyskanie
wyszej immersji.
95
Projektowanie gier w rodowisku Unity 3.x
Wzgórza yj!
Aby uczyni wysp bardziej realistyczn, umiecimy w niej ródo audio odtwarzajce cige
odgosy otoczenia przy uyciu dwików paskich.
Rozpocznij od wybrania obiektu terenu w panelu Hierarchy. Przejd do opcji menu Component/
Audio/Audio Source (komponent/audio/ródo audio). Spowoduje to dodanie komponentu Audio
Source (ródo audio) do obiektu Terrain. W przypadku dwików paskich ich poziom pozostaje
niezmienny, za pooenie nie jest istotne, dlatego moemy umieci ródo audio w dowolnym
obiekcie. Sensowne jest wic poczenie dwiku otoczenia z obiektem terenu wyspy.
W panelu Inspector przy terenie moemy teraz zauway obecno komponentu Audio Source,
dla którego moesz wybra okrelony plik do odtwarzania lub pozostawi opcj niezmienion
w przypadku, gdy planujesz odtwarzanie dwików za pomoc skryptu. Zanim przypiszesz
dwik, musimy jednak dysponowa odpowiednim klipem oraz innymi zasobami niezbdnymi,
by korzysta z tej ksiki.
Pojawi si okno dialogowe Import Package (import pakietu), w którym bdziesz móg wybra
rozpakowany plik zasobów. Nastpnie kliknij przycisk Open (otwórz), aby go otworzy .
96
Rozdzia 3. • Tworzenie rodowiska
Kliknij przycisk Import (importuj), eby potwierdzi dodanie wszystkich plików do projektu.
Po krótkiej chwili powiconej na ich wczytanie powiniene je zobaczy w swoim projekcie.
Bd dostpne w folderze o nazwie Book Assets (zasoby ksiki). Nastpnie, klikajc szary trójkt
obok nazwy Sounds (dwiki), powiniene otworzy odpowiedni podfolder z plikami dwików.
Wybierz nazw hillside, co spowoduje pojawienie si grupy Audio Importer (importowanie audio)
w panelu Inspector.
Odznacz opcj wyboru 3D Sound (dwik przestrzenny), aby zmieni typ dwiku na paski.
Nastpnie kliknij przycisk Apply (zastosuj), znajdujcy si w dolnej czci obszaru Audio Importer,
by zatwierdzi wprowadzenie zmian. Bdziesz móg zauway pasek postpu w czasie ponow-
nego importowania pliku dwikowego z nowymi ustawieniami.
Plik hillside moe ju zosta uyty w komponencie Audio Source do terenu.
Kliknij ikon w ksztacie koa, znajdujc si po prawej stronie ustawienia Audio Clip (klip audio)
w komponencie Audio Source dla obiektu terenu. Zostanie wywietlone okno dialogowe Select
AudioClip (wybór klipu audio) prezentujce list dostpnych w Twoim projekcie plików dwiko-
wych. Wybierz plik hillside, a nastpnie zamknij okno.
Pozwoli to na automatyczne odtwarzanie dwiku w ptli, gdy gracz pojawi si w scenie (lub
uruchomi kolejny poziom).
Twój komponent Audio Source powinien wyglda tak jak na poniszym rysunku.
97
Projektowanie gier w rodowisku Unity 3.x
Aby uy szecianu skybox w naszej scenie, wybierz opcj menu Edit/Render Settings (edycja/usta-
wienia renderowania). Obszar Inspector zostanie odpowiednio zmodyfikowany, by wywietli
waciwoci renderowania sceny. Kliknij ikon w ksztacie koa, znajdujc si po prawej stronie
ustawienia Skybox Material (materia opcji skybox), co spowoduje otwarcie okna dialogowego
Select Material (wybierz materia). Technicznie skybox jest pewnym rodzajem materiau —
metod umieszczania w grze tekstur na trójwymiarowej siatce. Z otwartego okna wybierz pozycj
Sunny 2 Skybox, a wybrany materia zostanie uyty w szecianie skybox. Wane jest, aby pami-
ta, e kady skybox, który utworzysz, bdzie domylnie widoczny jedynie w panelu Game View,
chyba e klikniesz przycisk Game Overlay (nakadka gry), znajdujcy si nad górn krawdzi
widoku Scene.
Mimo e przy zastosowaniu systemu czstek jest moliwe stworzenie bardziej dynamicznych
efektów symulujcych wod, najlepsz metod pozwalajc na dodanie obszernego zbiornika
wodnego jest uycie jednego z odpowiednich materiaów, dostarczanych przez system Unity.
Pakiet Water (basic) assets (podstawowe zasoby wody) udostpnia dwie gotowe powierzchnie,
zawierajce materiay symulujce wod. S one zapamitane jako prefabrykaty i mog by atwo
uyte z poziomu panelu Project. Po prostu otwórz podfolder Water Basic (podstawowe zasoby
wody) w folderze Standard Assets.
1
Dosowne tumaczenie to „pudeko nieba” — przyp. tum.
98
Rozdzia 3. • Tworzenie rodowiska
Przecignij prefabrykat Daylight Simple Water na scen i umie go w pooeniu (250, 4, 250)
poprzez wprowadzenie odpowiednich wartoci w polach X, Y i Z dla parametru Position kom-
ponentu Transform, zawartego w panelu Inspector. Aby powikszy skal prefabrykatu wody
w celu utworzenia morza otaczajcego wysp, atrybutom X i Z parametru Scale przypisz po prostu
wartoci równe 1600.
Dziki temu uzyskasz obszar wodny w samym rodku mapy, którego powierzchnia znajdzie si
cztery metry powyej dna morskiego. Woda przykryje naroniki wyspy i ukryje jej prawdziw
natur opart na siatkach 3D. Cay teren powinien wyglda tak jak na poniszym rysunku.
W aktywnym panelu Scene przybli ten fragment wyspy, na którym chciaby umieci obiekt
gracza wykorzystujcy perspektyw pierwszej osoby. Twój widok powinien by podobny
do przedstawionego na poniszym rysunku.
Przecignij prefabrykat First Person Controller z panelu Project na widok Scene. Moesz zauwa-
y , e rodowisko Unity próbuje umieci prefabrykat nad napotkanym obiektem zderzacza —
w naszym przypadku jest to wbudowany zderzacz terenu. Po zwolnieniu przycisku myszy skon-
centruj widok na nowo utworzonym kontrolerze poprzez przemieszczenie kursora nad okno Scene
i nacinicie klawisza F.
99
Projektowanie gier w rodowisku Unity 3.x
By moe stwierdzisz, e obiekt jest po prostu do poowy zakopany w ziemi. Wynika to std,
i rodowisko Unity umieszcza rodek obiektu (lub punkt jego pocztku wspórzdnych)
na powierzchni zderzacza, na który go upuszczasz. To zjawisko zostao zaprezentowane na poni-
szym rysunku.
Stwarza to pewien problem, gdy podczas rozpoczynania sceny zderzacze nie powinny by
ze sob poczone. rodowisko Unity musi wówczas podj decyzj, co naley zrobi , by zli-
kwidowa poczenie, natomiast zderzacz dla kontrolera perspektywy pierwszej osoby moe
by nieaktywny do momentu, a znajdzie si we waciwym pooeniu. Do obiektu stosuj si
równie prawa grawitacji, dlatego moe on po prostu upa na powierzchni terenu.
Aby unikn takiej sytuacji, wybierz narzdzie Translate (klawisz W), a nastpnie przecignij
zielony uchwyt osi Y, by upewni si, e zielona kapsua zarysu zderzacza znajduje si nad
powierzchni terenu.
100
Rozdzia 3. • Tworzenie rodowiska
Gdy kontroler perspektywy pierwszej osoby jest ju aktywnym obiektem w grze, moesz zoba-
czy go w panelu Hierarchy, a jego komponenty w panelu Inspector.
A teraz nacinij przycisk Play, aby przetestowa gr. Bdziesz móg porusza si po terenie
swojej wyspy!
Gdy pospacerowae ju po wyspie, moesz wyj z trybu testowania, ponownie naciskajc przy-
cisk Play.
Aby rozwiza ten problem, po prostu usu obiekt Main Camera, poniewa ju go nie potrzebu-
jemy. W tym celu zaznacz go w panelu Hierarchy, a nastpnie nacinij klawisze Delete (PC)
lub Command+Backspace (Mac). W przypadku innej platformy kliknij prawym klawiszem myszy
nazw obiektu w panelu Hierarchy i wybierz opcj Delete (usu) z menu podrcznego.
Teraz budowa wyspy jest ju zupenie ukoczona. Wybierz opcj menu File/Save Scene (plik/zapisz
scen) i zapamitaj swoj scen, aby nie utraci danych.
Gratulacje! Teren Twojej wyspy jest gotowy do eksploracji, wic ponownie nacinij przycisk Play
i j rozpocznij! Pamitaj, aby po zakoczeniu ponownie nacisn przycisk Play w celu wyjcia
z trybu testowania.
Podsumowanie
W tym rozdziale zapoznalimy si z podstawami projektowania Twojego pierwszego rodowi-
ska gry. Rozpoczynalimy od zwykej paszczyzny, lecz po krótkim czasie dysponujemy terenem
wyspy cakowicie gotowym do eksploracji. Przyjrzelimy si take zagadnieniom zwizanym
101
Projektowanie gier w rodowisku Unity 3.x
Pamitaj, e zawsze moesz uy narzdzi edycji terenu omówionych w tym rozdziale, aby umie-
ci na wyspie wicej szczegóów. To wanie uczynimy w rozdziale 11., zatytuowanym „Poprawa
wydajnoci i kocowe modyfikacje”. Gdy dokadniej poznasz system obsugi dwiku, uyjemy
go w dalszej czci ksiki, by doda kolejne róda audio do gry.
Podczas czytania ksiki bdziesz odkrywa kolejne elementy, które pozwol na takie uzupenienie
rodowiska gry, aby jeszcze bardziej „zawiesi niewiar” gracza i zwikszy poziom jego immersji.
Postaramy si zwikszy poziom dynamizmu wyspy: uyjemy systemu czstek, dodamy efekt
ognia, a nawet ozdobimy wulkan pióropuszem z dymu i popiou!
W kolejnych rozdziaach umiecimy w scenie budynek placówki, a nastpnie dowiemy si, w jaki
sposób mona uruchomi animacj otwieranych drzwi w momencie zbliania si do nich przez
gracza. Aby zrealizowa to zadanie, pogbimy najpierw nasz wiedz o tworzeniu skryptów
w rodowisku Unity, a take uczynimy pierwszy krok do projektowania prawdziwych interakcji
w grze.
102
4
W tym rozdziale poszerzymy scenariusz wyspy stworzony przez nas w poprzedniej czci
ksiki. W tym celu zapoznamy si z konstruowaniem postaci gracza, którego obiekt dodalimy
ju do sceny. Obiekt ten jest przykadem postaci wykorzystujcej perspektyw pierwszej osoby.
W jaki jednak sposób zestaw jego komponentów pozwala na uzyskanie takiego rezultatu?
Podczas analizy poszczególnych skadników tworzcych posta gracza zapoznamy si dokadnie
ze sposobem wykonania jego prefabrykatu.
Poniewa w scenie gry umiecilimy ju prefabrykat, moglibymy zaakceptowa to, e dziaa
on prawidowo, i kontynuowa projekt, lecz byoby to jednak zbyt proste. W kadym przypadku,
gdy wykorzystujesz dowolne zasoby nieutworzone przez Ciebie, powiniene upewni si, e
rozumiesz zasad ich dziaania, nawet jeli jeszcze sam nie potrafisz ich zaprojektowa . W prze-
ciwnym razie, jeeli cokolwiek si nie powiedzie, bdziesz mia duy problem, w którym nie
pomog nawet proby o pomoc kierowane do innych osób.
Pamitajc o powyszym, aby zrozumie , w jaki sposób poczenie dosownie kilku obiektów
i komponentów moe spowodowa utworzenie penowartociowej postaci, zapoznamy si z nast-
pujcymi zagadnieniami:
Na samym szczycie panelu Inspector znajduje si nazwa wybranego obiektu, a take ikona
reprezentujca obiekt lub prefabrykat (odpowiednio szecian o cianach w kolorach czerwonym,
zielonym i niebieskim lub jasnoniebieskim).
Po prawej stronie pola z nazw widnieje opcja wyboru Static (statyczny). Wybranie jej informuje
rodowisko Unity o tym, e dany obiekt w scenie nie bdzie si porusza w trakcie trwania gry
i mona go wykorzysta do utworzenia odwzorowania wiata na jego powierzchni. Narzdzie
Lightmapping (odwzorowywanie wiata) zostanie zaprezentowane w dalszej czci tej ksiki,
aby poprawi estetyk sceny. Opcja Static pozwala na uycie opcji Bake (wypalanie) — pótr-
waego renderingu owietlenia sceny na jej teksturach, aby zwikszy gbi widoku i jego
realizm.
Zaznacz opcj wyboru Static dla obiektu Directional light, poniewa póniej uyjemy go
w narzdziu Lightmapping.
Oprócz ikony, opcji wyboru informujcej o uyciu obiektu oraz jego nazwy moesz zauway
pola Tag (znacznik) i Layer (warstwa).
104
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Znaczniki
Znaczniki s zwykymi sowami kluczowymi, które mog zosta przypisane do obiektu gry. Do
utworzenia znacznika moesz wykorzysta sowo lub zwrot opisujce dany obiekt (lub obiekty)
w skryptach gry (jeden znacznik moe by wykorzystywany wiele razy). Jeli uywae wczeniej
aplikacji Adobe Flash, moesz potraktowa znaczniki jako co w rodzaju nazwy instancji. Oba
pojcia bazuj na sowach kluczowych reprezentujcych obiekty w scenie.
Dodawanie znacznika do obiektu gry jest procedur dwustopniow. Najpierw Twój znacznik musi
zosta umieszczony na licie przy uyciu menedera znaczników, a nastpnie zastosowany
w wybranym przez Ciebie obiekcie.
Aby prze wiczy t procedur, stwórzmy i dodajmy pierwszy znacznik do obiektu Directional
light. Zaznacz go w panelu Hierarchy, a nastpnie kliknij menu podrczne Tag w miejscu,
w którym jest wywietlona nazwa Untagged (bez znaczników).
Spowoduje to wywietlenie listy istniejcych znaczników. Moesz wybra znacznik z listy lub
utworzy nowy. Wybierz opcj Add Tag (dodaj znacznik), znajdujc si w dolnej czci menu,
aby doda znacznik do listy w menederze znaczników.
W panelu Inspector bdzie mona teraz zobaczy opcj Tag Manager (meneder znaczników),
a nie parametry komponentów wybranego przez Ciebie obiektu.
Meneder znaczników wywietla zarówno znaczniki, jak i warstwy. Aby doda nowy znacznik,
musisz klikn szar strzak znajdujc si po lewej stronie nazwy Tags. Spowoduje to wywie-
tlenie pól Size (rozmiar) i Element (element). W tym momencie bdziesz móg wprowadzi
nazw znacznika w obszarze znajdujcym si po prawej stronie pozycji Element 0.
Podaj nazw Sunlight (wiato soneczne) (znaczniki mog przyjmowa dowolne nazwy), a nastp-
nie nacinij klawisz Enter lub Return w celu potwierdzenia. Zauwa, e po naciniciu klawisza
warto pola Size wzrosa o jeden. Oprócz tego pojawio si nowe pole o nazwie Element 1. Nie
musisz go wypenia , poniewa jest ono po prostu przeznaczone dla kolejnego znacznika.
Atrybut Size jest zwykym licznikiem zdefiniowanych znaczników. rodowisko Unity wykorzy-
stuje parametry Size i Element w wielu rónych sytuacjach. Bdziesz to móg zauway w trakcie
uywania panelu Inspector.
105
Projektowanie gier w rodowisku Unity 3.x
Wanie umiecie nowy znacznik na licie. Jednake nie zosta on jeszcze przypisany do
obiektu Directional light. W tym celu ponownie wybierz ten obiekt w panelu Hierarchy
i kliknij nazw Untagged, znajdujc si obok pola Tag w panelu Inspector. Bdziesz móg
zobaczy , e dodany przez Ciebie znacznik o nazwie Sunlight znajduje si na dole wywietlanej
listy. Aby go uy , po prostu wybierz go z menu, jak przedstawiono na poniszym rysunku.
Warstwy
Warstwy s dodatkowym sposobem podzielenia obiektów na kategorie w celu zastosowania
w odniesieniu do nich okrelonych regu. S one najczciej uywane, by przydziela odpo-
wiednim grupom obiektów reguy renderowania dotyczce wiata i kamer. Jednake mog by
take wykorzystane w metodzie rzucania promieni (ang. Raycasting), co umoliwia selektywne
ignorowanie okrelonych obiektów. T metod zajmiemy si w nastpnym rozdziale przy okazji
omawiania interakcji. Inne znane zastosowanie warstw w obszarze fizycznym polega na umiesz-
czaniu na tej samej warstwie takich obiektów, które powinny oddziaywa na siebie, czyli
w praktyce na tworzeniu warstw kolizji obiektów mogcych si ze sob zderza .
106
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Poniej pól Tag i Layer moesz zauway trzy dodatkowe przyciski, pozwalajce na dostp do
prefabrykatu, z którego pochodzi dany obiekt:
Anatomia postaci
Aby móc przeglda postacie dostpne w pakiecie Character Controllers (kontrolery postaci),
który zaimportowalimy do naszego projektu, przyjrzyjmy si, w jaki sposób — z punktu widze-
nia rodowiska Unity — funkcjonuj prefabrykaty wykorzystujce perspektyw pierwszej
i trzeciej osoby.
Dekonstrukcja obiektu
First Person Controller
Zanim zapoznamy si z komponentami tworzcymi First Person Controller (kontroler perspek-
tywy pierwszej osoby, w skrócie FPC), sprawdmy najpierw, z jakich obiektów si on skada.
Kliknij ikon szarej strzaki, znajdujc si po lewej stronie obiektu First Person Controller
w panelu Hierarchy (hierarchia), aby wywietli jego skadowe. Gdy mamy do czynienia z takim
zagniedeniem obiektów, mówimy, e wystpuje midzy nimi powizanie nadrzdny – pod-
rzdny. W naszym przypadku First Person Controller jest obiektem nadrzdnym (rodzicem),
za Graphics (grafika) i Main Camera (kamera gówna) s obiektami podrzdnymi (potomkami).
Obiekty podrzdne, wywietlane w panelu Hierarchy, ujawniaj swoj przynaleno do rodzi-
ców, tak jak zaprezentowano na kolejnym rysunku (patrz strona 111).
107
Projektowanie gier w rodowisku Unity 3.x
108
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
W panelu Hierarchy kliknij obiekt Graphics, znajdujcy si poniej obiektu nadrzdnego FPC,
a zobaczysz, jak dziaa relacja powizania. Mimo e kontroler perspektywy pierwszej osoby
znajduje si na wyspie w zupenie przypadkowych wspórzdnych wiata, to jednak obiekt
Graphics ma wartoci pooenia równe (0, 0, 0).
Z przedstawionej relacji wzgldnoci wynika równie regua polegajca na tym, e ruch obiektu
nadrzdnego bdzie naladowany przez obiekt podrzdny przy jednoczesnym dopasowaniu
lokalnego pooenia i obrotu do odpowiedniej pozycji i obrotu rodzica w wiecie gry.
109
Projektowanie gier w rodowisku Unity 3.x
Pamitajc o zwizku nadrzdny – podrzdny, moemy teraz powiedzie , e dowolny ruch lub
obrót obiektu FPC jest naladowany przez obiekty Graphics i Main Camera.
Przycinij przycisk Play (granie), kliknij w dowolnym miejscu okna Game (gra) i zacznij porusza
postaci, spogldajc jednoczenie na okno Scene. Moesz zauway , e w trakcie poruszania
postaci za pomoc klawiszy i jej obracania przy uyciu myszy obiekty podrzdne równie si
przemieszczaj. Jeli ukad okien w rodowisku Unity nie pozwala Ci na jednoczesne obserwo-
wanie widoków Game i Scene, uyj ustawienia 2 by 3 (2 na 3), wybierajc opcj menu gównego
Window/Layouts/2 by 3 (okno/ukad okien/2 na 3).
Bdziesz móg zauway pi elementów, tworzcych obiekt nadrzdny FPC: Transform, Character
Controller, Mouse Look (Script), Character Motor (Script) oraz FPSInput Controller (Script).
Transform
Kontroler perspektywy pierwszej osoby zawiera komponent Transform, który wywietla informacje
o pozycji, obrocie i skalowaniu wybranego obiektu i pozwala na modyfikowanie ich parametrów.
Character Controller
Ten skadnik dziaa jako zderzacz, czyli komponent umoliwiajcy naszemu obiektowi osigni-
cie fizycznej obecnoci, dziki czemu bdzie on w stanie oddziaywa na inne obiekty. Zosta
specjalnie zaprojektowany w celu przemieszczania postaci i sterowania ni w wiecie gry. Kom-
ponent zawiera nastpujce parametry:
Q Height (wysoko ). Jest to parametr, który definiuje, jak wysoka powinna by posta ,
czyli okrela zarazem wysoko zderzacza w ksztacie kapsuy.
Q Radius (promie). Grubo zderzacza w ksztacie kapsuy. Domylnie promie kapsuy
odpowiada promieniowi obiektu podrzdnego Graphics . Jednake powiniene
zwikszy t warto , jeli chcesz uczyni posta szersz, by ograniczy jej ruchy
lub aby wykrywa zderzenia przy uyciu obszerniejszego zderzacza.
110
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Q Slope Limit (ograniczenie nachylenia). Parametr ten jest brany pod uwag podczas
wspinania si postaci. Pozwala okreli , jak pochyy powinien by stok, by posta nie
moga si ju na niego wspi . Dziki uyciu tego parametru komponent Character
Controller nie pozwala graczowi na wspinanie si po pionowych cianach lub stromych
zboczach terenu, co rzeczywicie byoby nierealne w prawdziwym wiecie.
Q Step Offset (wysoko stopnia). Poniewa w grze moesz uy schodów, ten parametr
pozwoli Ci na okrelenie wysokoci, na jak posta moe podnie nog. Im wiksza
warto , tym wysze mog by stopnie schodów.
Q Skin Width (grubo skóry). Posta moe zderza si z innymi obiektami w scenie
z okrelon prdkoci. Ten parametr pozwala na wskazanie, jak gboko inne obiekty
mog oddziaywa na zderzacz postaci bez wyzwalania reakcji. Zosta on utworzony
w celu zminimalizowania takich konfliktów z obiektami, czego rezultatem moe by
fluktuacja pooenia postaci (drobne, lecz cige drgania obiektu) lub jej zablokowanie
w cianie. Taka sytuacja zdarza si, gdy dwa zderzacze nagle spotykaj si ze sob
i nie pozwalaj silnikowi gry na odpowiedni reakcj. Zamiast oczekiwanej obsugi
procesu zderzenia silnik wyczy oba zderzacze w celu przejcia kontroli lub wymusi
zupenie przypadkowe ich zachowanie. Zgodnie z zaleceniami Unity Technologies
parametr Skin Width powinien osiga warto do 10% wielkoci parametru Radius
postaci.
Q Min Move Distance (minimalna warto przemieszczenia). Jest to najmniejsza warto
przemieszczenia obiektu. Zwykle wynosi ona 0. Wprowadzenie wielkoci wikszej
od zera oznacza, e posta nie bdzie moga si porusza , chyba e zostanie przeniesiona
o odcinek duszy ni warto parametru. Parametr ten jest uywany przede wszystkim
do zredukowania fluktuacji pooenia postaci, lecz w wikszoci przypadków jego
warto jest równa 0.
Q Center (rodek postaci). Parametr typu Vector3 (skadajcy si z 3 wartoci: x, y i z).
Pozwala na zdefiniowanie pooenia zderzacza postaci w miejscu innym ni jej rodek.
Warto tego parametru wynosi zazwyczaj 0 i jest on czciej uywany przy postaciach
z perspektyw trzeciej osoby, które maj bardziej zoony wygld ni prosta kapsua.
Na przykad poprzez modyfikacj wspórzdnej Y moesz zdefiniowa , w którym
miejscu stopa postaci powinna dotyka powierzchni gruntu. Wpyw na to ma wanie
zderzacz Character Collider, a nie sam ksztat siatki trójwymiarowej tworzcej stop.
Zderzacz Character Collider (podobnie jak inne tego typu obiekty w rodowisku Unity) jest
reprezentowany w widoku Scene przez zielony obrys w ksztacie kapsuy.
111
Projektowanie gier w rodowisku Unity 3.x
Q Axes (osie). Domylna warto zmiennej jest równa MouseX. Dostpnymi opcjami s
wartoci MouseX, MouseY i MouseXAndY. Instancja skryptu Mouse Look, wykorzystywana
przez obiekt FPC (inna jego instancja jest komponentem obiektu podrzdnego Main
Camera), musi zawiera w parametrze Axes tylko o X, poniewa pozwala to na
poruszanie mysz w lewo i prawo, by uzyska obrót caej postaci, wcznie z obiektem
podrzdnym Main Camera.
Moesz si dziwi , dlaczego po prostu nie wybralimy wartoci obu osi (czyli
MouseXAndY) w komponencie Mouse Look obiektu Main Camera. Problem polega na tym,
e jeli pozwolilibymy kamerze na przesuwanie si w obu osiach, posta nie
patrzyaby w kierunku, w którym si przemieszcza. Kamera po prostu obracaaby
si w miejscu. W wyniku tego moglibymy si rozglda , lecz w czasie poruszania
postaci za pomoc klawiszy utracilibymy waciwy kierunek przemieszczania si
do przodu, przy zaoeniu, e odpowiada on kierunkowi spogldania samej kamery.
Uywajc instancji skryptu Mouse Look w obiekcie nadrzdnym (First Person
Controller), pozwalamy na obracanie postaci, co z kolei odpowiednio porusza kamer,
gdy jest ona obiektem podrzdnym, który dopasowuje si do obrotu rodzica.
Q Sensitivity X, Sensitivity Y (czuo w osi X, czuo w osi Y). Poniewa w skrypcie
wykorzystujemy tylko o X, zmienna ta bdzie okrela , jak bardzo ruch myszy w lewo
i prawo wpynie na obrót obiektu. Jeli zmiennej Axes zostaaby przypisana o Y,
za pomoc tego parametru mona by okrela wpyw ruchu myszy w gór i w dó
na obrót kamery w osi pionowej. Zwró uwag na to, e zmienna Sensitivity Y ma
warto 0, poniewa nie jest uywana, natomiast zmiennej Sensitivity X zostaa
przypisana warto 15 — im wysza warto , tym szybszy obrót.
Q Minimum X, Maximum X (minimalny kt osi X, maksymalny kt osi X). Ten parametr
pozwala na ograniczenie kta obrotu, poniewa zadaniem skryptu jest zarzdzanie
obracaniem postaci. Odpowiednie wartoci wynosz -360 i 360, co pozwala na
wykonanie penego obrotu obiektu wokó wasnej osi.
Q Minimum Y , Maximum Y (minimalny kt osi Y, maksymalny kt osi Y). Poniewa
nie wykorzystujemy osi Y, warto zmiennej wynosi 0. Mógby jednak wykorzysta
ten parametr, jeli chciaby ograniczy kt spogldania postaci w gór i w dó, podobnie
jak w przypadku instancji skryptu uywanej w obiekcie podrzdnym Main Camera.
Jest on bardzo zoony, lecz zawiera komentarze umieszczone w kodzie przez projektantów
z firmy Unity. Zalecamy, aby po przeczytaniu niniejszej ksiki powróci do tego skryptu
i przeanalizowa go. Bdziesz zdziwiony, jak wiele zagadnie zaczniesz rozumie !
112
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
113
Projektowanie gier w rodowisku Unity 3.x
Tak te mona wyjani istnienie w skrypcie zmiennych wykorzystujcych klas Input, której
uylimy w rozdziale 2., zatytuowanym „Podstawy tworzenia prototypów i skryptów”, w naszym
przykadzie zwizanym z tworzeniem prototypu. Moesz tam zauway midzy innymi nast-
pujcy fragment kodu:
var directionVector = new Vector3(Input.GetAxis("Horizontal"), 0,
´Input.GetAxis("Vertical"));
Skrypt FPSInput Controller równie zawiera komentarze stworzone przez jego projektantów,
dlatego moesz go przeanalizowa , aby dowiedzie si, jak dziaa. eby go dobrze zrozumie ,
powiniene jednak najpierw przeczyta t ksik i zdoby wicej dowiadczenia.
Wybierz obiekt podrzdny Graphics w panelu Hierarchy, a nastpnie przyjrzyj si panelowi
Inspector, który wywietli odpowiednie komponenty.
Przyjmijmy bez udowadniania, e obiekt zawiera komponent Transform, którego pooenie jest
równe (0, 0, 0). Znajduje si on w centralnym punkcie obiektu nadrzdnego, czyli First
Person Controller. Poniewa jedynym zadaniem obiektu Graphics jest wizualne reprezento-
wanie gracza, zawiera on po prostu dwa kluczowe komponenty, czynice gracza widocznym. S
to Mesh Filter i Mesh Renderer. Co robi te komponenty?
114
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Mesh Filter
Mesh Filter jest komponentem zawierajcym siatk, czyli trójwymiarowy ksztat. Jest wykorzy-
stywany przez renderer grafiki w celu wywietlenia powierzchni zdefiniowanej przez siatk.
W naszym przypadku powierzchnia nazywa si polySurface2. Nazwa komponentu Mesh Filter
dla dowolnego ksztatu 3D jest zazwyczaj taka sama jak nazwa zasobu siatki, któr on reprezen-
tuje. Dlatego te podczas wykorzystywania modeli utworzonych poza rodowiskiem Unity bdziesz
móg zauway , e kady komponent Mesh Filter ma nazw pochodzc z tego fragmentu
modelu, w którym si znajduje.
Mesh Renderer
Gównym zadaniem komponentu Mesh Renderer jest narysowanie i wywietlenie powierzchni
na siatce trójwymiarowego obiektu. Oprócz tego zarzdza on take:
Q Cast Shadows (rzucanie cieni). Owietlony obiekt bdzie rzuca cie na inne
powierzchnie (opcja dostpna jedynie w wersji Unity Pro).
Q Receive Shadows (przyjmowanie cieni). Cienie rzucane przez inne obiekty bd
wywietlane na danym obiekcie (opcja dostpna jedynie w wersji Unity Pro).
W przypadku kapsuy Graphics adna z powyszych opcji nie zostaa zaznaczona.
Po pierwsze dlatego, e kapsua i tak nie bdzie nigdy widoczna. Nie musimy wic
wywietla cieni na postaci. Po drugie gracz nie wie, e jego posta w grze jest kapsu,
dlatego cie w tym ksztacie wygldaby do dziwnie.
Q Materials (materiay). Ten parametr wykorzystuje system Size/Element, uywany
ju w omawianym wczeniej menederze znaczników. Dziki temu mona wybra
co najmniej jeden materia, a nastpnie od razu zmodyfikowa jego ustawienia bez
potrzeby wyszukiwania, a nastpnie wprowadzania zmian w panelu Project.
Poniewa obiekt Graphics udostpnia wycznie funkcje i nie potrzebuje adnego koloru ani
tekstury, nie ma w jego przypadku podgldu adnego materiau. Zosta mu wic przydzielony
wygld Default Diffuse, który wykorzystuje prosty materia uywany przez nowo tworzone
obiekty o ksztatach podstawowych.
115
Projektowanie gier w rodowisku Unity 3.x
Zazwyczaj obiekty kamery zawieraj oprócz standardowego komponentu Transform jeszcze trzy
inne elementy: Camera, GUILayer i FlareLayer. Wykorzystuj take komponent Audio Listener
w celu odbierania dwików, lecz jest on zwykle uywany jedynie w gównej kamerze, ponie-
wa rodowisko Unity wymaga, aby w scenie by aktywny tylko jeden odbiornik audio.
Kamera wykorzystuje instancj skryptu Mouse Look, któr omawialimy wczeniej. Pozwala
ona na obrót kamer w osi pionowej, sterowany za pomoc myszy. Aby lepiej zrozumie dziaa-
nie kamery, przyjrzyjmy si, w jaki sposób dziaaj jej podstawowe komponenty.
Camera
Komponent Camera, któremu zwykle towarzysz skadniki GUILayer i FlareLayer, jest najwa-
niejszym elementem, odpowiedzialnym za tworzenie widoku. Aby zrozumie , jak komponent
Camera generuje widok, przeanalizujemy jego parametry, które zostay zaprezentowane na
poniszym rysunku.
116
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
117
Projektowanie gier w rodowisku Unity 3.x
Audio Listener
Komponent Audio Listener dziaa jak nasze uszy i pozwala sysze dwiki generowane przez
róda audio umieszczone w grze. Umieszczenie go w kamerze gównej w grze wykorzystujcej
perspektyw pierwszej osoby sprawia, e dwiki trójwymiarowe pojawiajce si przykadowo
po lewej stronie gracza bd syszane w jego lewym uchu, co pozwoli na stworzenie otoczenia
cile naladujcego wiat rzeczywisty.
Poniewa poznae ju skadniki obiektu First Person Controller, moemy si dokadniej
przyjrze skryptom, zanim bdziesz móg je wykorzysta w nastpnym rozdziale, zatytuowanym
„Interakcje”. Pozwoli on na poszerzenie i utrwalenie wiedzy, któr zdobye podczas wcze-
niejszym wicze z tworzeniem prototypu.
118
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
W tej ksice zostan zaprezentowane podstawy tworzenia skryptów w jzyku C# oraz Java-
Script. Oprócz tego bardzo zalecamy przeczytanie dodatkowej dokumentacji Scripting Reference.
Jest ona dostpna jako element instalacji pakietu Unity i znajduje si w podkatalogu documenta-
tion, a take w internecie pod adresem: http://unity3d.com/support/documentation/ScriptReference/.
Inn metod uzyskiwania wsparcia jest dedykowany kana Internet Relay Chat (IRC). Aby
dowiedzie si o nim wicej, odwied nastpujc stron: http://unity3d.com/support/community.
Nowo tworzony lub modyfikowany skrypt staje si aktywny dopiero wówczas, gdy zostaje
doczony do obiektu gry w biecej scenie. Jednake takie skrypty mog wywoywa statyczne
(globalne) funkcje zawarte w innych skryptach, niedoczonych do adnych obiektów. Skrypt
doczony do obiektu gry staje si jego komponentem. W tym obiekcie zostaje take zastosowany
okrelony sposób dziaania, który definiuje skrypt. Mimo tego skrypty nie ograniczaj si
jedynie do narzucania sposobu dziaania obiektowi gry, do którego nale, poniewa mog by
w nich uywane i inne obiekty, jeli pojawi si odwoanie do ich nazw lub znaczników.
Aby lepiej zrozumie dziaanie skryptów, które zamierzamy przetestowa , zapoznajmy si z kil-
koma gównymi zasadami ich tworzenia.
Polecenia
Polecenia s instrukcjami zapisanymi w skrypcie. Mimo e mog si one znajdowa w dowol-
nym jego miejscu, powiniene je umieszcza w jakiej funkcji, aby uzyskiwa wiksz kon-
trol nad sposobem ich wykonywania. Wszystkie polecenia w obu jzykach musz by zako-
czone znakiem rednika:
speed = 5;
119
Projektowanie gier w rodowisku Unity 3.x
Dziki temu interpreter wie, e powinien oczekiwa nastpnego polecenia lub fragmentu innego
skryptu.
Zmienne
Zmienne s po prostu kontenerami na informacje. Mog przyjmowa dowolne nazwy przy
zaoeniu, e:
Zmienne mog zawiera acuchy tekstowe, liczby i odwoania do obiektów, zasobów lub
komponentów. Oto przykad deklaracji zmiennej:
Jzyk C#:
float speed = 9.0f;
Jzyk JavaScript:
var speed = 9.0;
Zmiennej speed przyporzdkowano okrelon warto przy uyciu pojedynczego znaku rów-
noci. Caa instrukcja zostaa zakoczona znakiem rednika.
Poprzez okrelenie typu danych w deklarowanej zmiennej moemy sprawi , e skrypt bdzie
sprawniej dziaa , poniewa silnik gry nie bdzie musia okrela typu na podstawie odczyty-
120
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
wanej wartoci. Poniej przedstawiono kilka powszechnie uywanych typów danych, z jakimi
bdziesz mia do czynienia po rozpoczciu tworzenia skryptów w rodowisku Unity (zazna-
czono rónice w wielkoci liter w kadym z jzyków):
Uycie zmiennych
Informacja zawarta w zmiennych po ich zadeklarowaniu moe zosta odczytana lub zmodyfi-
kowana. Wystarczy uy nazwy zmiennej. Na przykad, jeli chcielibymy zdefiniowa warto
zmiennej speed, uylibymy poniszego zapisu:
speed = 20;
W naszym skrypcie moemy take odczyta lub uy wartoci zmiennej. Na przykad, jeli
chcielibymy zapamita warto , która jest równa poowie obecnej wartoci zmiennej speed,
moglibymy utworzy now zmienn, jak zaprezentowano w poniszym przykadzie (jzyk C#):
float speed = 9.0f;
float halfSpeed;
halfSpeed = speed/2.0f;
121
Projektowanie gier w rodowisku Unity 3.x
z danymi wprowadzonymi w panelu Inspector, a nie zostan zapisane w skrypcie. Jeli wic
warto zmiennej powinna by widoczna jedynie w skrypcie, idealnym rozwizaniem jest zdefi-
niowanie jej z dostpem prywatnym.
Jzyk C#:
Zmienna w jzyku C# jest prywatna bez wzgldu na to, czy zostaa zadeklarowana wewntrz,
czy te na zewntrz funkcji. Aby mona j byo zobaczy i zmodyfikowa z poziomu panelu
Inspector, powinna zosta poprzedzona prefiksem public.
public float gravity = 20.5f; // ta zmienna jest publiczna
private float gravity = 20.5f; // ta zmienna jest prywatna
float gravity = 20.5f; // ta zmienna jest równie prywatna w jzyku C#
Jzyk JavaScript:
Jzyk JavaScript dziaa troch inaczej. Gdy zmienna jest deklarowana wewntrz funkcji, staje
si prywatna i jest dostpna tylko wewntrz niej. Jeli jednak zmienna zostanie zadeklarowana
poza funkcj, jest od razu publiczna i wymagany jest prefiks private, aby ukry j w panelu
Inspector.
public var gravity : float = 20.0; // ta zmienna jest publiczna
var gravity : float = 20.0; // ta zmienna jest równie publiczna w jzyku JavaScript
private var gravity : float = 20.0; // ta zmienna jest prywatna
122
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Kompletny przykad
Na poniszym rysunku przedstawiono skrypt napisany w jzyku C# i zastosowany w obiekcie.
W klasie Rocket zadeklarowano zmienn publiczn moveSpeed oraz zmienn prywatn blastSpeed.
Zmiennej prywatnej nie przypisano wartoci podczas jej deklarowania, lecz zrobiono to
w funkcji Update(). Uzyskuje tam ona warto równ zmiennej moveSpeed pomnoonej przez 2.
Warto tej zmiennej prywatnej jest nastpnie uywana jako wspórzdna Z w zmiennej typu
Vector3, która z kolei jest wykorzystywana w celu ustalenia prdkoci obiektu typu Rigidbody.
Uwaga
Pamitaj, e kady parametr zmodyfikowany w panelu Inspector przykryje oryginaln warto przypisan
zmiennej w skrypcie. Nie zostanie zmodyfikowany kod skryptu, lecz zmienna zostanie po prostu podmie-
niona po uruchomieniu gry. Warto zadeklarowana w skrypcie moe zosta przywrócona poprzez kliknicie
ikony kóka zbatego, znajdujcej si po prawej stronie komponentu, i wybranie opcji Reset (przywró
warto pocztkow) z menu podrcznego.
Funkcje
Funkcje lub inaczej metody mog by zdefiniowane jako zestaw instrukcji, który jest wywoywany
w okrelonym momencie w trakcie dziaania gry. Skrypt moe zawiera wiele funkcji, a kada
z nich moe wywoywa dowoln funkcj, znajdujc si w nim lub w innych skryptach
123
Projektowanie gier w rodowisku Unity 3.x
zewntrznych. Skrypty rodowiska Unity pozwalaj na wywoywanie wielu gotowych ju funkcji,
które mog by uruchamiane w okrelonych momentach lub reagowa na dziaania uytkow-
nika. Moesz take tworzy wasne funkcje, a nastpnie wywoywa je, by uruchamia okrelone
zestawy polece.
Przyjrzyjmy si teraz kilku przykadom istniejcych funkcji, które moesz w przyszoci wyko-
rzystywa .
Update()
Jak mona byo zauway we wczeniejszych przykadach, nowo utworzony plik jzyków C#
lub JavaScript w rodowisku Unity rozpoczyna si od funkcji Update():
Jzyk C#:
void Update(){
}
Jzyk JavaScript:
function Update(){
}
Gry dziaaj z okrelon prdkoci klatek na sekund (ang. Frames Per Second, w skrócie FPS).
Funkcja Update() jest wywoywana podczas renderowania kadej klatki. W wyniku tego jest
ona uywana przede wszystkim w poleceniach, które musz wykonywa si przez cay czas lub
wykrywa zmiany zachodzce w czasie rzeczywistym w wiecie gry. Takie zmiany to na przykad
naciskanie klawiszy lub klikanie mysz. Jak zaprezentowano w skrypcie CharacterMotor, pod-
czas obsugi polece zwizanych ze zdarzeniami fizycznymi powinna by uywana alternatywna
funkcja FixedUpdate(). Jest ona zsynchronizowana z silnikiem fizycznym, natomiast sama funkcja
Update() moe by wywoywana z czstotliwoci zalen od szybkoci klatek.
OnMouseDown()
OnMouseDown() jest przykadem funkcji wywoywanej w okrelonym momencie. Jest ona urucha-
miana jedynie wówczas, gdy gracz klika mysz zderzacz obiektu gry lub element graficznego
interfejsu uytkownika.
Funkcja ta jest najczciej uywana w grach sterowanych mysz lub podczas wykrywania
klikni w menu programu. Oto prosty przykad uycia funkcji OnMouseDown() (w jzyku Java-
Script) — zakoczy on gr po klikniciu obiektu, do którego podczono poniszy kod:
124
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
function OnMouseDown(){
Application.Quit();
}
Istnieje równie wiele podobnych funkcji zwizanych z obsug myszy, takich jak OnMouseUp(),
OnMouseEnter() itd. Poszukaj nazwy Mouse w dokumentacji tworzenia skryptów, aby si z nimi
zapozna .
Warto zwracana
Funkcje, które maj okrelone zadanie, mog nie tylko wykonywa polecenia, ale take zwraca
pewn informacj. Na przykad, jeli chcielibymy stworzy funkcj, która wykonywaaby jakie
dziaania arytmetyczne i zwracaaby ich wynik, wówczas moglibymy napisa co podobnego
do poniszego fragmentu kodu:
Jzyk C#:
float currentAmount;
float DoSums(){
float amount = 5.0f + 55.8f;
return amount;
}
void Update () {
if(Input.GetButtonUp("Jump")){
currentAmount = DoSums();
}
}
Jzyk JavaScript:
private var currentAmount : float;
Stworzylimy wasn funkcj DoSums(), która zwraca warto o okrelonym typie. Jest to typ
takiego samego rodzaju, jak w przypadku deklaracji zmiennej. W naszym przykadzie jest
125
Projektowanie gier w rodowisku Unity 3.x
zwracana warto o typie float. Aby funkcja moga j zwraca , zdefiniowalimy jej typ oraz
uylimy polecenia return. Oznacza ono, e jeli funkcja jest wykorzystywana w innym obsza-
rze skryptu, jej warto wynikowa zostaje zwrócona w podobny sposób, jak gdybymy uywali
zmiennej. W tym przypadku jednak mamy wiksze moliwoci, poniewa warto zwracana
moe si zmienia i zalee od przebiegu kodu wewntrz funkcji.
Wskazówka
Aby stworzy wasn funkcj w jzyku C#, jej deklaracj powiniene rozpocz od nazwy zwracanego
typu, a nie sowa void. W jzyku JavaScript typ danych jest umieszczany po nazwie funkcji — w taki
sam sposób, jak w przypadku deklaracji zmiennej.
Argumenty
Argumenty s zmiennymi wewntrz funkcji, które pozwalaj na przesyanie do niej rónych
informacji w celu zmodyfikowania jej zachowania. Oznacza to, e nie musisz tworzy kolejnych
funkcji zawierajcych odmienne polecenia.
Jzyk C#:
void FunctionName(DataType argument1, DataType argument2){
// tu wystpuj polecenia, które mog wykorzystywa argumenty funkcji
}
Jzyk JavaScript:
function FunctionName(argument1 : DataType, argument2 : DataType){
// tu wystpuj polecenia, które mog wykorzystywa argumenty funkcji
}
126
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Jzyk C#:
void SpawnEnemy(GameObject enemy, Transform spawnTrans, string enemyName){
GameObject newEnemy = Instantiate(enemy, spawnTrans.position,
´spawnTrans.rotation) as GameObject;
newEnemy.name = enemyName;
}
Jzyk JavaScript:
function SpawnEnemy(enemy : GameObject, spawnTrans : Transform, enemyName :
String){
var newEnemy : GameObject = Instantiate(enemy, spawnTrans.position,
´spawnTrans.rotation);
newEnemy.name = enemyName;
}
Jzyk C#:
public GameObject enemyPrefab1;
public Transform spawn1;
public Transform spawn2;
int enemyCount = 0;
void Update(){
if(enemyCount < 1){
SpawnEnemy(enemyPrefab1, spawn1, "Ogre");
enemyCount++;
}
}
Jzyk JavaScript:
var enemyPrefab1 : GameObject;
var spawn1 : Transform;
var spawn2 : Transform;
var enemyCount : int = 0;
function Update(){
if(enemyCount < 1){
SpawnEnemy(enemyPrefab1, spawn1, "Ogre");
127
Projektowanie gier w rodowisku Unity 3.x
enemyCount++;
}
}
Oznacza to po prostu, e przekazalimy dane do funkcji, które nie odpowiadaj temu, czego
ona oczekuje w swojej deklaracji (zapisanej poniej w pseudokodzie):
SpawnEnemy(enemy – obiekt gry, spawnTrans – obiekt transformacji,
´enemyName – cig znaków zawierajcy informacj);
Jako podsumowanie powyszych rozwaa poniej prezentujemy kod penego skryptu zapisany
w obu jzykach.
Jzyk C#:
using UnityEngine;
using System.Collections;
128
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
int enemyCount = 0;
void Update(){
if(enemyCount < 1){
SpawnEnemy(enemyPrefab1, spawn1, "Ogre");
enemyCount++;
}
}
Jzyk JavaScript:
var enemyPrefab1 : GameObject;
var spawn1 : Transform;
var spawn2 : Transform;
private var enemyCount : int = 0;
function Update(){
if(enemyCount < 1){
SpawnEnemy(enemyPrefab1, spawn1, "Ogre");
enemyCount++;
}
}
Polecenie if else
Polecenie if jest uywane w skryptach w celu sprawdzenia warunków. Jeli warunki s spe-
nione, wówczas polecenie if wykonuje zestaw zagniedonych w nim instrukcji. Jeli nie, wyko-
nywane s polecenia w grupie zwanej else. W poniszych przykadach polecenie if sprawdza, czy
zmienna grounded typu boolean jest równa true.
Jzyk C#:
bool grounded = false;
float speed;
129
Projektowanie gier w rodowisku Unity 3.x
void Update(){
if(grounded==true){
speed = 5.0f;
}
}
Jzyk JavaScript:
var grounded : boolean = false;
var speed : float;
function Update(){
if(grounded==true){
speed = 5.0;
}
}
Jeli warunek zdefiniowany w nawiasach polecenia if jest speniony, to znaczy warto zmien-
nej grounded jest równa true (co moe by rezultatem wykonania innej funkcji w tym skrypcie),
wówczas zmiennej speed zostaje przypisana warto 5. W przeciwnym razie nie uzyska ona
adnej wartoci.
Poniewa sprawdzamy, czy zmienna typu boolean jest równa true, moglibymy zapisa to
w prostszy sposób:
if(grounded){}
Powyszy zapis jest identyczny z wczeniejszym if(grounded == true). Aby sprawdzi , czy
zmienna grounded zawiera warto false, wystarczy napisa :
if(!grounded){}
Poniewa uycie znaku wykrzyknika oznacza zaprzeczenie, moemy teraz sprawdzi warunek,
gdy zmienna grounded nie jest równa true.
Uwaga
Pamitaj, e podczas przypisywania wartoci do zmiennej jest uywany pojedynczy znak równoci '=',
natomiast podczas sprawdzania jej stanu wykorzystujemy dwa znaki równoci '=='. S one inaczej nazy-
wane porównawczymi znakami równoci — porównujemy informacje znajdujce si po obu ich stronach.
Jeli chciaby wprowadzi zapis oznaczajcy „NIE jest równy”, wówczas powiniene zastpi pierwszy
znak równoci znakiem wykrzyknika, jak przedstawiono poniej:
if(grounded != true){}
Jeli chcielibymy zdefiniowa warunek awaryjny, moglibymy uy polecenia else, znajduj-
cego si po instrukcji if. Oznacza ono, e jeli warunki okrelone w poleceniu if nie zostan
spenione, powinno si wykona co innego.
130
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Jzyki C# i JavaScript:
if(grounded==true){
speed = 5.0f;
}else{
speed = 0.0f;
}
Jeli zmienna grounded bdzie równa true, zmiennej speed zostanie przypisana warto 0.
Pamitaj, e dwa ukoniki // oznaczaj, i kod znajdujcy si za nimi nie jest wykonywany. S
one wic pocztkiem komentarza (kodu niewykonywalnego).
Warunki wielokrotne
W pojedynczym poleceniu if moemy równie sprawdza wicej ni jeden warunek, uywajc
do ich poczenia dwóch znaków &&.
Na przykad moglibymy sprawdzi warunki od razu dla dwóch zmiennych i wykonywa instruk-
cje jedynie wówczas, gdyby miay one okrelone wartoci. W tym celu uylibymy poniszego
fragmentu kodu:
if(speed >= 3 && grounded == true){
// wykonaj jakie polecenia
}
Jeli chcemy sprawdzi , czy który z warunków jest speniony, powinnimy uy dwóch piono-
wych znaków || oznaczajcych sowo LUB. Nasz kod zapisalibymy w poniszy sposób:
if(speed >= 3 || grounded == true){
// wykonaj jakie polecenia
}
131
Projektowanie gier w rodowisku Unity 3.x
Oznacza to, e polecenia w instrukcji if zostan wykonane, jeli przynajmniej jeden z warunków
bdzie speniony.
Ptle for
Podczas pisania skryptów bdziesz czsto musia wielokrotnie wykonywa ten sam zestaw
instrukcji, a do momentu, gdy zostan spenione pewne warunki. W tych przypadkach najlep-
szym rozwizaniem jest uycie ptli for.
Jzyk C#:
public int counter = 0;
void Start() {
for(int i=0; i<=10; i++){
counter++;
Debug.Log(counter);
}
}
Jzyk JavaScript:
var enemyCount : int = 0;
function Start() {
for(i=0; i<=10; i++){
enemyCount++;
Debug.Log(enemyCount);
}
}
Ptla for rozpoczyna si od zmiennej cakowitej o prostej nazwie i, która przyjmuje warto 0.
Nastpnie ptla wykonuje swoje dziaanie, dopóki zmienna i jest mniejsza od 10 lub równa 10.
Przy kadej iteracji warto i jest zwikszana o jeden. Wykorzystywany do tego celu zapis ++ jest
równoznaczny ze skadni +=1.
Poniewa zmienna i ma pocztkow warto 0, która jest zwikszana o 1 do 10, ptla wykonuje
si jedenacie razy. Wynika std, e dowolne polecenie wewntrz ptli bdzie si wykonywa
równie tyle samo razy.
132
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Ptle for s przydatne do rónych celów, takich jak dynamiczne tworzenie prefabrykatów na
pocztku gry. Na przykad konkretyzowanie i modyfikowanie w kadej iteracji ptli zmiennej
odpowiedzialnej za pooenie obiektu pozwala utworzy cay ich zestaw.
Komunikacja midzyskryptowa
oraz skadnia z kropk
Aby sprawnie tworzy gry, czsto bdziesz musia stosowa komunikacj midzyskryptow, by
umieszcza dane, modyfikowa zmienne oraz wywoywa funkcje w skryptach zewntrznych.
Pod pojciem skryptu zewntrznego rozumiemy tu oddzielny skrypt lub taki, który zosta przy-
czony do innego obiektu ni obsugiwany przez biecy skrypt.
Zanim uzyskamy dostp do skryptu, musimy odwoa si do jego obiektu, do czego su róne
metody. W tym celu wykorzystuje si polecenia Find() oraz FindWithTag() lub — w przypadku
zderzenia — odwoanie do obiektu, z którym wystpia interakcja. Ogólnie mówic, stosuje si
zmienne publiczne, aby ustali odwoanie do obiektu.
Find() i FindWithTag()
Bardziej kosztownym pod wzgldem obliczeniowym sposobem, pozwalajcym na odwoanie
si do obiektu, jest uycie polece wyszukujcych. Nie jest to wic co, czego powiniene czsto
uywa . Unikaj wywoywania takich polece szczególnie w funkcji Update() lub innych, które
s uruchamiane w kadej klatce. Czsto najlepsz metod jest przypisanie okrelonej zmiennej
wskazania na obiekt za pomoc funkcji Start() lub Awake().
133
Projektowanie gier w rodowisku Unity 3.x
Polecenie Find() oczekuje argumentu, którym jest nazwa obiektu gry podana w postaci acu-
cha tekstowego w cudzysowach. Polecenie FindWithTag() wymaga równie argumentu teksto-
wego w formie znacznika przypisanego do obiektu, którego szukamy:
GameObject.FindWithTag("nazwaZnacznika");
Oto krótki przykad uycia funkcji Find() w celu odwoania si do obiektu hierarchicznego
o nazwie ship_model:
Jzyk C#:
GameObject enemyShip;
void Start(){
enemyShip = GameObject.Find("ship_model");
}
Jzyk JavaScript:
private var enemyShip : GameObject;
function Start(){
enemyShip = GameObject.Find("ship_model");
}
Dziki uyciu funkcji Find() z hierarchiczn nazw poszukiwanego elementu zmiennej enemyShip
zostaje przypisany obiekt gry ship_model.
SendMessage()
Podstawowym sposobem wykonywania polece dotyczcych innego obiektu jest stworzenie
w skrypcie wasnej funkcji, a nastpnie uycie instrukcji SendMessage().
Jzyk C#:
void Renamer(string newName){
gameObject.name = newName;
}
134
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Jzyk JavaScript:
function Renamer(newName : String){
gameObject.name = newName;
}
Jednake jeli funkcja zawiera si w innym skrypcie, wówczas musimy uy polecenia
SendMessage(), aby j wywoa . W tym celu powinnimy si odwoa do odpowiedniego obiektu,
a nastpnie wykona polecenie SendMessage(), jak zaprezentowano w poniszym przykadzie:
Jzyki C# i JavaScript:
GameObject.Find("target").SendMessage("Renamer", "target_down");
Uwaga
Zwró uwag na to, e w powyszym fragmencie kodu nie musielimy w ogóle uywa nazwy skryptu,
poniewa samo rodowisko Unity przeprowadza operacj wyszukiwania danego obiektu. W naszym
przykadzie szukamy obiektu o nazwie target, znajdujcego si w biecej scenie, a nastpnie wykorzy-
stujemy jego funkcj SendMessage, która wyszukuje okrelon funkcj Renamer w kadym ze skryptów
nalecych do istniejcych obiektów. Po znalezieniu funkcji nastpuje jej wywoanie, podczas którego do
argumentu newName zostaje przesana warto "target_down".
GetComponent
Funkcja GetComponent() dziaa troch inaczej ni zaprezentowane wyej polecenie, lecz jest
jednoczenie bardziej uniwersalna, poniewa moe by uywana do wszystkich rodzajów kom-
ponentów. Za chwil zademonstrujemy, w jaki sposób mona jej uy , aby wykona takie samo
dziaanie, jakie przed chwil przeanalizowalimy przy okazji omawiania funkcji SendMessage().
Najpierw wyobramy sobie, e funkcja Renamer() zawiera si w skrypcie zwanym Setter. Jest
on przypisany do obiektu target, który znajduje si w biecej scenie. Naszym celem jest
odwoanie si do tego obiektu, a nastpnie uycie funkcji GetComponent(), by uzyska dostp
do okrelonego skryptu i do funkcji Renamer().
Jzyk C#:
GameObject.Find("target").GetComponent<Setter>().Renamer("target_down");
Jzyk JavaScript:
GameObject.Find("target").GetComponent(Setter).Renamer("target_down");
135
Projektowanie gier w rodowisku Unity 3.x
Zwró uwag na to, e bez wzgldu na rodzaj uytego jzyka programowania wykorzystujemy
w powyszym przykadzie notacj z kropk oddzielajc kad czynno polecenia:
ZnajdObiekt.PobierzKomponent.WykonajDziaanie
Jzyk C#:
GameObject theTarget = GameObject.Find("target");
theTarget.GetComponent<Setter>().Renamer("target_down");
Jzyk JavaScript:
var theTarget : GameObject = GameObject.Find("target");
theTarget.GetComponent(Setter).Renamer("target_down");
Skadnia z kropk
W poprzednim przykadzie wykorzystalimy technik skryptow zwan skadni z kropk.
Jest to termin, który moe wydawa si bardziej skomplikowany, ni to jest w rzeczywistoci,
poniewa oznacza on po prostu wykorzystanie znaku kropki w celu oddzielenia od siebie ele-
mentów zapisanych w porzdku hierarchicznym.
Rozpoczynajc od najbardziej ogólnego skadnika lub referencji, moemy uy skadni z kropk
do wskazania okrelonego parametru, którego poszukujemy.
Na przykad, aby zdefiniowa pooenie pionowe obiektu gry, musielibymy zmodyfikowa jego
wspórzdn Y. Std wynika, e powinnimy odwoa si do parametrów komponentu Transform,
nalecego do danego obiektu, zwizanych z pooeniem. Do zmiany waciwoci Position
obiektu, który zawiera nasz skrypt, moglibymy uy poniszego fragmentu kodu:
Jzyk C#:
transform.position = new Vector3(0f, 5.5f, 4f);
Jzyk JavaScript:
transform.position = Vector3(0, 5.5, 4);
Jednake w przypadku, gdy powyszy komponent znajduje si gdzie indziej, musimy najpierw
uzyska referencj do samego obiektu, w którym si on zawiera. Dysponujemy w tym przy-
136
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Jzyk C#:
public GameObject theTarget;
theTarget.transform.position = new Vector3(0f, 5.5f, 4f);
Jzyk JavaScript:
var theTarget : GameObject;
theTarget.transform.position = Vector3(0, 5.5, 4);
Jzyk C#:
public Transform theTarget;
theTarget.position = new Vector3(0f, 5.5f, 4f);
Jzyk JavaScript:
var theTarget : Transform;
theTarget.position = Vector3(0, 5.5, 4);
Oznacza to, e skrypt staby si bardziej wydajny w sensie programistycznym, poniewa nie
musiaby przechowywa tak duej iloci danych, by odwoywa si do caej klasy GameObject.
Wynika std, e mona uzyska dostp do dowolnego parametru poprzez zwyke wyszukanie przy
uyciu skadni z kropk odpowiedniego komponentu, do którego ten parametr naley. Aby to
zilustrowa , zaprezentujmy przykad modyfikacji jasnoci wiata. W celu ustalenia tej wartoci
moglibymy uy nastpujcego zapisu:
light.intensity = 8;
Jak wspomniano wczeniej, jeli chcielibymy zmodyfikowa jasno wiata innego obiektu,
zastosowalibymy zwyk skadni z kropk w celu odwoania si do niego, a nastpnie uyli-
bymy rozwizania zaprezentowanego powyej:
GameObject.Find("streetlight").light.intensity = 8;
137
Projektowanie gier w rodowisku Unity 3.x
Komentarze
Bdziesz móg zauway , e w wielu gotowych skryptach istniej pewne wiersze, które roz-
poczynaj si od dwóch znaków ukonika. S one po prostu komentarzami, stworzonymi przez
autora skryptu. Uywanie komentarzy jest zalecane, szczególnie wówczas, gdy rozpoczynasz
tworzenie skryptów i chcesz zapamita wykonane czynnoci, co pozwoli Ci na przypomnienie
sobie w przyszoci zasady dziaania programu. Istniej dwa rodzaje komentarzy — jednowier-
szowe i wielowierszowe:
// To jest komentarz zapisany w jednym wierszu
/* To jest komentarz wielowierszowy. Bdzie on kontynuowany a do momentu, gdy zostanie
zakoczony znakiem gwiazdki i ukonika, czyli inaczej mówic, odwrotnym zapisem do tego,
w jaki si rozpoczyna */
138
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Jest ona przydatna do sprawdzania poprawnoci uycia klas, funkcji i polece silnika gry w ro-
dowisku Unity.
Gdy poznae ju podstawy tworzenia skryptów, moemy przyjrze si kolejnemu przykadowi,
wykonujcemu operacj poruszania postaci. Zaprezentowany niej kod jest uproszczon wersj
skryptu CharacterMotor, który zaimportowae z pakietem Character Controllers assets. Zosta
nazwany FPSWalker i napisany w jzyku JavaScript. Jego gówne zaoenia mog jednak zosta
w prosty sposób przeksztacone do jzyka C#.
Analiza skryptu
Aby si dowiedzie , ile si do tej pory nauczye, przyjrzyj si najpierw caemu skryptowi
i sprawd, jak duo z jego kodu moesz zrozumie . Nastpnie przeczytaj dalsze podpunkty,
by zapozna si z analiz poszczególnych fragmentów skryptu.
139
Projektowanie gier w rodowisku Unity 3.x
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= gravity * Time.deltaTime;
Deklaracje zmiennych
Tak jak wikszo skryptów równie FPSWalker rozpoczyna si od zestawu deklaracji zmiennych
znajdujcego si pomidzy wierszami 1. i 5., jak przedstawiono w poniszym fragmencie kodu:
var speed : float = 6.0;
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;
private var moveDirection : Vector3 = Vector3.zero;
private var grounded : boolean = false;
Zmienna prywatna grounded jest typu boolean (true lub false). Jest uywana w dalszej czci
skryptu do przechowywania informacji o tym, czy gracz znajduje si na powierzchni gruntu.
Dziki temu mona zezwoli mu na poruszanie si lub wykonywanie skoku, co byoby niemo-
liwe, gdyby nie znajdowa si na powierzchni gruntu (czyli inaczej mówic, wykonywaby wa-
nie skok).
140
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Uwaga
Czytajc ksik, bdziesz móg czasem zauway, e kod zawarty w jednym wierszu bdzie si w rze-
czywistoci pojawia w dwóch oddzielnych liniach. Pamitaj o tym, e taki rezultat uzyskano jedynie
w celu zdefiniowania odpowiedniego wcicia z powodu braku miejsca. Podczas wykorzystywania takiego
kodu upewnij si, e znajduje si on w jednym wierszu Twojego pliku skryptowego.
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}
Zarówno polecenia, jak i zagniedona instrukcja if (wiersze od 11. do 13.) s wywoywane dla
warunku if(grounded), który jest skrótowym zapisem polecenia:
if(grounded == true){
Gdy zmienna grounded jest równa true, instrukcja if wykonuje trzy operacje zwizane ze zmienn
moveDirection.
Przypisuje jej nowo utworzon warto typu Vector3, a nastpnie umieszcza biec warto
wyraenia Input.GetAxis("Horizontal") we wspórzdnej X oraz Input.GetAxis("Vertical")
we wspórzdnej Z, pozostawiajc wspórzdn Y równ 0:
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0,
´Input.GetAxis("Vertical"));
Jak pamitamy z rozdziau 2., polecenie Input.GetAxis zwraca wartoci zawierajce si pomi-
dzy -1 i 1, odpowiadajce poziomym i pionowym klawiszom wejciowym, które domylnie s
zdefiniowane jako:
141
Projektowanie gier w rodowisku Unity 3.x
Jeli aden z powyszych klawiszy nie jest nacinity, zwracane wartoci bd równe 0, ponie-
wa s one zwizane z osiami, którym rodowisko Unity automatycznie przypisuje stan nie-
aktywnoci. Na przykad podczas naciskania klawisza strzaki w lewo warto wyraenia
Input.GetAxis("Horizontal") bdzie równa -1, przy naciskaniu klawisza strzaki w prawo bdzie
wynosi 1, natomiast gdy aden klawisz nie zostanie nacinity, wyraenie zwróci warto 0.
Krótko mówic, w poniszym wierszu zmiennej moveDirection zostaje przypisana warto typu
Vector3, zawierajca skadowe X i Y zalene od nacinicia odpowiednich klawiszy, a skadow
Z równ 0:
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0,
´Input.GetAxis("Vertical"));
Wreszcie w wierszu 10. zmienna moveDirection jest mnoona przez zmienn speed:
moveDirection *= speed;
Poniewa speed jest zmienn publiczn, mnoenie przez ni wartoci XYZ zmiennej moveDirection
oznacza, e po zwikszeniu wartoci pola speed w panelu Inspector (inspektor) uzyskujemy
przyspieszenie ruchu postaci bez koniecznoci edytowania samego skryptu. Dzieje si tak, gdy
wynikowa warto zmiennej moveDirection jest uywana w dalszej czci skryptu do przemiesz-
czania postaci.
Instrukcja ta jest wykonywana po naciniciu klawisza o nazwie "Jump". Domylnie klawisz ten
jest przyporzdkowany do spacji. Gdy zostaje nacinity, wartoci osi Y zmiennej moveDirection
jest przypisywana zmienna jumpSpeed. Wynika std, e dopóki nie zostanie ona zmodyfikowana
w panelu Inspector, warto moveDirection.y bdzie równa 8.0.
142
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Naga zmiana wartoci osi Y z 0 na 8.0 moe wywoa efekt skoku. Ale w jaki sposób posta wróci
z powrotem na powierzchni gruntu? Obiekty typu Character Controller nie wykorzystuj
komponentów Rigidbody, dlatego nie podlegaj prawom cienia w silniku fizycznym.
Moesz zauway , e nie odejmujemy samej wartoci przycigania, poniewa wówczas nie
uzyskalibymy efektu skoku, lecz zamiast tego w kadej klatce zmienialibymy pooenie
w gór i w dó. Dlatego te odejmujemy warto grawitacji pomnoon przez wynik polecenia
Time.deltaTime.
Poruszanie postaci
Wiersze kodu od 16. do 17. steruj poruszaniem postaci.
Najpierw, w wierszu 16., jest tworzona nowa zmienna controller o typie CharacterController.
Nastpnie przy uyciu poznanej ju funkcji GetComponent() jest ona inicjalizowana wartoci
komponentu Character Controller:
var controller : CharacterController = GetComponent(CharacterController);
Od tej pory przy kadym uyciu zmiennej controller moemy uzyska dostp do dowolnego
parametru komponentu Character Controller i wykorzysta jego funkcj Move w celu porusza-
nia obiektu.
143
Projektowanie gier w rodowisku Unity 3.x
Zderzacze typu Character Controller, podobnie jak inne, mog wykrywa kolizje z innymi
obiektami. Jednake w przeciwiestwie do standardowych zderzaczy zawieraj one cztery
specyficzne znaczniki kolizji, zdefiniowane w strukturze CollisionFlags. S one nastpujce:
Znaczniki te pozwalaj na sprawdzenie rodzaju kolizji, gdy wymieniaj w swojej definicji okre-
lon cz zderzacza, która bierze w niej udzia (z wyjtkiem parametru None, który oznacza
brak zderzenia).
Znaczniki kolizji wykorzystujemy w wierszu 18. w celu ustalenia wartoci zmiennej grounded:
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
Powyszy kod moe si wydawa do skomplikowany, zawiera bowiem wiele znaków równoci,
lecz jest jedynie skrótowym zapisem sprawdzania warunku i przypisywania do zmiennej okre-
lonej wartoci w jednym wierszu.
Najpierw podajemy nazw zmiennej grounded, a obok niej znak równoci. Nastpnie w nawia-
sach uywamy maski bitowej, aby ustali , czy rodzaj kolizji zapamitany w zmiennej flags
(zawierajcej przemieszczenie kontrolera) odpowiada systemowej wartoci CollidedBelow:
(flags & CollisionFlags.CollidedBelow)
Uycie pojedynczego znaku '&' oznacza tu porównywanie dwóch wartoci w postaci binarnej.
Jest to co, czego nie musisz na razie rozumie , poniewa system klas w rodowisku Unity udo-
stpnia skrócony zapis dla wikszoci tego typu oblicze.
Jeli zderzacz rzeczywicie zderza si paszczyzn doln (czyli znajduje si na powierzchni
gruntu), wówczas powysze wyraenie zwraca warto 1.
144
Rozdzia 4. • Postacie w grze i dalsze wykorzystanie skryptów
Polecenia @Script
Funkcja FixedUpdate() koczy si w wierszu 20. zapisem polecenia @script:
@script RequireComponent(CharacterController)
Polecenia @script s stosowane w celu realizowania dziaa, które zazwyczaj musz by wyko-
nywane poprzez uycie interfejsu uytkownika w edytorze rodowiska Unity.
Podsumowanie
W tym rozdziale przyjrzelimy si pierwszemu interaktywnemu elementowi w grze, czyli
obiektowi First Person Controller. Pogbilimy take nasz wiedz o tworzeniu skryptów
w rodowisku Unity. Bdzie ona bardzo przydatna w dalszej czci ksiki.
Aby zrealizowa powysze plany, na wyspie zbudujemy pierwszy model budynku placówki. Gracz
bdzie móg oddziaywa na ten obiekt, wykorzystujc animacje i skrypty.
145
Projektowanie gier w rodowisku Unity 3.x
146
5
Interakcje
W tym rozdziale zajmiemy si dalszymi interakcjami oraz poznamy trzy najwaniejsze zagad-
nienia, zwizane z projektowaniem gier komputerowych. Bd to:
1. Maya;
2. 3D Studio Max;
3. Cheetah 3D;
4. Cinema 4D;
5. Blender;
6. Carrara;
7. Lightwave;
8. XSI;
9. Modo.
W celu zapoznania si z najbardziej aktualn list zgodnoci odwied stron internetow http://
unity3d.com/unity/features/asset-importing.
Zanim umiecisz dowolny model w aktywnej scenie, powiniene si zawsze upewni , e jego
ustawienia, dostpne w panelu Inspector, s prawidowe. Gdy rodowisko Unity importuje
modele do projektu, analizuje je przy uyciu komponentu FBXImporter.
Dziki uyciu komponentu FBXImporter w panelu Inspector moesz wybra plik swojego modelu
w oknie Project i zmodyfikowa ustawienia jego siatek, materiaów i animacji, zanim stanie si
on elementem tworzonej przez Ciebie gry. Komponent FBXImporter pozwala nawet na ponown
interpretacj modelu ju po dodaniu go do sceny.
Meshes
W sekcji Meshes (siatki) mona zdefiniowa nastpujce parametry komponentu FBXImporter:
148
Rozdzia 5. • Interakcje
149
Projektowanie gier w rodowisku Unity 3.x
Materials
Sekcja Materials (materiay) pozwala na okrelenie, jak naley zaimportowa materiay utworzone
w Twojej zewntrznej aplikacji modelowania trójwymiarowego. W menu Generation (genero-
wanie) mona wybra opcj Per Texture (tworzenie materiau Unity dla kadego znalezionego
pliku tekstury) lub Per Material (tworzenie materiaów tylko dla istniejcych zasobów w pliku
oryginalnym).
Animations
Sekcja Animations (animacje) komponentu FBXImporter umoliwia wybranie sposobu, w jaki
naley zaimportowa animacje stworzone w aplikacji modelujcej:
Menu Animation Wrap Mode (tryb odtwarzania animacji) pozwala na wybranie sposobu odtwa-
rzania animacji (jednorazowo, w ptli itd.). Moe on zosta równie zdefiniowany dla poszcze-
gólnych animacji, wic jeli nie chcesz zmienia globalnego ustawienia we wszystkich elemen-
tach, wybierz opcj Default (domylnie).
Zaznaczenie pola Split Animations (podzia animacji) spowoduje, e podczas tworzenia modeli
dla rodowiska Unity animatorzy mog zdefiniowa animacj wykorzystujc o czasu. Okrelajc
150
Rozdzia 5. • Interakcje
zakres klatek i definiujc nazw, mona przyporzdkowa dany odcinek animacji do osi czasu,
na której ona przebiega. Waciwa nazwa fragmentu animacji moe by nastpnie uywana
w skryptach.
Animation Compression
Sekcja Animation Compression (kompresja animacji) obsuguje kompresj i korekcj bdów,
które mog wystpi podczas importowania danych z aplikacji modelowania trójwymiarowego.
Menu Animation Compression zawiera trzy opcje: Off (wyczony), Keyframe Reduction (reduk-
cja klatek kluczowych) oraz Keyframe Reduction and Compression (redukcja klatek kluczowych
oraz kompresja).
Nie zalecamy wyboru opcji Off, chyba e chcesz uzyska najwysz precyzj dziaania swoich
animacji. rodowisko Unity domylnie redukuje liczb klatek kluczowych, uywajc parametru
Keyframe Reduction. Dziki wykorzystaniu kompresji mona równie zmniejszy objto pliku.
Jednake moe to spowodowa powstanie pewnych bdów. Aby w tym przypadku ustali poziom
dokadnoci, powiniene okreli warto dopuszczalnych znieksztace poprzez wypenienie
odpowiednich pól edycji Rotation Error (bd obrotu), Position Error (bd pozycji) i Scale Error
(bd skalowania). Im mniejsz warto podasz, tym dokadniejsz animacj uzyskasz.
Gdy ju zapoznalimy si z dostpnymi opcjami, moemy zaj si pierwszym zasobem modelu,
stworzonym w zewntrznej aplikacji. Bdzie nim budynek placówki, który umiecimy na wyspie.
Nastpnie w tabeli znajdujcej si w dolnej czci sekcji Animations (animacje) umie trzy klipy
animacji, wykorzystujc w tym celu widoczny po prawej stronie przycisk z ikon w ksztacie
znaku plusa.
151
Projektowanie gier w rodowisku Unity 3.x
Pierwsza animacja zostaa automatycznie (lecz mimo tego poprawnie) nazwana idle (stan bez-
czynnoci). Musisz jeszcze okreli dla niej zakres klatek. W polu Start (pocztek) umie war-
to 1, aby animacja rozpoczynaa si od pierwszej klatki, a w polu End (koniec) wprowad
warto 2.
Uwaga
Pamitaj, e nazwy animacji uwzgldniaj wielko liter. Powinno by to brane pod uwag podczas wyko-
rzystywania ich w skryptach. Upewnij si wic, e zapisae je poprawnie i nie popenie adnego bdu.
Pole Loop (ptla) w tabeli Animations moe wprowadza w bd pocztkujcych uytkowników.
Nie zostao ono przeznaczone do uruchamiania animacji w ptli — taka opcja jest ju obsugi-
wana przez parametr Wrap Mode (sposób odtwarzania animacji) w komponencie Animation
danego obiektu. Zamiast tego pole to suy do umieszczania w animacji dodatkowej klatki, która
powinna dziaa w ptli. Moe to mie miejsce w przypadku, gdy po zaimportowaniu obiektu
z aplikacji modelujcej pocztkowa i kocowa klatka nie pasuj do siebie.
Dodawanie placówki
Zanim rozpoczniemy wykorzystywanie opcji wykrywania kolizji i rzucania promieni w celu otwar-
cia drzwi do placówki, musimy doda j do naszej sceny.
Przecignij model outPost z panelu Project (projekt) do widoku Scene (scena), a nastpnie upu
go w niezajtym obszarze terenu. Bdziesz móg zauway , e obiekty trójwymiarowe, przeci-
gane nad widok Scene i upuszczane na nim, s umieszczane na zderzaczu, który znajduje si
poniej kursora muszy.
W naszym przypadku jest nim wbudowany zderzacz terenu. Narzdziem Translate (klawisz W)
bdziesz musia jednak czsto modyfikowa pozycj umieszczonego w scenie obiektu.
152
Rozdzia 5. • Interakcje
Gdy placówka pojawia si ju w scenie, moesz take zauway , e odpowiednia nazwa obiektu
zostaa wywietlona w panelu Hierarchy (hierarchia) oraz jest wybrana automatycznie. Aby
dokadniej obejrze nasz model, umie kursor myszy nad obszarem Scene, a nastpnie nacinij
klawisz F, by przybliy widok placówki.
Ustalenie pooenia
Poniewa Twój teren moe wyglda troch inaczej ni ten, który zaprezentowano na rysunkach
w niniejszej ksice, wybierz narzdzie Transform (przekszta ) i poprzez uycie uchwytów odpo-
wiednich osi wspórzdnych umie placówk w niezajtym i paskim miejscu wyspy. Jeli nie
dysponujesz adnym paskim terenem, wybierz obiekt Terrain w panelu Hierarchy, a póniej
uyj narzdzi edycji terenu, które omawialimy w rozdziale 3., aby spaszczy okrelony frag-
ment obszaru. Do tego celu wykorzystaj narzdzie Paint Height (modyfikacja wysokoci) z ogra-
niczeniem wysokoci poziomu do 30 metrów.
Na powyszym rysunku widzimy obiekt gry outPost w pooeniu (213, 30, 380), zdefiniowanym
w komponencie Transform. By moe lokalizacja Twojego modelu bdzie jednak musiaa zosta
ustalona przez Ciebie. Pamitaj, e gdy wstpnie umiecisz obiekt w oknie Scene za pomoc
uchwytów osi wspórzdnych, moesz poda okrelone wartoci w polach Position (pooenie)
komponentu Transform w panelu Inspector.
Obrót
Mimo e nie jest to konieczne ze wzgldów funkcjonalnych, z powodu czysto estetycznego
umiecimy wejcie do budynku po stronie wiata padajcego z naszego róda Directional Light
(wiato kierunkowe). Aby to zrobi , po prostu obró obiekt o 180 stopni w osi Y przy uyciu
komponentu Transform w panelu Inspector.
153
Projektowanie gier w rodowisku Unity 3.x
Dodanie zderzaczy
Aby mie moliwo otwarcia drzwi, musimy wykry je jako oddzielny obiekt podczas ich kolizji
z graczem. Moe do tego doj , poniewa obiekt zawiera komponent zderzacza, dziki któremu
jestemy w stanie go wykry w grze za pomoc jego nazwy lub okrelonego znacznika. Rozwi
obiekt nadrzdny outPost, klikajc szar strzak, znajdujc si po lewej stronie jego nazwy
w panelu Hierarchy.
Powiniene teraz widzie list wszystkich obiektów podrzdnych. Wybierz ten, który nazywa si
door (drzwi). Nastpnie umie kursor myszy w oknie Scene i nacinij klawisz F, aby przybliy
widok obiektu. Jeli nie widzisz drzwi, po prostu nacinij klawisz Alt i poruszaj mysz, by odpo-
wiednio obróci widok w celu ich wywietlenia.
Po wybraniu obiektu powiniene widzie drzwi w oknie Scene, a take odpowiednie kompo-
nenty w panelu Inspector. Jednym z nich jest Mesh Collider. Jest to szczegóowy zderzacz, przy-
porzdkowany do wszystkich siatek uywanych w rónych obiektach podrzdnych modelu.
Uzyskuje si go przez wybór opcji Generate Colliders (generowanie zderzaczy), co zrobilimy
wczeniej podczas konfigurowania zasobu outPost.
Zderzacz siatkowy zosta przypisany do kadego elementu potomka, poniewa rodowisko Unity
nie potrafi okreli , z jakim poziomem dokadnoci bdzie prezentowany dany model, który
chcemy zaimportowa . W wyniku tego przypisuje zderzacze siatkowe do kadego skadnika
modelu, gdy odpowiadaj one w sposób naturalny ksztatom napotkanych konstrukcji. Jednake
nasze drzwi maj po prostu ksztat zwykego szecianu, dlatego powinnimy zamieni ich zde-
rzacz siatkowy na prostszy i bardziej sprawny zderzacz skrzynkowy. Jest to bardzo wana czyn-
no podczas importowania nawet prostych siatek — przyczyni si ona do szybszego dziaania gry
wykorzystujcej proste zderzacze, a nie zderzacze siatkowe.
Pojawi si dwa komunikaty. Po pierwsze wywietlone okno Losing Prefab (utrata poczenia
z prefabrykatem) poinformuje Ci, e dodanie nowego komponentu spowoduje utrat po-
czenia z zasobem rodzica w panelu Project. Oznacza to po prostu, i kopia obiektu znajduj-
cego si w widoku Scene nie bdzie ju odpowiada pierwotnemu zasobowi. W wyniku tego
adna modyfikacja (z wyjtkiem skalowania) zasobu w panelu Project nie zostanie wykonana
na kopii obiektu w panelu Scene. Po prostu kliknij przycisk Add (dodaj), aby potwierdzi , e zga-
dzasz si na wykonanie modyfikacji.
Taka sytuacja zdarza si, gdy chcesz dopasowa do wasnych potrzeb modele, zaimportowane
do rodowiska Unity. Nie naley si tym przejmowa , poniewa i tak musisz doda okrelone
komponenty do obiektu. rodowisko Unity umoliwia wówczas stworzenie prefabrykatów —
wicej o tym zagadnieniu w dalszej czci ksiki.
154
Rozdzia 5. • Interakcje
Poniewa obiekt uywa ju swojego zderzacza, pojawi si kolejne okno dialogowe z pytaniem,
co chcesz z nim zrobi . Masz do wyboru trzy opcje: Add (dodaj), Replace (zamie) oraz Cancel
(anuluj). Ogólnie mówic, w danym obiekcie powiniene uywa jednego zderzacza, taka konfi-
guracja jest bowiem lepiej obsugiwana przez silnik fizyczny w rodowisku Unity. Dlatego te
w oknie pojawia si pytanie, a nie dochodzi do automatycznego dodania kolejnych zderzaczy.
Moesz ju zauway zielony zarys wokó drzwi, który reprezentuje dodany przez Ciebie kom-
ponent Box Collider (zderzacz skrzynkowy):
Zderzacz skrzynkowy jest przykadem prostego zderzacza, którego kilka typów zostao zdefinio-
wanych w rodowisku Unity. Mona wród nich wymieni midzy innymi zderzacze kuliste,
kapsuowe i koowe. Maj one wczeniej zdefiniowane ksztaty i s wywietlane z zielonym zary-
sem. Moge to ju zauway przy zderzaczu postaci, który — technicznie rzecz biorc — jest
zderzaczem kapsuowym, równie wywietlanym w kolorze zielonym.
Wreszcie powinnimy opisa obiekt drzwi, poniewa musimy si do niego odwoa w skrypcie,
który póniej utworzymy. Majc wci wybrany obiekt podrzdny drzwi, kliknij menu rozwijane
Tag (znacznik), znajdujce si w górnej czci panelu Inspector, a nastpnie wybierz w nim opcj
Add Tag (dodaj znacznik). W menederze znaczników, który zastpi poprzedni widok, dodaj
znacznik playerDoor, jak zaprezentowano na poniszym rysunku.
155
Projektowanie gier w rodowisku Unity 3.x
Jeli obiekt podrzdny door jest zaznaczony, wybierz opcj menu gównego Component/Physics/
Rigidbody (komponent/parametry fizyczne/brya sztywna). Aby upewni si, e silnik fizyczny
nie bdzie sterowa ruchem drzwi, odznacz opcj wyboru Use Gravity (uyj grawitacji), a zaznacz
Is Kinematic (uyj kinematyki).
Dodanie d wiku
Poniewa drzwi bd si automatycznie otwiera i zamyka , powinnimy uy komponentu
róda audio, aby wydaway one odpowiednie dwiki w czasie tych czynnoci. Jeli obiekt pod-
rzdny door jest wci zaznaczony, wybierz opcj menu gównego Component/Audio/Audio
Source (komponent/audio/ródo audio).
156
Rozdzia 5. • Interakcje
nadrzdnego, zawartego w naszym modelu. Nie musimy tego robi , jeli nasz zasób jest zwy-
k animacj, odtwarzan przez cay czas w wiecie gry, na przykad opoczc flag lub obraca-
jcym si reflektorem latarni morskiej. Jednak drzwi nie powinny by animowane do momentu,
a zbliy si do nich gracz. Wynika std, e w tym przypadku musimy zabroni automatycznego
odtwarzania animacji.
Aby to zrobi , ponownie wybierz obiekt nadrzdny outPost w panelu Hierarchy, a nastpnie
w panelu Inspector odznacz opcj wyboru Play Automatically komponentu Animation.
Panel Inspector dla obiektu outPost powinien teraz wyglda tak jak na poniszym rysunku.
Uwaga
Zwró uwag na to, e parametr Animations (animacje), widoczny na rysunku, naley do komponentu
Animation (animacja) i prezentuje biece parametry animacji, dotyczce danego obiektu.
Obiekt placówki moe ju zosta wykorzystany w celu nawizania interakcji z postaci gracza.
Powinnimy wic rozpocz tworzenie skryptu, który bdzie obsugiwa wykrywanie kolizji.
Kolizje i wyzwalacze
Do wykrywania fizycznych interakcji midzy obiektami gry suy przede wszystkim komponent
zderzacza. Jest to niewidoczna sie , która otacza dany ksztat i rozpoznaje kolizje z innymi obiek-
tami. Czynno rozpoznawania zderze i uzyskiwania informacji o nich jest zwana wykrywaniem
kolizji.
157
Projektowanie gier w rodowisku Unity 3.x
Oprócz tego, e potrafimy wykry sytuacj, w której dwa zderzacze oddziauj na siebie (wykry-
wanie kolizji), moemy take ustali , kiedy okrelone zderzacze przecinaj si ze sob (wykry-
wanie kolizji w trybie wyzwalania), a nawet dziki wykorzystaniu techniki rzucania promieni
(ang. ray casting) umiemy przewidzie kolizj, co pozwala nam na wykonanie szeregu przydatnych
operacji. Metoda rzucania promieni, w przeciwiestwie do wykrywania oddziaywa trójwy-
miarowych ksztatów zderzaczy, generuje promie. Jest to niewidoczny (nierenderowany) wek-
tor, umieszczony pomidzy dwoma punktami w przestrzeni 3D, który moe równie suy
do wykrywania zderzenia z jakim zderzaczem obiektu gry.
Technika rzucania promieni moe zosta take wykorzystana do uzyskania wielu interesujcych
informacji, na przykad o dugoci odcinka (czyli odlegoci midzy punktami) oraz pooeniu,
w którym linia przecina dany obiekt. Dziki temu moemy przykadowo sprawdzi , w którym
miejscu wystrzelony w grze pocisk uderzy w inny obiekt.
W tym rozdziale bdziemy analizowa model placówki, który umiecilimy na terenie wyspy.
Poniewa animacja drzwi dla tego zasobu zostaa ju wczeniej dla nas wykonana, jest ona
gotowa do uruchomienia we waciwym momencie. Moe do tego doj za pomoc trzech
metod: zwykego wykrywania kolizji, wykrywania kolizji w trybie wyzwalania oraz rzucania
promieni. Zajmiemy si kad z nich, ustalajc jednoczenie niezbdne warunki, wymagane
do ich implementacji.
Zanim jednak zaczniemy wdraa kade z rozwiza, rozpocznijmy od przyjrzenia si kolizji
i procedurze jej wykrywania w kontekcie otwierania drzwi obiektu outPost, a take ustalmy,
w jakich warunkach naley stosowa okrelon metod z powyej wspomnianych.
Gdy kolizja obiektów zostaje wykryta przez silnik gry, pojawia si informacja o zdarzeniu kolizji.
Poniewa silnik uzyskuje róne dane zwizane z momentem uderzenia, moe on we waciwy
sposób reagowa . Na przykad, jeli w grze wykorzystujcej parametry fizyczne jaki obiekt
spadnie na powierzchni gruntu, wówczas silnik musi wiedzie , który jego fragment pierwszy
spowodowa kolizj. Majc t informacj, mona poprawnie i w realistyczny sposób zaimple-
mentowa reakcj obiektu na uderzenie.
158
Rozdzia 5. • Interakcje
Oczywicie rodowisko Unity wyrcza Ci w obsudze rónych rodzajów kolizji i przechowy-
waniu odpowiednich informacji. Twoim zadaniem jest tylko ich odczytanie, a nastpnie okre-
lone przetworzenie.
W przypadku otwieranych drzwi musielibymy wykry kolizj midzy zderzaczem gracza oraz
innym zderzaczem, znajdujcym si w drzwiach lub obok nich. Wykrywanie kolizji w dowolnym
miejscu nie miaoby sensu, poniewa powinnimy uruchomi animacj drzwi wycznie w sytu-
acji, w której gracz znajduje si na tyle blisko nich, by móg przez nie przej lub je otworzy .
Wynika std, e musimy sprawdzi , czy nie pojawia si kolizja midzy zderzaczem gracza oraz
zderzaczem drzwi. Konieczne stanie si takie zwikszenie gruboci zderzacza drzwi, aby zde-
rzacz gracza nie musia naciska klamki drzwi, by spowodowa pojawienie si kolizji (patrz
rysunek poniej). Jednake zwikszenie rozmiaru zderzacza spowoduje, e interakcja z nim stanie
si nierealistyczna.
Aby unikn takiej sytuacji, zderzacze musz wykorzystywa tryb wyzwalania, który oznacza,
e bd one wykrywa kolizje, ale nie bd si jednoczenie zachowywa jak obiekt fizyczny.
Taki tryb jest czsto uywany, gdy chcemy sprawdzi , czy posta gracza znajduje si w okrelonym
obszarze. W tym przypadku mona uy dwóch zderzaczy: jednego, którego ksztat dokadnie
odpowiada ksztatowi drzwi, oraz drugiego, który jest wyzwalaczem i otacza obiekt ze wszystkich
stron (patrz poniszy rysunek).
159
Projektowanie gier w rodowisku Unity 3.x
Tak wic procedura wykrywania kolizji, wykorzystujca zderzacz postaci gracza oraz zderzacz
drzwi, bdzie dziaa prawidowo. Dziki zderzaczowi wyzwalajcemu, który otacza drzwi,
moemy wykry obecno gracza, zanim on sam w nie uderzy. Oprócz tego, e uywamy wyzwa-
laczy do rozpoznawania interakcji midzy zderzaczami, musimy czasem wykrywa potencjaln
kolizj duo bardziej odlegych obiektów. W tym celu moemy wykorzysta technik zwan
rzucaniem promieni.
Rzucanie promieni
Wiemy ju, e moemy wykrywa kolizje zderzacza postaci gracza ze zderzaczem skrzynkowym
lub wyzwalajcym. Jednake za pomoc metody rzucania promieni w kierunku spogldania gracza
potrafimy równie sprawdzi , czy bdzie on oddziaywa na jaki zderzacz. W przypadku naszych
drzwi oznacza to, e gracz nie musi ich dotkn ani nawet znale si w obszarze dziaania zder-
zacza wyzwalajcego, by zosta wykryty.
160
Rozdzia 5. • Interakcje
Jednake wad tej metody jest to, e gracz musi by ustawiony twarz w kierunku zderzacza
drzwi, aby wyprowadzony promie móg je dosign (zakadajc, e promie jest rzucany
w kierunku spogldania gracza). Jak zapewne wiesz, nie na tym polega sposób dziaania auto-
matycznych drzwi, które po prostu wykrywaj ruch w ich pobliu.
Pomimo tej wady oraz zwizanej z ni metody wykrywania kolizji czsto dobrym rozwizaniem
(jak sam si przekonasz po zdobyciu pewnego dowiadczenia w obsudze rodowiska Unity)
jest wypróbowanie kilku sposobów, by w kocu zdecydowa , który z nich jest najlepszy. Z tego
powodu, w celu wykonania procedury otwierania drzwi, poznamy zasady dziaania metod wykry-
wania kolizji i rzucania promieni, a take zastosujemy zderzacz wyzwalajcy.
Zapoznanie si z metod rzucania promieni jest równie wane, poniewa bdzie ona czsto
uywana w dalszych etapach projektowania gry do rozwizywania okrelonych problemów,
takich jak przewidywanie potencjalnej kolizji w przypadku, gdy analiza interakcji midzy
dwoma zderzaczami nie jest waciwym rozwizaniem. Przyjrzyjmy si praktycznemu przyka-
dowi, zwizanemu z tym problemem.
Zgubienie klatki
Metoda rzucania promieni w przypadku trójwymiarowej strzelanki pozwala na wyznaczenie miej-
sca uderzenia pocisku wystrzelonego z broni. Z powodu duej prdkoci rzeczywistego pocisku
symulacja cieki jego lotu w kierunku celu jest bardzo trudna do wizualnego zaprezentowania
w takiej jakoci, by moga by sensowna i przekonujca dla gracza. Wynika to ze sposobu rende-
rowania obrazu gry, opartego na klatkach. Jeli zaoymy, e po oddaniu strzau z prawdziwej
broni pocisk osignie cel po upywie krótkiego czasu, który dla obserwatora bdzie praktycznie
niezauwaalny, wówczas moemy stwierdzi , e nawet w przypadku prdkoci renderowania
wikszej ni 25 klatek na sekund zdarzenie to moe trwa najwyej kilka klatek.
Na rysunku na nastpnej stronie widzimy pocisk wystrzelony z broni. Aby cay proces by reali-
styczny, powinnimy przyj , e prdko pocisku bdzie wynosi okoo 150 m/s. Jeli szybko
161
Projektowanie gier w rodowisku Unity 3.x
klatek jest równa 25 fps, wówczas pocisk pokona w jednej klatce odlego szeciu metrów. Pro-
blem polega na tym, e w przypadku celu, którego szeroko wynosi okoo jednego metra, pocisk
najprawdopodobniej nie trafi w postacie wrogów, znajdujce si w odlegoci dwóch i dziesiciu
metrów od gracza. W tej sytuacji konieczne staje si wykorzystanie funkcji przewidywania.
Takie obliczenie moemy wykona bez problemu, poniewa promienie s rysowane natychmiast.
Potraktuj je jako co w rodzaju wskanika laserowego — gdy go wczasz, nie widzisz wiata
biegncego w kierunku celu, porusza si ono bowiem z wielk prdkoci, dziki czemu caa ope-
racja jest byskawiczna.
Rzucanie promieni dziaa w taki sam sposób. Gdy gracz w strzelance naciska przycisk strzau,
zostaje narysowany promie w kierunku, w którym on celuje. Dziki temu moemy uzyska
informacje o trafionym zderzaczu. Oprócz tego, poprzez zidentyfikowanie zderzacza, obiekt gry,
który go zawiera, moe zosta uyty w odpowiednich skryptach w celu zdefiniowania jego zacho-
wania. Wykorzystanie tej metody pozwala uzyska szczegóowe dane, takie jak dokadne miejsce
uderzenia, które mog zosta zastosowane na przykad w celu przemieszczenia obiektu wroga
w okrelonym kierunku.
162
Rozdzia 5. • Interakcje
Wró my teraz do gry i zastosujmy zaprezentowane wyej rozwizania w celu uzyskania interakcji
z drzwiami, nalecymi do obiektu gry outPost.
163
Projektowanie gier w rodowisku Unity 3.x
Wypróbujemy wic trzy róne rozwizania naszego problemu i uzyskamy gotowy kod, który
moesz wykorzysta w swoich przyszych projektach.
Podczas projektowania gier powiniene traktowa posta gracza jako unikatow jednostk,
na któr mog oddziaywa inne obiekty. Zamiast tworzy dla gracza gówny i skomplikowany
skrypt, w którym byyby zawarte funkcje reagujce na wszystkie moliwe sytuacje, moemy
utworzy po jednym, prostszym skrypcie dla kadego z obiektów, zajmujcym si interakcj
z postaci gracza.
Upewnij si, e folder Scripts jest wci wybrany. Nastpnie ponownie kliknij przycisk Create
w panelu Project, co spowoduje utworzenie w folderze nowego skryptu w jzyku C# lub
JavaScript.
Wskazówka
Wczeniejszy wybór okrelonego folderu, w którym chcesz umieci nowy zasób, upraszcza wykonywa-
nie dziaa. Zamiast tworzy zasób w innym miejscu, a nastpnie go przenosi, pojawi si on od razu
we waciwym miejscu.
164
Rozdzia 5. • Interakcje
Nie s one jednak wywietlane w panelu Project, dlatego nie powiniene ich dodawa po zmianie
nazwy zasobu.
Uwaga
Typ pliku skryptu jest zwizany z ikon, znajdujc si przy jego nazwie w panelu Project. Ikona skryptu
w jzyku JavaScript zawiera napis „JS”, a w C# — odpowiednio „C#”. Ikona pliku z instrukcjami w jzyku
Boo przedstawia duszka z gry Pacman.
Uwaga
Uytkownicy jzyka C# przed rozpoczciem pracy powinni si zawsze upewni, e nazwa klasy skryptu
odpowiada nazwie pliku. W naszym przypadku powinna ona zosta automatycznie zmieniona z New
´BehavioursScript na PlayerCollisions.
Skrypt powinien zawiera na pocztku definicje dwóch zmiennych prywatnych oraz trzech
publicznych. Ich zastosowanie jest nastpujce:
165
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
bool doorIsOpen = false;
float doorTimer = 0.0f;
public float doorOpenTime = 3.0f;
public AudioClip doorOpenSound;
public AudioClip doorShutSound;
Jzyk JavaScript:
private var doorIsOpen : boolean = false;
private var doorTimer : float = 0.0;
private var currentDoor : GameObject;
Pominiemy funkcj Update(), poniewa sami napiszemy procedur wykrywajc kolizje. W tym
celu zlokalizuj nastpujcy kod:
Jzyk C#:
void Update () {
}
Jzyk JavaScript:
function Update(){
}
Jzyk C#:
void OnControllerColliderHit(ControllerColliderHit hit){
}
Jzyk JavaScript:
function OnControllerColliderHit(hit : ControllerColliderHit){
}
166
Rozdzia 5. • Interakcje
Powyszy kod tworzy now funkcj o nazwie OnControllerColliderHit. Powinna ona wykrywa
kolizje i jest przeznaczona dla tych postaci, które zawieraj komponent CharacterController.
Jej jedynym argumentem jest zmienna hit typu ControllerColliderHit. Typ ten jest klas prze-
chowujc informacje o dowolnej kolizji, która miaa miejsce. Wykorzystujc zmienn hit,
moemy uzyska dane zwizane z kolizj, wcznie z nazw okrelonego obiektu gry, z którym
gracz si zderzy.
Jzyk C# i JavaScript:
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false){
}
W powyszej instrukcji if sprawdzamy dwa warunki. Po pierwsze, czy obiekt, z którym zderzy-
limy si, zawiera znacznik playerDoor, a po drugie, czy zmienna doorOpen jest równa false.
Pamitaj, e dwa znaki równoci == umieszczone obok siebie oznaczaj porównanie, natomiast
dwa znaki && s po prostu spójnikiem „i”.
Rezultat poczenia obu warunków jest taki, e gdy uderzymy w zderzacz, który charakteryzuje
si okrelonym znacznikiem, oraz gdy drzwi nie s jeszcze otwarte, polecenie if bdzie mogo
wykona szereg instrukcji.
Aby uzyska dostp do obiektu, z którym si zderzamy, uylimy skadni z kropk. W tym celu
rozpoczlimy od zmiennej hit, przechowujcej informacje o kolizjach, nastpnie przeszlimy
do obiektu gameHit, z którym si zderzamy, a wreszcie do jego znacznika (tag).
Jeli warunki zapisane w instrukcji if s spenione, wówczas musimy wykona szereg instrukcji
w celu otwarcia drzwi. Bd one odpowiada za odtworzenie dwiku, wywietlenie jednego
z klipów animacji, zawartych w modelu, a take przypisanie zmiennej doorOpen wartoci true.
Poniewa zamierzamy wywoa wiele instrukcji, których prawdopodobnie ponownie uyjemy
w przyszoci, gdy bdziemy implementowa rozwizanie oparte na rzucaniu promieni, umie-
cimy je we wasnej funkcji, zwanej OpenDoor.
Funkcj t napiszemy ju wkrótce, lecz najpierw umie my jej wywoanie w poleceniu if przez
dodanie poniszego kodu:
OpenDoor();
Jzyk C#:
void OnControllerColliderHit(ControllerColliderHit hit){
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false){
OpenDoor(hit.gameObject);
}
}
167
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
function OnControllerColliderHit(hit: ControllerColliderHit){
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false){
OpenDoor(hit.gameObject);
}
}
W naszej funkcji wykrywania kolizji umiecilimy wywoanie funkcji zwanej OpenDoor. Nawiasy
po nazwie OpenDoor s uywane do przechowywania parametrów, które chcemy do niej przekaza .
Dziki temu moesz sprawi , e funkcja bdzie dziaa odmiennie, w zalenoci od przekazanych
do niej parametrów. Z przykadem takiego kodu zapoznalimy si ju wczeniej w podrozdziale
„Tworzenie wasnych funkcji”, nalecym do rozdziau 4.
Tym zagadnieniem zajmiemy si bardziej szczegóowo w tym rozdziale. W nawiasach funkcji
OpenDoor() znajduje si pojedynczy argument typu GameObject, odpowiadajcy obiektowi
hit.gameObject, z którym nastpio zderzenie.
Deklaracja funkcji
Aby stworzy deklaracj funkcji OpenDoor(), pod zamykajcym nawiasem } funkcji OnController
´ColliderHit wprowad poniszy kod:
Jzyk C#:
void OpenDoor(GameObject door){
}
Jzyk JavaScript:
function OpenDoor(door : GameObject){
}
Funkcja zawiera odpowiedni argument door, któremu powinna zosta przypisana warto typu
GameObject. Jak ju wiemy, taka warto zostanie przesana podczas wykonywania procedury
wykrywania kolizji, któr wanie piszemy.
Podobnie jak ma to miejsce w przypadku instrukcji if, równie w funkcji OpenDoor() umiecimy
w jej nawiasach klamrowych zestaw polece, które bd wykonywane podczas jej wywoania.
168
Rozdzia 5. • Interakcje
Wynika to std, e posta gracza podczas zetknicia si z drzwiami moe wiele razy spowo-
dowa powstanie sytuacji kolizji. Brak powyszej zmiennej logicznej doprowadziby równie
do wielokrotnego wywoania funkcji OpenDoor(), generujc za kadym razem dwik i animacj.
Dziki zmiennej doorIsOpen, która ma warto false, moemy uruchomi funkcj OpenDoor().
Jednake zaraz po jej wywoaniu nastpuje przypisanie do zmiennej wartoci true, co nie pozwala
na ponowne wykonanie funkcji.
Dodaj nastpujcy wiersz kodu do funkcji OpenDoor()— umie go midzy nawiasami klamrowymi:
Jzyk C# i JavaScript:
doorIsOpen = true;
Odtwarzanie audio
Kolejna instrukcja pozwoli na odtwarzanie pliku dwikowego, przypisanego do zmiennej door
´OpenSound. Aby to zrobi , dodaj poniszy wiersz do swojej funkcji poprzez umieszczenie
go w nawiasach klamrowych:
C# and JavaScript:
door.audio.PlayOneShot(doorOpenSound);
Wywoujemy tutaj komponent Audio Source, przypisany do obiektu gry przekazywanego w argu-
mencie door. Jak pamitasz, jest nim obiekt ze znacznikiem playerDoor, który bierze udzia
w kolizji.
Odwoywanie si do róda dwiku poprzez uycie sowa audio pozwala na dostp do czte-
rech moliwych funkcji: Play(), Stop(), Pause() i PlayOneShot(). Wykorzystujemy t ostatni,
poniewa jest ona najlepiej przystosowana do odtwarzania pojedynczego pliku dwikowego.
Metoda odtwarzania dwiku, a nastpnie wyboru innego klipu, mogaby by bardziej odpowied-
nia w przypadku cigego prezentowania muzyki, a nie pojedynczych efektów dwikowych.
W nawiasach funkcji PlayOneShot przekazujemy zmienn doorOpenSound, co pozwoli na odtwa-
rzanie dowolnego pliku dwikowego, podanego w panelu Inspector.
Testowanie skryptu
Zanim bdziemy kontynuowa tworzenie skryptu, przy zaoeniu, e wszystko na razie dziaa
poprawnie, zapiszmy go na dysku i przetestujmy. Obecny stan pozwala na wykrycie kolizji obiektu
gracza, czyli First Person Controller, z drzwiami, bdcymi elementem podrzdnym obiektu
169
Projektowanie gier w rodowisku Unity 3.x
outPost. Jeli to nastpi, powinnimy odtworzy dwik, który bdzie przypisany do zmiennej
publicznej doorOpenSound.
W edytorze skryptów wybierz opcj File/Save (plik/zapisz), a nastpnie wró do rodowiska Unity.
Powinnimy przypisa skrypt do obiektu First Person Controller, lecz najpierw upewnijmy si,
e nie zawiera on bdów. Sprawd pole statusu w dolnej czci interfejsu Unity, poniewa w nim
pojawiaj si wszelkie komunikaty o skryptach. Zawiera ono ostatnio wywietlony wiersz konsoli,
dostpnej w opcji menu Window/Console (okno/konsola). Jeli pojawi si jakie bdy, dwu-
krotnie kliknij kady z nich i upewnij si, e Twój skrypt zawiera dokadn kopi doczonych
powyej fragmentów kodu. Podczas dalszej pracy w rodowisku Unity przyzwyczaisz si do uy-
wania informacji o bdach w celu korygowania pomyek.
Wskazówka
Najprostsz metod sprawdzenia, czy nie popenie adnych bdów w kodzie, jest upewnienie si,
e zawiera on parzyst liczb otwierajcych i zamykajcych nawiasów klamrowych. Oznacza to, i wszystkie
funkcje i polecenia zostay poprawnie zamknite.
Jeli nie znalaze adnych bdów, w panelu Hierarchy wybierz po prostu obiekt, do którego
chcesz przypisa skrypt. W naszym przypadku bdzie to obiekt First Person Controller.
Pojawi si okno dialogowe Losing prefab (utrata poczenia z prefabrykatem). Zawiera ono pyta-
nie, czy chcesz sprawi , by obiekt w Twojej scenie nie by ju kopi pierwotnego zasobu w panelu
Project. Poniewa jest to typowe zachowanie w takich sytuacjach, po prostu kliknij przycisk
Continue (kontynuuj).
Obecnie rozwi drzewo folderu Book Assets/Sounds (zasoby ksiki/dwiki), znajdujcego si
w panelu Project. Bdziesz móg zauway klipy o nazwach door_open i door_shut. Jeli obiekt
First Person Controller jest wci wybrany (co pozwala na wywietlenie zmiennych publicz-
nych Door Open Sound i Door Shut Sound w komponencie Player Collisions (Script)), prze-
cignij wspomniane klipy dwikowe z panelu Project do odpowiednich zmiennych w panelu
Inspector. Po ich przypisaniu obszar komponentu Player Collisions (Script) powinien wygl-
da nastpujco:
170
Rozdzia 5. • Interakcje
A teraz nadszed czas na akcj! W rodowisku Unity wybierz opcj menu gównego File/Save
Scene (plik/zapisz scen), aby uaktualni swoj scen, a nastpnie przetestuj gr, naciskajc
przycisk Play, znajdujcy si w górnej czci interfejsu.
Uwaga
Jeli nie przypisae adnego klipu do zmiennej publicznej Door Open Sound, wówczas po wykryciu kolizji
skrypt spróbuje odtworzy d wik, lecz okae si, e jest to niemoliwe. W wyniku tego pojawi si bd
Null Reference Exception, oznaczajcy odwoanie do wartoci pustej, czyli niezainicjalizowanej. Takie
problemy mog si czsto pojawia, jeli zdefiniujesz zmienn publiczn, ale zapomnisz przypisa jej jak
warto, albo te gdy w skrypcie zadeklarujesz zmienn, lecz nie zainicjalizujesz jej.
Przemie si obiektem First Person Controller w kierunku obiektu outPost i spróbuj przej
przez drzwi. Zauwaysz, e nie bdziesz móg aktywowa zderzacza drzwi do momentu, a obiekt
First Person Controller znajdzie si dokadnie przy nim. Gdy nastpi zetknicie zderzaczy,
usyszysz dwik odpowiadajcy otwieraniu drzwi. Nie bdzie temu towarzyszya odpowiednia
animacja, poniewa jeszcze nie uwzgldnilimy jej w skrypcie. Pamitaj, e jeli chcesz spraw-
dzi dziaanie gry, powiniene obserwowa widok Scene podczas jej testowania w widoku Game.
Zaznacz obiekt podrzdny door, a nastpnie przybli jego widok poprzez przemieszczenie
wskanika myszy nad widok Scene i nacinicie klawisza F. Wybierz opcj spogldania z góry:
kliknij zielony uchwyt osi Y w gadecie widoku, znajdujcym si w prawym górnym naroniku
okna Scene.
Teraz przytrzymaj wcinity klawisz Shift, a póniej przecignij odpowiednie punkty na tylnym
i przednim obrysie zderzacza, aby odpowiednio go powikszy (patrz rysunek na nstpnej
stronie).
Gdy zderzacz zosta powikszony, moemy si z nim zderzy ju w momencie wchodzenia
na schody. Ponownie przeprowad test gry i potwierd, e wszystko dziaa zgodnie z oczekiwa-
niami. Pamitaj, aby przed kontynuowaniem pracy ponownie nacisn przycisk Play w celu
zakoczenia testowania. A teraz sprawmy, i drzwi si otworz — nadszed czas na animacj!
Odtwarzanie animacji
Jednym z zada, które wykonalimy na pocztku tego rozdziau w trakcie procesu importowania
danych, byo zdefiniowanie klipów animacyjnych przy uyciu panelu Inspector. Podczas wybie-
rania zasobu w panelu Project moglimy ustali , e bdziemy wykorzystywa trzy klipy:
171
Projektowanie gier w rodowisku Unity 3.x
W funkcji OpenDoor() bdziemy uywa danego klipu, przekazujc jego nazw w odpowiednim
acuchu tekstowym. Jednake najpierw musimy ustali , który obiekt w scenie zawiera interesu-
jc nas animacj. Poniewa tworzony przez nas skrypt jest doczony do postaci gracza, zanim
uyjemy komponentu animacji, musimy odwoa si do innego obiektu. Moemy to ponownie
zrobi poprzez skorzystanie z obiektu, na który oddziauje posta gracza. W funkcji OpenDoor()
uywamy ju argumentu, który zawiera obiekt drzwi, uzyskany z funkcji OnControllerCollider
´Hit() — wykorzystywalimy go w celu odtwarzania pliku dwikowego za pomoc polecenia
door.audio.PlayOneShot("doorOpenSound");. Niestety, nasz komponent animacji jest doczony
nie do samych drzwi, lecz do obiektu nadrzdnego, czyli outPost.
Aby uy rodzica, moemy podczas odwoywania si do obiektu podrzdnego door wykorzysta
po prostu skrót transform.parent. Wewntrz funkcji OpenDoor(), poniej ostatniego polecenia,
które wprowadzie (czyli door.audio.PlayOneShot(doorOpenSound);), umie nastpujcy frag-
ment kodu:
C# and JavaScript:
door.transform.parent.animation.Play("dooropen");
Powyszy wiersz oznacza: „Odszukaj obiekt nadrzdny obiektu door, uyj jego komponentu ani-
macji, a nastpnie odtwórz klip animacji o nazwie dooropen”. Sprawdmy, czy to rzeczywicie
dziaa — wybierz opcj File/Save (plik/zapisz) w edytorze MonoDevelop i przejd do rodowiska
Unity.
172
Rozdzia 5. • Interakcje
Nacinij przycisk Play, znajdujcy si w górnej czci interfejsu, aby przeprowadzi test gry.
Zblienie si do zderzacza drzwi spowoduje odtworzenie dwiku i uruchomienie odpowiedniej
animacji. Jak zwykle zatrzymaj tryb testowania przed kontynuowaniem projektowania gry.
Odwrócenie procedury
Gdy napisalimy ju szereg instrukcji, pozwalajcych na otwarcie drzwi, zastanówmy si,
w jaki sposób mona je zamkn . Aby poprawi poziom rozgrywki, nie bdziemy zmusza gra-
cza do samodzielnego zamykania drzwi, lecz zaprogramujemy procedur, która spowoduje,
e operacja zamknicia wykona si automatycznie po upywie okrelonego czasu.
W tym miejscu wkracza do akcji zmienna doorTimer. Bdziemy j regularnie zwiksza o warto
przedziaów czasowych, które upyny od otwarcia drzwi, a nastpnie przy uyciu polecenia
if sprawdza , czy nie osigna okrelonego poziomu.
Poniewa przetwarzamy dane zwizane z czasem, bdziemy uywa funkcji, która jest regularnie
wywoywana, takiej jak Update(), znana nam ju ze wczeniejszych skryptów.
Umie kilka pustych wierszy wewntrz funkcji Update() poprzez przeniesienie w dó jej zamy-
kajcego nawiasu.
Najpierw trzeba sprawdzi , czy drzwi zostay otwarte, nie powinnimy bowiem zwiksza zmien-
nej, gdy s one zamknite. W instrukcji if umie polecenie zwikszajce zmienn licznika czasu,
jeli warto doorIsOpen jest równa true:
Jzyk C# i JavaScript:
if(doorIsOpen){
doorTimer += Time.deltaTime;
}
Na pocztku powyszego kodu sprawdzamy, czy drzwi s otwarte. Sytuacja taka wystpuje wów-
czas, gdy zmienna doorIsOpen jest równa true. Domylnie jest ona równa false, natomiast zmie-
nia si wycznie w wyniku kolizji obiektu gracza z drzwiami. Jeli zmienna doorIsOpen jest
równa true, zwikszamy zmienn doorTimer o warto Time.deltaTime. Pamitaj, e umieszczenie
samej nazwy zmiennej w warunku instrukcji if jest równowane zapisowi if(doorIsOpen == true).
Uwaga
Time.deltaTime jest waciwoci, która pozwala na zliczanie upywu czasu niezalenie od prdkoci
gry. Jest to wane, poniewa gra moe dziaa na rónym sprzcie. Byoby co najmniej dziwne, gdyby czas
zwalnia na wolniejszym komputerze, a przyspiesza na szybszym. Moemy uy wartoci Time.deltaTime
do wyznaczenia czasu, który by potrzebny do wygenerowania najnowszej klatki gry. Majc t informacj,
potrafimy zrealizowa automatyczne odliczanie w czasie rzeczywistym.
173
Projektowanie gier w rodowisku Unity 3.x
Nastpnie bdziemy musieli sprawdzi , czy zmienna licznika czasu, czyli doorTimer, osigna
okrelon warto . Oznacza to, e upyn pewien czas. Aby rozwiza ten problem, umiecimy
zagniedone polecenie if wewntrz tego, które ju stworzylimy. Bdzie ono sprawdzane
wycznie wtedy, gdy warunek if dla zmiennej doorIsOpen jest speniony.
Dodaj poniszy fragment kodu w istniejcym poleceniu if poniej wiersza, w którym nastpuje
zliczanie czasu:
Jzyk C# i JavaScript:
if(doorTimer > doorOpenTime){
ShutDoor();
doorTimer = 0.0f;
}
Powyszy kod bdzie zawsze uruchamiany, gdy warto zmiennej doorIsOpen stanie si równa
true. Jeli zmienna doorTimer okae si wiksza od wartoci doorOpenTime, wówczas bdzie
to znaczy , e upyny trzy sekundy czasu rzeczywistego. Wynika to std, i uywamy Time.
´deltaTime jako wartoci zwikszajcej licznik. Czas oczekiwania zmieni si oczywicie, gdy
w panelu Inspector przypiszesz zmiennej doorOpenTime inn warto ni 3, która jest domylnie
wprowadzona.
Gdy zmienna doorTimer stanie si wiksza od 3, zostanie wywoana funkcja ShutDoor(). Nastp-
nie zmienna doorTimer zostanie wyzerowana, dziki czemu bdzie moga zosta ponownie
uyta przy kolejnym otwarciu drzwi. Gdybymy nie uyli tej instrukcji, zmienna doorTimer
miaaby wci warto wiksz od 3, co spowodowaoby natychmiastowe zamknicie drzwi
po ich otwarciu.
Jak zapewne zauwaye, funkcja ShutDoor() jest bezparametrowa. Jest tak, gdy musimy dopiero
stworzy zmienn, w której bdziemy przechowywa odwoanie do drzwi biorcych udzia
w kolizji. Nie musielimy tego robi wczeniej, poniewa wywoanie funkcji OpenDoor() znajdo-
wao si wewntrz procedury wykrywania kolizji, w której dysponowalimy ju odwoaniem
do drzwi w postaci zapisu hit.gameObject.
Jzyk C#:
GameObject currentDoor;
Jzyk JavaScript:
private var currentDoor : GameObject;
174
Rozdzia 5. • Interakcje
Teraz wewntrz funkcji wykrywania kolizji dodaj wiersz, w którym przypiszesz warto hit.
´gameObject do nowo utworzonej zmiennej currentDoor, a nastpnie wywoasz procedur
OpenDoor():
Jzyk C#:
void OnControllerColliderHit(ControllerColliderHit hit){
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false){
currentDoor = hit.gameObject;
OpenDoor(currentDoor);
}
}
Jzyk JavaScript:
function OnControllerColliderHit(hit: ControllerColliderHit){
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false){
currentDoor = hit.gameObject;
OpenDoor(currentDoor);
}
}
Gdy stworzylimy ju zmienn, moemy jej uy jako argument wywoania ShutDoor() w funkcji
Update().
Jzyk C# i JavaScript:
ShutDoor(currentDoor);
Jzyk C#:
void Update () {
if(doorIsOpen){
doorTimer += Time.deltaTime;
Jzyk JavaScript:
function Update(){
if(doorIsOpen){
doorTimer += Time.deltaTime;
175
Projektowanie gier w rodowisku Unity 3.x
ShutDoor(currentDoor);
doorTimer = 0.0f;
}
}
}
Stwórz teraz funkcj ShutDoor() poniej istniejcej funkcji OpenDoor(). W tym celu umie kursor
po prawej stronie zamykajcego nawiasu klamrowego } i nacinij Enter. Poniewa dziaa ona
podobnie jak funkcja OpenDoor(), nie bdziemy jej dokadnie analizowa . Po prostu zwró
uwag na to, e uywamy innej animacji, a take przypisujemy zmiennej doorIsOpen ponownie
warto false, dziki czemu caa procedura moe si zacz od pocztku:
Jzyk C#:
void ShutDoor(GameObject door){
doorIsOpen = false;
door.audio.PlayOneShot(doorShutSound);
door.transform.parent.animation.Play("doorshut");
}
Jzyk JavaScript:
function ShutDoor(door : GameObject){
doorIsOpen = false;
door.audio.PlayOneShot(doorShutSound);
door.transform.parent.animation.Play("doorshut");
}
Nadszed czas na test! W edytorze MonoDevelop wybierz opcj menu File/Save (plik/zapisz),
a nastpnie wró do rodowiska Unity i przetestuj gr, tak jak poprzednio. Licznik czasu spo-
woduje, e otwarte drzwi zamkn si automatycznie po upywie trzech sekund.
Pielgnacja kodu
Jeli utworzylimy skrypt, który obsuguje otwieranie i zamykanie drzwi, moemy si zastanowi ,
w jaki sposób moglibymy wykorzysta nasz wiedz o konstruowaniu funkcji w celu usprawnie-
nia istniejcego kodu.
Mamy teraz dwie wasne funkcje — OpenDoor() i ShutDoor(). Wykonuj one te same trzy zada-
nia: odtwarzaj dwik, modyfikuj zmienn logiczn oraz wywietlaj animacj. Dlaczego nie
moglibymy stworzy pojedynczej funkcji z odpowiednimi argumentami, które pozwalayby
na odtwarzanie rónych dwików, przypisywanie do zmiennej logicznej wartoci true lub false,
a take wywietlanie okrelonych animacji? Przypisanie trzech zada do odpowiednich argu-
mentów pozwoli nam na rozwizanie powyszego problemu.
176
Rozdzia 5. • Interakcje
Jzyk C#:
void Door(AudioClip aClip, bool openCheck, string animName, GameObject
thisDoor){
thisDoor.audio.PlayOneShot(aClip);
doorIsOpen = openCheck;
thisDoor.transform.parent.animation.Play(animName);
}
Jzyk JavaScript:
function Door(aClip : AudioClip, openCheck : boolean, animName : String,
thisDoor : GameObject){
thisDoor.audio.PlayOneShot(aClip);
doorIsOpen = openCheck;
thisDoor.transform.parent.animation.Play(animName);
}
Moesz zauway , e powysza funkcja jest podobna do istniejcych funkcji OpenDoor i ShutDoor,
lecz w swojej deklaracji zawiera cztery argumenty: aClip, openCheck, animName i thisDoor. S one
w rzeczywistoci zmiennymi, które zostaj przypisane podczas wywoywania funkcji, a ich warto-
ci s uywane wewntrz niej. Na przykad, jeli chcielibymy przesa wartoci odpowiadajce
otwarciu drzwi, wywoalibymy funkcj z nastpujcymi parametrami:
Door(doorOpenSound, true, "dooropen", currentDoor);
Powyszy kod przekazuje zmienn doorOpenSound do argumentu aClip, warto true do argu-
mentu openCheck, acuch tekstowy dooropen do argumentu animName, a take przypisuje obiekt
gry (GameObject), zawarty w zmiennej currentDoor, do argumentu thisDoor.
Teraz moesz zmieni wywoanie funkcji OpenDoor(), znajdujce si wewntrz kodu wykrywa-
jcego kolizj. Najpierw usu poniszy wiersz, który wywouje funkcj OpenDoor() w funkcji
OnControllerColliderHit():
OpenDoor(currentDoor);
Jzyk C# i JavaScript:
Door(doorOpenSound, true, "dooropen", currentDoor);
Dziki temu uzyskalimy pojedyncz funkcj, która jest wywoywana z czterema argumentami:
177
Projektowanie gier w rodowisku Unity 3.x
Poniewa wykorzystujemy powysz metod nie tylko do otwierania, ale równie do zamykania
drzwi, powinnimy poprawi odpowiedni kod w funkcji Update(). Zlokalizuj instrukcj if, która
sprawdza, czy zmienna doorTimer jest wiksza od wartoci doorOpenTime. Wewntrz tej instrukcji
zamie wywoanie ShutDoor(currentDoor) na poniszy kod:
Jzyk C# i JavaScript:
Door(doorShutSound, false, "doorshut", currentDoor);
Moesz ju usun dwie pierwotne funkcje OpenDoor() i ShutDoor(), poniewa nowa funkcja
Door() cakowicie je zastpuje. Jeli tworzymy funkcj w opisany wyej sposób, nie stosujemy
powtarzajcego si kodu w skryptach, a przez to czynimy go bardziej zwizym, prostszym
do odczytania i debugowania. Poza tym oszczdzamy czas, który musielibymy powici
na napisanie dwóch rónych funkcji.
Jeli chciaby zachowa te dwie funkcje, by przypominay Ci, co zrobie, moesz je po prostu
zawrze w komentarzu — nie bd one ju wówczas wykonywalnym elementem skryptu.
Umie wic znaki /* przed pocztkiem funkcji OpenDoor(), a */ po zamykajcym nawiasie
klamrowym funkcji ShutDoor(). W edytorze bdziesz móg zauway , e kod, zamieniony w wie-
lowierszowy komentarz, zmieni swój kolor. Nastpnie upewnij si, e korzystajc z odpowiedniej
opcji menu programu MonoDevelop, zapisae swój skrypt.
Wró do rodowiska Unity i kliknij przycisk Play (granie), aby przetestowa gr. Powiniene teraz
widzie animacj otwierania i zamykania drzwi. Wci jednak istnieje problem zwizany z ude-
rzaniem w powikszony zderzacz.
Teraz zajmiemy si drugim z trzech zaplanowanych sposobów otwierania drzwi i uyjemy
rzucania promieni.
178
Rozdzia 5. • Interakcje
Upewnij si, e w edytorze jest otwarty skrypt PlayerCollisions, i zlokalizuj nastpujcy wiersz:
Jzyk C#:
void OnControllerColliderHit(ControllerColliderHit hit){
Jzyk JavaScript:
function OnControllerColliderHit(hit: ControllerColliderHit){
W rodowisku Unity kliknij przycisk Create, znajdujcy si w panelu Project. Nastpnie wybierz
odpowiadajcy Ci jzyk programowania. Zmie nazw nowo utworzonego skryptu na DoorManager
i wczytaj go do edytora MonoDevelop.
179
Projektowanie gier w rodowisku Unity 3.x
Zamierzamy teraz wykorzysta wikszo naszej logiki, zwizanej z obsug drzwi, ze skryptu
PlayerCollisions. Poniewa znamy ju zasad jego dziaania, umie jedynie cay poniszy kod
w nowym skrypcie DoorManager. Nastpnie omówimy istniejce rónice i zobaczymy, co zmie-
nio si w samym skrypcie PlayerCollisions.
Jzyk C#:
using UnityEngine;
using System.Collections;
void Start(){
doorTimer = 0.0f;
}
void Update(){
if(doorIsOpen){
doorTimer += Time.deltaTime;
if(doorTimer > doorOpenTime){
Door(doorShutSound, false, "doorshut");
doorTimer = 0.0f;
}
}
}
void DoorCheck(){
if(!doorIsOpen){
Door(doorOpenSound, true, "dooropen");
}
}
Jzyk JavaScript:
private var doorIsOpen : boolean = false;
private var doorTimer : float = 0.0f;
var doorOpenTime : float = 3.0f;
var doorOpenSound : AudioClip;
180
Rozdzia 5. • Interakcje
function Start(){
doorTimer = 0.0f;
}
function Update(){
if(doorIsOpen){
doorTimer += Time.deltaTime;
function DoorCheck(){
if(!doorIsOpen){
Door(doorOpenSound, true, "dooropen");
}
}
Kluczow zmian w porównaniu z kodem ze skryptu PlayerCollisions jest dodanie funkcji Door
´Check(). Dziki temu mamy procedur, która moe by w prosty sposób wywoywana i nie
wymaga przekazywania dodatkowego argumentu, sprawdzajcego, czy drzwi nie s otwarte:
if(!doorIsOpen){
Door(doorOpenSound, true, "dooropen");
}
Powyszy kod wywouje funkcj Door() i przekazuje jej odpowiednie argumenty, pozwalajce
na otwarcie drzwi. Licznik czasu w funkcji Update() umoliwia zamknicie drzwi i powrót
do stanu pierwotnego. Teraz powinnimy usun niepotrzebny kod ze skryptu PlayerCollisions,
a nastpnie zaimplementowa metod rzucania promieni.
181
Projektowanie gier w rodowisku Unity 3.x
Bez wzgldu na decyzj powiniene usun lub umieci w komentarzu takie fragmenty kodu
w skrypcie PlayerCollisions, aby pozostay tylko ponisze wiersze:
Jzyk C#:
using UnityEngine;
using System.Collections;
GameObject currentDoor;
void Update () {
}
}
Jzyk JavaScript:
private var currentDoor : GameObject;
function Update(){
Teraz mamy jedynie funkcj Update()— umiecimy w niej kod wykonujcy operacj rzucania
promieni, a take zmienn prywatn, przechowujc odwoanie do drzwi, na które oddziaujemy.
Dodajmy kod odpowiedzialny za rzucanie promieni, który bdzie wywoywany w funkcji Door
´Check(), zawartej w skrypcie DoorManager.
Rzucanie promienia
Bdc w dalszym cigu w skrypcie PlayerCollisions, umie kursor wewntrz funkcji Update().
Kod odpowiedzialny za rzucanie promieni umiecimy w funkcji Update(), poniewa musimy
z powodów technicznych wykonywa t operacj w kadej klatce. Wynika to std, e pooenie
i kierunek spogldania gracza mog si w kadej chwili zmieni . Dodaj do funkcji Update()
poniszy kod:
Jzyk C#:
RaycastHit hit;
182
Rozdzia 5. • Interakcje
Jzyk JavaScript:
var hit : RaycastHit;
Nastpnie pojawiaj si dwie instrukcje if. Nadrzdna instrukcja if jest odpowiedzialna za rzu-
canie promienia oraz uycie zmiennej, któr stworzylimy. Poniewa operacja rzucania promie-
nia (czyli funkcja Physics.Raycast()) bdzie wykonywana w nadrzdnym poleceniu if, dostp
do podrzdnej instrukcji if bdzie moliwy jedynie wówczas, gdy promie uderzy w obiekt.
Dziki temu poprawimy wydajno skryptu.
Zauwa, e w jzyku C# musimy uy sowa kluczowego out, umieszczonego przed zmienn
hit, aby odzyska warto , któr otrzymaa ona wewntrz funkcji Physics.Raycast(). W jzyku
JavaScript taka funkcjonalno jest domylna i wystarczy uy samej nazwy zmiennej.
Nastpnie mamy zagniedone polecenie if, które sprawdza przy uyciu zmiennej hit, czy
istniej jakie aktywne kolizje ze zderzaczami w wiecie gry, a dokadniej, czy zderzylimy si
ze zderzaczem, nalecym do obiektu charakteryzujcego si znacznikiem playerDoor:
hit.collider.gameObject.tag == "PlayerDoor"
183
Projektowanie gier w rodowisku Unity 3.x
Jeli oba warunki if s spenione, przypisujemy zmiennej currentDoor warto obiektu przecho-
wywanego w zmiennej hit, a nastpnie poleceniem systemowym SendMessage() wywoujemy
funkcj DoorCheck().
Poleceniem SendMessage moemy wywoa dowoln funkcj dla obiektu, nie odwoujc si jed-
noczenie do okrelonego skryptu, lecz uywajc jedynie jej nazwy:
currentDoor.SendMessage("DoorCheck");
Uwaga
Aby uzyska wicej informacji o funkcji SendMessage(), zapoznaj si z dokumentacj tworzenia
skryptów w rodowisku Unity, znajdujc si pod adresem: http://unity3d.com/support/documentation/
ScriptReference/GameObject.SendMessage.html.
Zapisz zmodyfikowany skrypt i wró do rodowiska Unity. Musimy jeszcze przypisa skrypt
DoorManager do drzwi. W tym celu upewnij si, i struktura obiektu nadrzdnego outPost jest
wywietlona w panelu Hierarchy, co powoduje, e widzimy obiekt podrzdny door. Przecignij
skrypt DoorManager z panelu Project na obiekt potomka door, znajdujcy si w panelu Hierarchy.
Podobnie jak zrobie to wczeniej w przypadku skryptu PlayerCollisions, przypisz klipy audio
door_open i door_shut do zmiennych publicznych komponentu skryptu DoorManager w panelu
Inspector.
Resetowanie zderzacza
Poniewa uywamy teraz metody rzucania promieni w kierunku spogldania gracza, nie potrze-
bujemy powikszonego zderzacza drzwi. Moemy mu wic przywróci standardowe rozmiary,
które odpowiadaj zawierajcej go siatce trójwymiarowej. Aby to zrobi , po prostu wybierz obiekt
podrzdny door w panelu Hierarchy, a nastpnie w komponencie Box Collider kliknij ikon
kóka zbatego, znajdujc si po prawej stronie. Z wywietlonego menu podrcznego wybierz
opcj Reset (resetuj).
A teraz przetestujmy gr w dziaaniu! Nacinij przycisk Play, znajdujcy si w górnej czci
interfejsu Unity, aby rozpocz test. Bdziesz móg zauway , e podczas zbliania si do drzwi
otwieraj si one nie tylko bez potrzeby uderzania w nie, ale równie wtedy, gdy zwracasz si
twarz do nich. Wynika to std, e promie wykrywajcy drzwi jest rysowany w tym samym
kierunku, w którym spoglda gracz.
Rzucanie promieni moe by uywane w rónych mechanikach gier w celu wykrywania, czy
jakie obiekty znajduj si w bliskiej odlegoci od zderzaczy lub le na ich linii widoku. Zale-
camy, aby po przeczytaniu tej ksiki spróbowa stworzy kilka prototypów gier na podstawie
184
Rozdzia 5. • Interakcje
Jednake, jak wspomniano wczeniej, powyszy sposób dziaania drzwi nie jest taki, jakiego
oczekujemy, gdy drzwi powinny po prostu wykrywa osob znajdujc si w ich pobliu.
Dobrymi przykadami takiego zachowania s cho by czujnik ruchu lub sensor antywamaniowy.
Z tego powodu zajmiemy si teraz rozwizaniem trzecim, które jest najbardziej odpowiednie,
by osign nasz cel, czyli otworzy drzwi. Bdzie to zastosowanie zderzacza wyzwalajcego.
Po zdefiniowaniu pooenia zderzacza moemy zastosowa niewielki skrypt, który uywa funkcji
OnTriggerEnter(). Jest ona odpowiedzialna za wykrywanie obiektów, pojawiajcych si w pobliu
zderzacza z aktywnym trybem wyzwalania. Moemy z niej skorzysta w celu wywoania tej samej
funkcji DoorCheck(), której uylimy w drugim rozwizaniu.
Powysze dziaania spowoduj, e skrypt PlayerCollisions stanie si bezuyteczny. Caa logika
obsugujca drzwi bdzie zawarta w obiekcie, który je reprezentuje. Takie rozwizanie jest
uwaane za waciwy wzorzec postpowania w trakcie projektowania gier.
Twój zderzacz skrzynkowy bdzie mia standardowy rozmiar zwykego szecianu (1, 1, 1).
W widoku Scene powinnimy uy metody przecigania z wykorzystaniem klawisza Shift, aby
185
Projektowanie gier w rodowisku Unity 3.x
zmieni jego wielko i pooenie. Moesz take zauway , e zosta on utworzony wewntrz
modelu outPost, a dokadniej na jego podstawie. Wynika to std, i w tym miejscu rozpoczynay
si osie wspórzdnych modelu w zewntrznej aplikacji, w której zosta on zaprojektowany.
Upewnij si, e wybrae narzdzie reprezentowane przez ikon rki (skrót klawiszowy Q),
poniewa pozwala ono na ukrycie uchwytów osi obiektu, co z kolei uatwia modyfikacj wielkoci
zderzacza. Przytrzymaj wcinity klawisz Shift, a nastpnie przecigaj punkty, znajdujce si
w widoku Scene na krawdziach zderzacza skrzynkowego, dopóki nie osigniesz rezultatu przed-
stawionego na nastpnym rysunku. Aby go uzyska , pomocne bdzie wybranie widoku prosto-
ktnego (z góry i z boku).
Teraz powinnimy zmodyfikowa sposób dziaania zderzacza. W tym celu w widoku Inspector
dla wybranego obiektu outPost zaznacz opcj Is Trigger (jest wyzwalaczem) w komponencie Box
Collider.
Zmie jego nazw na TriggerZone i otwórz w edytorze MonoDevelop. Nasz kod zostanie zasto-
sowany w obiekcie nadrzdnym outPost i bdzie bardzo prosty, poniewa musimy wykona
tylko ponisze czynnoci:
186
Rozdzia 5. • Interakcje
Widok z boku:
Widok perspektywiczny:
Jzyk C#:
void OnTriggerEnter(Collider col){
187
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
function OnTriggerEnter(col : Collider){
Powyszy kod wyglda znajomo, dziaa bowiem podobnie jak napisana wczeniej funkcja
OnControllerColliderHit(). Jednake odpowiednie informacje o obiekcie, z którym wystpuje
interakcja (zderzenie lub przecicie si zderzaczy), s przechowywane w zmiennej typu Collider.
T zmienn nazwalimy po prostu col.
Dziki temu moemy sprawdzi rodzaj obiektu, wykorzystujc instrukcj if. Dodaj poniszy
kod do funkcji OnTriggerEnter():
Jzyk C# i JavaScript:
if(col.gameObject.tag == "Player"){
transform.FindChild("door").SendMessage("DoorCheck");
}
W powyszym kodzie sprawdzamy, czy zderzacz naley do obiektu gry zawierajcego znacznik
Player1. Znacznik ten znajduje si w prefabrykacie First Person Controller, zaimportowanym
do rodowiska Unity. Powyszy kod moglibymy równie zapisa , wykorzystujc nazw hierar-
chiczn:
if(col.gameObject.name == "First Person Controller"){
Jednake uycie znacznika jest szybsze i bdzie poprawne nawet wówczas, gdy zmienimy nazw
prefabrykatu First Person Controller.
Gdy warunek if jest speniony, odszukujemy obiekt podrzdny door przy uyciu polecenia
transform.FindChild(). Jest ono sprawniejsze od instrukcji gameObject.Find(), poniewa
przeszukuje wycznie obiekty podrzdne wobec obiektu, do którego jest przypisany skrypt.
Funkcja gameObject.Find() dziaa duej, gdy przeszukuje ca hierarchi obiektów. Uycie
polecenia transform.FindChild() jest równie zalecane, w scenie mog si bowiem mieci
take inne budynki z drzwiami. Musimy by wic pewni, e wysyamy komunikat jedynie do
tego obiektu drzwi, w którego obszarze wyzwalania znajduje si gracz. Wreszcie, podobnie
jak poprzednio, wykorzystujemy funkcj SendMessage(), aby wywoa procedur DoorCheck(),
zawart w doczonym do obiektu drzwi skrypcie DoorManager.
1
Z powodu bdu w kodzie dostarczonym przez firm Unity Technologies prefabrykat First Person
Controller, który jest wykorzystywany w tej ksice, nie zawiera znacznika Player. Aby skrypt TriggerZone
dziaa prawidowo, w panelu Project przejd do katalogu Standard Assets/Character Controllers (standar-
dowe zasoby/kontrolery postaci) i kliknij prefabrykat First Person Controller, a nastpnie wybierz opcj
Player z menu Tag, znajdujcego si w panelu Inspector — przyp. tum.
188
Rozdzia 5. • Interakcje
Zapisz skrypt z poziomu edytora MonoDevelop, a nastpnie wró do rodowiska Unity, aby
doczy skrypt TriggerZone do obiektu outPost: przecignij go z panelu Project i upu na
nazwie outPost w panelu Hierarchy.
A teraz zagrajmy w gr! Wybierz opcj File/Save Scene (plik/zapisz scen) z menu gównego
i kliknij przycisk Play, aby przetestowa nowo utworzony obszar wyzwalania. Drzwi obiektu
outPost powinny si otwiera bez wzgldu na kierunek spogldania gracza, gdy tylko pojawi
si on w strefie wyzwalania. Jest to wic idealna metoda otwierania drzwi w naszej grze.
W sensie projektowym moemy j równie uwaa za poprawn, poniewa nie wykorzystuje ona
gracza do sprawdzania obiektów, z którymi si zderza. Obiekt outPost po prostu „wie”, e gdy
gracz zblia si do niego, musi otworzy drzwi.
Podsumowanie
W tym rozdziale przeanalizowalimy trzy metody, pozwalajce na wykrywanie interakcji zacho-
dzcych midzy obiektami w grach trójwymiarowych:
Q wykrywanie kolizji,
Q rzucanie promieni,
Q wyzwalajce wykrywanie kolizji.
Powysze trzy sposoby maj okrelone zastosowania, a ich znajomo jest podstawow umie-
jtnoci, której powiniene móc uywa w czasie przyszej pracy w rodowisku Unity.
189
Projektowanie gier w rodowisku Unity 3.x
190
6
Kolekcja,
inwentarz i HUD
192
Rozdzia 6. • Kolekcja, inwentarz i HUD
wskanik, jak i wywietlacz HUD bd sterowane skryptem Inventory, zawierajcym zestawy
rónych tekstur, które powinny by odpowiednio prezentowane w zalenoci od tego, ile ogniw
energetycznych zostao ju zgromadzonych.
Wreszcie nad drzwiami placówki umiecimy ródo wiata, które zmieni kolor z czerwonego
na zielony, gdy po zgromadzeniu odpowiedniej liczby ogniw energetycznych, pozwalajcych na
zasilenie generatora, drzwi zostan otwarte przez gracza.
193
Projektowanie gier w rodowisku Unity 3.x
Tworzenie prefabrykatu
ogniwa energetycznego
W tym podrozdziale uyjemy modelu ogniwa energetycznego, znajdujcego si w folderze Book
Assets (zasoby ksiki), który zosta wczeniej zaimportowany do rodowiska Unity. Zmodyfiku-
jemy go w widoku Scene (scena), a nastpnie przeksztacimy w prefabrykat, czyli szablon danych,
pozwalajcy na tworzenie instancji lub klonów danego obiektu. Jeli znasz rodowisko Adobe
Flash, moesz porówna t ide z koncepcj MovieClip, dziki której w czasie wykonywania
programu potrafisz tworzy wiele identycznych instancji wczeniej przygotowanego szablonu,
a take je modyfikowa .
Przecignij model powerCell z folderu Models, znajdujcego si w panelu Project, na widok
Scene. Nastpnie przemie kursor myszy nad widok Scene i nacinij klawisz F, aby przybliy
obiekt powerCell. Twoje ogniwo energetyczne mogo zosta umieszczone w dowolnym miejscu.
Zdefiniujemy dla niego waciwe pooenie, gdy tylko ukoczymy tworzenie prefabrykatu.
Oczywicie, jeli przecigne model powerCell na widok Scene w ten sposób, e koliduje on
z drzwiami, po prostu uyj narzdzia Translate (skrót klawiszowy W), aby przemieci go na
obszar, w którym moesz go dobrze widzie . Pamitaj, e zawsze masz moliwo nacinicia
klawisza F w celu przyblienia widoku wybranego obiektu.
194
Rozdzia 6. • Kolekcja, inwentarz i HUD
Panel Inspector (inspektor) zmieni wygld i wywietli obszar menedera znaczników. Jeli nie
widzisz listy znaczników, po prostu kliknij szar strzak, znajdujc si po lewej stronie nazwy
Tags. W pierwszym dostpnym polu Element umie znacznik o nazwie cell (ogniwo), jak
przedstawiono na poniszym rysunku:
Nacinij klawisz Enter, aby zatwierdzi wprowadzenie nazwy, ponownie zaznacz obiekt powerCell
w panelu Hierarchy, a wreszcie wybierz nazw cell z menu podrcznego Tag, znajdujcego si
w górnej czci widoku Inspector.
195
Projektowanie gier w rodowisku Unity 3.x
ma on ksztat przypominajcy obiekt powerCell. Nie chcemy jednak, aby gracz uderza w niego
podczas jego zbierania, wic powinnimy wczy w nim tryb wyzwalania. W tym celu w nowo
utworzonym komponencie Capsule Collider zaznacz opcj Is Trigger (jest wyzwalaczem).
Skalowanie zderzacza
Dowolny zderzacz prosty, przypisany w rodowisku Unity do obiektu, nie musi mie od razu
ustalonego rozmiaru lub pooenia. Te parametry mog zosta zmodyfikowane w widoku Scene
przy uyciu klawisza Shift podczas przecigania za pomoc myszy punktów, które znajduj si
na obrysie zderzacza, a take za pomoc ustawie jego komponentu w panelu Inspector. Zde-
rzacz kapsuowy, ze wzgldu na swój ksztat, zawiera dwa ustawienia: Radius (promie) i Height
(wysoko ). Pozwalaj one na jego lepsze dopasowanie do ksztatu obiektu powerCell. W polu
edycji Radius wprowad warto 0,3. Zderzacz wci bdzie wikszy ni obiekt powerCell, lecz
jest to waciwe rozwizanie, gdy uatwi ono podniesienie obiektu.
196
Rozdzia 6. • Kolekcja, inwentarz i HUD
Dziki temu uzyskujemy du sprawno dziaania, poniewa danym obiektem zarzdza sil-
nik fizyczny.
Jeli obiekt powerCell jest wci aktywny w panelu Hierarchy (hierarchia), wybierz opcj menu
gównego Component/Physics/Rigidbody (komponent/parametry fizyczne/brya sztywna).
W dodanym komponencie odznacz opcj wyboru Use Gravity (uyj grawitacji), a zaznacz Is
Kinematic (uyj kinematyki).
Kliknij folder Scripts (skrypty) w panelu Project (projekt), aby upewni si, e nowo tworzony
skrypt zostanie umieszczony dokadnie w tym miejscu. W panelu Project kliknij przycisk Create
(stwórz), a nastpnie wybierz jzyk C# lub JavaScript. Zmie nazw nowo utworzonego pliku
na PowerCell. Dwukrotnie kliknij jego ikon, by wczyta go do edytora.
Obracanie obiektu
Na samym pocztku skryptu, powyej funkcji Update(), stwórz zmienn rotationSpeed o typie
zmiennoprzecinkowym i przypisz jej warto 100,0. W tym celu wprowad poniszy kod:
Jzyk C#:
public float rotationSpeed = 100.0f;
Jzyk JavaScript:
var rotationSpeed : float = 100.0;
Uyjemy tej zmiennej w celu zdefiniowania prdkoci obracania si obiektu powerCell. Jest
ona publiczna, dlatego po przypisaniu skryptu do obiektu powerCell bdziemy mogli j mody-
fikowa w panelu Inspector (inspektor). Jako projektant lub grafik moesz mie do niej dostp
ju po napisaniu skryptu.
Wewntrz funkcji Update() umie ponisz instrukcj, która bdzie obraca obiektem powerCell
wokó osi Y z prdkoci obrotow równ wartoci zmiennej rotationSpeed:
Jzyk C#:
transform.Rotate(new Vector3(0,rotationSpeed * Time.deltaTime ,0));
197
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
transform.Rotate(Vector3(0,rotationSpeed * Time.deltaTime,0));
Aby przypisa skrypt do obiektu powerCell, po prostu przecignij go z panelu Project i upu
na odpowiedni nazw w panelu Hierarchy (hierarchia). Nastpnie wybierz obiekt, by upewni
si, czy skrypt pojawi si w obszarze Inspector.
Kliknij przycisk Play (granie), znajdujcy si w górnej czci interfejsu, i obserwuj obiekt
powerCell w widoku Scene (scena) lub Game (gra), jeli kamera obiektu First Person Controller
jest skierowana na niego, aby sprawdzi , e si obraca. Jeeli obracanie obiektu nie dziaa, wró
do edycji skryptu i upewnij si, e nie popenie adnych bdów. Oprócz tego sprawd, czy
przypisae skrypt do waciwego obiektu. Pamitaj, aby ponownie nacisn przycisk Play
w celu zakoczenia testów i powrotu do projektowania.
Jzyk C#:
void OnTriggerEnter(Collider col){
if(col.gameObject.tag == "Player"){
col.gameObject.SendMessage("CellPickup");
Destroy(gameObject);
}
}
Jzyk JavaScript:
function OnTriggerEnter(col : Collider){
if(col.gameObject.tag == "Player"){
col.gameObject.SendMessage("CellPickup");
Destroy(gameObject);
}
}
198
Rozdzia 6. • Kolekcja, inwentarz i HUD
Mamy tutaj do czynienia z podobn funkcj OnTriggerEnter(), której uywalimy ju w przy-
padku strefy wyzwalania placówki. Wewntrz funkcji umiecilimy instrukcj if, sprawdzajc,
czy obiekt biorcy udzia w kolizji zawiera znacznik o nazwie Player.
Jeli ten warunek jest speniony, wywoujemy funkcj CellPickup(), któr dopiero napiszemy.
Zostanie ona umieszczona w skrypcie Inventory, przypisanym do postaci gracza.
Wreszcie obiekt powerCell jest usuwany ze sceny poleceniem Destroy(). Pamitaj, e ta instruk-
cja powinna zawsze znajdowa si na kocu funkcji, gdy musimy by pewni, e inne polecenia
zostan poprawnie wykonane.
Zapamitaj skrypt i wró do rodowiska Unity. Kliknij przycisk Play (granie), aby przetestowa
gr, a nastpnie przemie posta gracza w kierunku obiektu powerCell. Po zetkniciu si
z nim na pasku konsoli rodowiska Unity, znajdujcym si w lewym dolnym obszarze okna,
powinna pojawi si informacja o bdzie, zaprezentowana na poniszym rysunku:
Ten bd by przez nas oczekiwany, poniewa nie napisalimy jeszcze skryptu, który powinien
zawiera funkcj CellPickup(). rodowisko Unity ostrzega nas, e chocia sam kod jest poprawny,
jednak wysyany komunikat nie zosta odebrany przez aden obiekt. Teraz zapamitamy obiekt
powerCell w postaci prefabrykatu, a nastpnie zajmiemy si tworzeniem skryptu Inventory.
Dziki temu gracz bdzie dysponowa miejscem do przechowywania informacji o kadym zebra-
nym ogniwie energetycznym.
199
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Powielane obiekty pojawiaj si w scenie zawsze w tym samym pooeniu. Nie powinno Ci to jednak
wprowadza w zakopotanie. Takie dziaanie wynika z przyjtego standardu, dotyczcego lokalizacji
nowo tworzonych obiektów. Pamitaj, e kady z nich zawiera takie same ustawienia jak obiekt ródowy,
wcznie z pooeniem. Ponadto atwiej zapamita, e lokalizacja powstaego obiektu jest taka sama
jak jego oryginau. Naley go pó niej po prostu przemieci we waciwe miejsce.
Teraz w panelu Hierarchy wybierz po kolei kady z obiektów powerCell, a nastpnie uyj narz-
dzia Translate (skrót klawiszowy W), aby umieci ogniwa energetyczne wokó obiektu outPost.
Pamitaj, e moesz uy gadetu widoku, znajdujcego si w prawym górnym naroniku okna
Scene (scena), by zmieni sposób spogldania na wiat gry z perspektywicznego na widok z góry,
z dou lub z boku. Upewnij si, e ogniwa energetyczne s umieszczane na waciwej wysoko-
ci. Nie powinny si znajdowa zbyt wysoko ani zbyt nisko, co powodowaoby, e gracz zbieraby
je za pomoc nóg!
Gdy rozmiecie ju cztery ogniwa energetyczne wokó obiektu outPost, wygld jego otocze-
nia powinien przypomina poniszy rysunek. Zwró uwag, e zaznaczono na nim wszystkie
cztery obiekty powerCell znajdujce si w panelu Hierarchy, aby zaprezentowa ich pooenie
i zdefiniowane zderzacze.
Inwentarz gracza
W tym podrozdziale stworzymy skrypt, który bdzie przechowywa informacje o elementach
zebranych przez gracza w grze. S nimi ogniwa energetyczne, suce do zasilania drzwi, oraz
pudeko zapaek, pozwalajce na rozpalenie ognia.
Informacje o inwentarzu zapiszemy w obiekcie gracza. Dziki temu inne obiekty bd mogy
wysya zapytania do zwizanego z nim skryptu Inventory. Na przykad w dalszej czci ksiki
stworzymy trójwymiarowy model generatora, który bdzie wywietla biecy stan zasilania
drzwi, wykorzystujc w tym celu dane z tego skryptu.
200
Rozdzia 6. • Kolekcja, inwentarz i HUD
Wybierz folder Scripts (skrypty), znajdujcy si w panelu Project (projekt), a nastpnie kliknij
przycisk Create (stwórz) i wybierz odpowiedni jzyk skryptowy. Zmie nazw nowo utworzonego
skryptu na Inventory oraz uruchom edytor MonoDevelop.
Jzyk C#:
public static int charge = 0;
Jzyk JavaScript:
static var charge : int = 0;
201
Projektowanie gier w rodowisku Unity 3.x
informacja jest dostpna globalnie. W zwizku z tym inne skrypty mog jej uywa poprzez
zwyke odwoanie si do niej, na przykad:
if(Inventory.charge == 4){
Dziki temu bdziemy mogli sprawdzi warto zmiennej charge w stworzonym wczeniej
skrypcie TriggerZone, aby nie zezwoli na wejcie do obiektu outPost, jeli uytkownik zgroma-
dzi mniej ni cztery ogniwa energetyczne. Skrypt TriggerZone zostanie odpowiednio zmody-
fikowany po utworzeniu skryptu Inventory.
Jzyk C#:
void Start () {
charge = 0;
}
Jzyk JavaScript:
function Start () {
charge = 0;
}
Efekt d wikowy
Oprócz zmiennej charge w skrypcie umiecimy take inn zmienn publiczn, która bdzie
odpowiada za efekt dwikowy odtwarzany podczas zbierania ogniw energetycznych:
Jzyk C#:
public AudioClip collectSound;
Jzyk JavaScript:
var collectSound : AudioClip;
202
Rozdzia 6. • Kolekcja, inwentarz i HUD
Jzyk C#:
void CellPickup(){
AudioSource.PlayClipAtPoint(collectSound, transform.position);
charge++;
}
Jzyk JavaScript:
function CellPickup(){
AudioSource.PlayClipAtPoint(collectSound, transform.position);
charge++;
}
Twój obiekt First Person Controller powinien teraz zawiera komponent Inventory (Script),
a zmienna publiczna collectSound, reprezentujca klip audio, powinna by widoczna w panelu
Inspector. Rozwi folder Book Assets/Sounds (zasoby ksiki/dwiki) w panelu Project, a nastp-
nie przecignij klip cell_collected na t zmienn.
A teraz przetestujmy nasz skrypt! Poniewa nie zdefiniowalimy jeszcze strefy wyzwalania,
zalenej od wartoci poziomu zasilania, zobaczymy jedynie, e w czasie zbierania ogniw ener-
getycznych nie bdzie si ju pojawia bd SendMessage has no receiver (nie zdefiniowano
odbiorcy dla funkcji SendMessage). Powiniene take sysze dwik towarzyszcy tej czynnoci.
Kliknij przycisk Play (granie), aby si upewni , e skrypt dziaa prawidowo. Jak zwykle po
zakoczeniu testowania ponownie nacinij przycisk Play, by wróci do fazy projektowania.
203
Projektowanie gier w rodowisku Unity 3.x
W tym celu stwórzmy najpierw odpowiedni kod, a nastpnie umie my na ekranie dwa wska-
niki wizualne.
Tekstura tworzca dwuwymiarowy wywietlacz HUD bdzie pochodn klasy GUITexture. Jej
wygld powinien by zaleny od wartoci zmiennej charge, znajdujcej si w skrypcie Inventory.
Kolejna tekstura, tworzca model generatora, który zostanie umieszczony obok drzwi placówki,
równie bdzie si zmienia w zalenoci od wartoci zmiennej charge.
204
Rozdzia 6. • Kolekcja, inwentarz i HUD
razem, gdy gracz zbliy si do drzwi, odczytywaa warto zmiennej charge, znajdujcej si
w skrypcie Inventory.
Sprawmy, by drzwi otwieray si jedynie wówczas, gdy gracz zgromadzi cztery ogniwa energe-
tyczne. Odszukaj skrypt TriggerZone w panelu Project (projekt), a nastpnie wczytaj go do edytora
MonoDevelop lub innego, uywanego przez Ciebie.
Jzyk C# i JavaScript:
if(col.gameObject.tag == "Player"){
if(Inventory.charge == 4){
transform.FindChild("door").SendMessage("DoorCheck");
}else{
}
}
Zapamitaj swój skrypt i wró do rodowiska Unity, abymy mogli przetestowa utworzony
kod. Kliknij przycisk Play i upewnij si, e drzwi si nie otwieraj, zanim nie zgromadzisz
wszystkich czterech ogniw energetycznych.
Wywietlacz HUD
dla ogniwa energetycznego
Poniewa stworzylimy ju inwentarz zebranych ogniw energetycznych, powinnimy teraz przed-
stawi graczowi wizualn reprezentacj tego, co zostao zgromadzone. Tekstury, zaimportowane
z folderu Book Assets (zasoby ksiki), zostay zaprojektowane w taki sposób, aby wyranie infor-
mowa , e gracz musi zgromadzi cztery ogniwa energetyczne w celu uzyskania penego zasi-
lania drzwi. Poprzez zamian tekstury, symbolizujcej nienaadowane ogniwo, na grafik, która
prezentuje kolejno jedn czwart maksymalnego poziomu naadowania, nastpnie dwie czwarte
itd., moemy stworzy iluzj elementu o dynamicznym interfejsie. Zostao to przedstawione na
poniszym rysunku:
205
Projektowanie gier w rodowisku Unity 3.x
Folder Book Assets/Textures (zasoby ksiki/tekstury) zawiera pi plików graficznych, które s
niezbdne do stworzenia wywietlacza HUD, opartego na teksturach. W jednym z nich znaj-
duje si grafika nienaadowanego ogniwa energetycznego, a w pozostaych — grafika kolejnych
etapów jego adowania. Zostay one stworzone za pomoc programu Adobe Photoshop z zasto-
sowaniem przezroczystego ta, a nastpnie zapamitane w formacie PNG (Portable Network
Graphics). Wybrano go, poniewa pozwala na kompresj danych, a jednoczenie wspiera wy-
sokiej jakoci kanay alfa. Oprócz zwykych kanaów, zwizanych z kolorem czerwonym, zie-
lonym i niebieskim, w obrazach wykorzystuje si kanay alfa, które reprezentuj okrelony
poziom ich przezroczystoci.
Aby stworzy graficzny interfejs uytkownika, który bdzie wywietla poziom naadowania ogniwa
energetycznego, powinnimy rozpocz od umieszczenia w scenie grafiki prezentujcej nienaa-
dowan bateri. W tym celu wykorzystamy komponent rodowiska Unity o nazwie GUITexture.
W panelu Project (projekt) rozwi folder Textures (tekstury), znajdujcy si wewntrz folderu
Book Assets, a nastpnie wybierz plik o nazwie hud_nocharge.
Zamiast uy standardowej metody przecigania i upuszczania zasobów w widoku Scene (scena),
utworzymy nowy obiekt z komponentem GUITexture i przypiszemy mu tekstur hud_nocharge.
Kliknij menu Texture Type (rodzaj tekstury) i wybierz opcj GUI (graficzny interfejs uytkow-
nika) zamiast domylnej Texture (tekstura). Spowoduje to, e rodowisko Unity, uywajc tekstury
jako elementu GUI, wywietli j przy wykorzystaniu pierwotnej perspektywy widoku.
Zostanie utworzony nowy obiekt, który bdzie zawiera komponent GUITexture. Pola Width (sze-
roko ) i Height (wysoko ) parametru Pixel Inset (wstawka pikselowa) zawieraj ju odpowiednie
wartoci, wynikajce z wymiarów wybranej tekstury.
206
Rozdzia 6. • Kolekcja, inwentarz i HUD
Pola Pixel Inset definiuj rozmiary obiektu i jego obszar wywietlania. Zazwyczaj parametry
Width i Height odpowiadaj oryginalnym rozmiarom pliku tekstury, natomiast X i Y s równe
poowie ich wartoci. Inicjalizacja tych pól zostaje automatycznie przeprowadzona przez rodo-
wisko Unity podczas wybierania tekstury w panelu Project, przy czym wartoci X i Y okrelaj
punkt rejestracji, znajdujcy si na jej rodku.
Uwaga
Poprzez okrelenie elementu graficznego, którego chcesz uy w pierwszej kolejnoci, rodowisko Unity
zostaje poinformowane, e podczas tworzenia nowego obiektu z komponentem GUITexture naley
równie wykorzysta ten plik jako tekstur i wypeni pola odpowiedzialne za jej rozmiary.
Po wybraniu elementu graficznego, a nastpnie utworzeniu obiektu GUITexture za pomoc gównego
menu ze wzgldu na wygod jego nazwa jest uzyskiwana na podstawie uywanego zasobu tekstury.
Pamitaj o tym, gdy pomoe Ci to w wyszukiwaniu obiektów w panelu Hierarchy ju po ich utworzeniu.
207
Projektowanie gier w rodowisku Unity 3.x
Teraz Twoja tekstura, wywietlana w widoku Game (gra), powinna si znajdowa w lewym dol-
nym naroniku okna.
Moesz take wywietli szczegóy obiektu dwuwymiarowego w widoku Scene, klikajc przycisk
Game Overlay (warstwy gry).
208
Rozdzia 6. • Kolekcja, inwentarz i HUD
Tablice
Tablice s kontenerami danych, które zawieraj wiele wartoci. Moesz je uwaa za zmienne
przechowujce wiele wartoci. S one uporzdkowane za pomoc indeksu, czyli liczby wska-
zujcej pooenie elementu w tablicy. Jest on podobny do identyfikatora rekordu w tablicy
bazy danych. Liczba przechowywanych elementów jest zwana dugoci tablicy. Tablice pod-
stawowe mog by poszerzane w panelu Inspector — modyfikuje si w tym celu parametr Size
(rozmiar) (uyjemy go za chwil), lecz z punktu widzenia programisty ich rozmiar jest tylko do
odczytu i nie moe zosta zmodyfikowany w skrypcie.
Deklarowanie tablicy jest podobne do deklarowania zmiennej: naley poda jej nazw i typ.
Rónica polega na uyciu nawiasów kwadratowych, które definiuj zmienn jako tablic. Na
przykad jeli chcielibymy utworzy tablic obiektów gry reprezentujcych wrogów, mogli-
bymy uy poniszego fragmentu kodu:
Jzyk C#:
public GameObject[] enemies;
Jzyk JavaScript:
var enemies : GameObject[];
Nastpnie trzeba ustali rozmiar tablicy w panelu Inspector oraz przypisa do niej obiekty. Na
poniszym rysunku przedstawiono widok panelu Inspector, w którym podano rozmiar tablicy
równy 3:
Przeciganie z panelu Hierarchy lub Project jest operacj suc do przypisywania obiektów
do okrelonych pozycji tablicy. W tym celu moemy take wykorzysta skrypt. Obiekty mog
by przypisywane do tablicy poprzez zdefiniowanie okrelonej pozycji wewntrz niej. Na
przykad, jeli chcielibymy umieci obiekt gry na trzeciej pozycji w tablicy, uylibymy poni-
szego kodu:
enemies[2] = gameObject;
Zapewne zauwaye, e indeksy tablicy rozpoczynaj si od wartoci zero, dlatego trzecia
pozycja w powyszym przykadzie jest w rzeczywistoci indeksem numer 2. Jeli chciaby uy
indeksu, który nie istnieje, rodowisko Unity wywietlioby bd Index is Out of Range (indeks
poza zakresem) — oznacza to, e zastosowano liczb, która przekracza biec dugo tablicy.
209
Projektowanie gier w rodowisku Unity 3.x
Otwórz skrypt Inventory i umie kursor w nowym wierszu, zaraz pod zmienn collectSound.
Jzyk C#:
// HUD
public Texture2D[] hudCharge;
public GUITexture chargeHudGUI;
Jzyk JavaScript:
// HUD
var hudCharge : Texture2D[];
var chargeHudGUI : GUITexture;
Po komentarzu, który informuje nas, e poniszy kod obsuguje wywietlacz HUD, nastpuje
deklaracja tablicy hudCharge o typie Texture2D i dostpie publicznym. Dalej zostaa zadeklaro-
wana zmienna publiczna chargeHudGUI o typie GUITexture. Uyjemy jej w celu odwoania si
do obiektu PowerGUI, dziki czemu skrypt bdzie móg bezporednio przypisa waciwo texture
komponentu GUITexture do innej tekstury.
210
Rozdzia 6. • Kolekcja, inwentarz i HUD
Warto Size (rozmiar) równa 0 oznacza, e tablica nie zawiera adnych elementów. Przypisz jej
warto 5, co spowoduje, e niej pojawi si pola oznaczone jako Element 0 do Element 4, obok
których bdzie widoczny ich typ Texture2D.
W folderze Book Assets/Textures znajdziesz tekstury, których nazwy rozpoczynaj si od cigu
znaków hud_charge. Uywajc metody „przecignij i upu ”, przypisz te tekstury do odpowied-
nich pozycji tablicy, pamitaj jednoczenie, e skadnik Element 0 powinien uywa elementu
hud_nocharge.
Nastpnie przypisz obiekt PowerGUI z panelu Hierarchy do zmiennej Charge Hud GUI, co spowo-
duje, e komponent bdzie wyglda tak jak na poniszym rysunku:
Wró my do kodu i uyjmy wartoci zmiennej charge, by wybra odpowiedni tekstur z tablicy
dla obiektu PowerGUI.
W skrypcie Inventory umie poniszy wiersz kodu wewntrz istniejcej funkcji CellPickup():
Jzyk C# i JavaScript:
chargeHudGUI.texture = hudCharge[charge];
Przetestujmy gr! Kliknij przycisk Play (granie) i rozpocznij zbieranie ogniw energetycznych.
Obserwuj jednoczenie, czy wywietlacz PowerGUI wywietla za kadym razem inn tekstur.
Nacinij przycisk Play ponownie, by przerwa testowanie.
211
Projektowanie gier w rodowisku Unity 3.x
1. Gdy gracz pojawia si w strefie wyzwalania bez adnych ogniw energetycznych.
2. Gdy gracz podnosi ogniwo energetyczne, lecz nie pojawia si w strefie wyzwalania.
Teraz zajmiemy si pierwszym przypadkiem: gracz pojawia si w strefie wyzwalania, ale nie ma
przy sobie adnych ogniw energetycznych. Przypadek powinien zosta obsuony przez instruk-
cj else w skrypcie TriggerZone. Otwórz ten skrypt w edytorze.
Gdy gracz wkracza w obszar wyzwalania, lecz nie moe otworzy drzwi, powinien si dowie-
dzie , e wymagane jest ródo zasilania. W tym celu odtworzymy odpowiedni klip dwikowy,
który poinformuje, e drzwi nie mog zosta otwarte bez dziaajcego generatora. Nastpnie
wywietlimy obiekt PowerGUI, prezentujcy nienaadowane ogniwo energetyczne.
Powyej funkcji OnTriggerEnter() umie zmienn publiczn, która bdzie zawiera klip
dwikowy reprezentujcy zamknite drzwi:
Jzyk C#:
public AudioClip lockedSound;
Jzyk JavaScript:
var lockedSound : AudioClip;
Jzyk C# i JavaScript:
transform.FindChild("door").audio.PlayOneShot(lockedSound);
col.gameObject.SendMessage("HUDon");
Wykorzystujemy tu dwa inne elementy — door, który naley do obiektu nadrzdnego outPost,
oraz obiekt Player (First Person Controller), poniewa jest on przechowywany w polu col.
´gameObject. Do obiektu door odwoujemy si, tak jak poprzednio, za pomoc funkcji Find
´Child(). Nastpnie wykorzystujemy jego komponent AudioSource, aby odtworzy dwik
lockedSound. Wreszcie wykonujemy procedur SendMessage(), by wywoa now funkcj HUDon(),
któr wkrótce umiecimy w skrypcie Inventory.
Bdzie ona po prostu sprawdza , czy wywietlacz PowerGUI jest wczony. Jeli nie, nastpi jego
aktywacja poprzez ponowne przyczenie komponentu. Funkcj t umiecimy w skrypcie
Inventory, poniewa zawiera on ju odwoanie do obiektu PowerGUI.
212
Rozdzia 6. • Kolekcja, inwentarz i HUD
Zapamitaj skrypt TriggerZone, a nastpnie jeszcze raz otwórz skrypt Inventory lub przejd
do odpowiedniej zakadki w swoim edytorze.
Jzyk C#:
void HUDon(){
if(!chargeHudGUI.enabled){
chargeHudGUI.enabled = true;
}
}
Jzyk JavaScript:
function HUDon(){
if(!chargeHudGUI.enabled){
chargeHudGUI.enabled = true;
}
}
A teraz zajmijmy si przypadkiem wczania wywietlacza HUD, gdy gracz najpierw podnosi
ogniwo energetyczne. Wiemy ju, e ta czynno jest obsugiwana przez procedur CellPickup(),
dlatego wewntrz niej wywoamy po prostu funkcj HUDon(), zamiast umieszcza w kodzie
kolejn instrukcj if. Wprowad poniszy kod na pocztku funkcji CellPickup():
Jzyk C# i JavaScript:
HUDon();
Kod ten sprawdza stan wywietlacza w przypadku, gdy gracz najpierw podnosi ogniwo energe-
tyczne. Zapamitaj skrypt i wró do rodowiska Unity, aby przetestowa dziaanie wywietlacza
HUD w rónych okolicznociach.
213
Projektowanie gier w rodowisku Unity 3.x
Przed rozpoczciem testów wybierz obiekt nadrzdny outPost, a nastpnie przypisz klip audio
door_locked, znajdujcy si w folderze Book Assets/Sounds w panelu Project, do zmiennej
publicznej Locked Sound, dostpnej w komponencie Trigger Zone (Script).
Kliknij przycisk Play, aby rozpocz testowanie gry, a w dalszej kolejnoci upewnij si, e
w przypadku pojawienia si w strefie wyzwalania bez ogniw energetycznych wywietlacz HUD
zostaje wczony i sycha dwik wiadczcy o zamknitych drzwiach. Po wykonaniu tego testu
ponownie uruchom gr (kliknij przycisk Play, aby wyj z trybu testowania, a póniej nacinij go
jeszcze raz), by sprawdzi , czy podniesienie ogniwa energetycznego bez wchodzenia do obszaru
wyzwalania równie powoduje wczenie wywietlacza HUD.
Gdy sprawdzisz poprawne dziaanie mechaniki gry, zapamitaj scen poprzez wybranie opcji
menu gównego File/Save Scene (plik/zapisz scen). Teraz umiecimy w scenie generator, pre-
zentujcy taki sam poziom zasilania jak wywietlacz HUD, przez co poczymy go wizualnie
z obiektem outPost.
W podfolderze Models (modele) folderu Book Assets, znajdujcym si w panelu Project, odszu-
kaj model o nazwie generator, a nastpnie przecignij go na widok Scene i umie przy placówce.
Obró go o 180 stopni wokó osi Y: wprowad warto 180 w polu Rotation Y (obrót w osi Y)
komponentu Transform, znajdujcego si w panelu Inspector.
Nastpnie uyj narzdzia Translate, aby umieci generator przy cianie placówki, po prawej
stronie schodów.
214
Rozdzia 6. • Kolekcja, inwentarz i HUD
Rozwi obiekt nadrzdny generator w panelu Hierarchy, aby wywietli jego obiekty podrzdne
chargeMeter i generator. Wybierz obiekt potomny generator (patrz poniszy rysunek), a nastp-
nie uyj opcji menu gównego Component/Physics/Box Collider (komponent/parametry
fizyczne/zderzacz skrzynkowy), by upewni si, e gracz nie moe przej przez generator.
Poniewa obiekt ten jest niezalenym potomkiem obiektu generator, operacja zmiany tekstur
bdzie znacznie atwiejsza.
Jeszcze raz wczytaj skrypt Inventory do edytora lub wybierz odpowiedni zakadk, jeli jest ju
uruchomiony. Nastpnie umie poniszy kod pod deklaracj tablicy dla wywietlacza HUD
oraz zmiennej typu GUITexture:
215
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
// Generator
public Texture2D[] meterCharge;
public Renderer meter;
Jzyk JavaScript:
// Generator
var meterCharge : Texture2D[];
var meter : Renderer;
Dwuwymiarowe tekstury bd modyfikowa cay panel chargeMeter, podobnie jak ma to miejsce
w przypadku obiektu PowerGUI, który zmienia ca tekstur, aby wywietli nowy stan zasilania.
Tak jak poprzednio w panelu Inspector przypiszemy parametrowi dugoci tablicy warto 5,
a nastpnie kademu jej elementowi przyporzdkujemy tekstury z folderu Book Assets/Textures.
Zanim to jednak zrobimy, dodamy kod, który podmienia tekstury w trakcie dziaania gry.
W funkcji CellPickup() po istniejcym wierszu chargeHudGUI.texture = hudCharge[charge];
umie poniszy fragment kodu:
Jzyk C# i JavaScript:
meter.material.mainTexture = meterCharge[charge];
Zapamitaj skrypt i wró do rodowiska Unity. Wybierz obiekt First Person Controller, aby
wywietli komponent Inventory (Script) w panelu Inspector.
Rozwi nowo utworzon tablic Meter Charge poprzez kliknicie szarej strzaki, znajdujcej si
po lewej stronie nazwy, a nastpnie przypisz parametrowi Size (rozmiar) warto 5. Podobnie
jak miao to miejsce w przypadku poprzedniej tablicy, zostan wywietlone nazwy jej piciu
elementów.
216
Rozdzia 6. • Kolekcja, inwentarz i HUD
W folderze Book Assets/Textures, znajdujcym si w panelu Project, zlokalizuj tekstury, których
nazwy zaczynaj si od sowa meter_charge. Przypisz je do odpowiednich elementów tablicy
Meter Charge. Nastpnie przecignij obiekt podrzdny chargeMeter, nalecy do obiektu generator,
z panelu Hierarchy do zmiennej Meter, tak jak zaprezentowano na poniszym rysunku:
Poniewa kod jest ju gotowy, a tablica oraz zmienne zostay odpowiednio przypisane, wybierz
opcj menu gównego File/Save Scene (plik/zapisz scen), aby zapamita biecy stan projektu.
Kliknij przycisk Play, aby przetestowa dziaanie gry. Sprawd, czy podczas podnoszenia
ogniw energetycznych miernik poziomu zasilania generatora wywietla odpowiedni tekstur,
informujc uytkownika, ile elementów zostao ju zgromadzonych. Ponownie nacinij przycisk
Play, eby zakoczy test.
Q Usun wywietlacz HUD dla obiektu PowerGUI, gdy gracz nie musi ju wiedzie ,
e zebra wszystkie ogniwa energetyczne. Ukrycie wywietlacza bdzie informacj
dla gracza, i ogniwa zostay poprawnie wykorzystane.
Q Zmieni kolor wiata. Nad drzwiami umiecimy owietlenie, które zmieni kolor
z czerwonego na zielony, aby poinformowa o otwarciu drzwi.
217
Projektowanie gier w rodowisku Unity 3.x
Przed dodaniem róda wiata przygotujmy widok w oknie Scene w taki sposób, aby przypo-
mina ten, który wida na powyszym rysunku. Pomoe nam to w odpowiednim umiejscowieniu
dodawanego róda wiata, poniewa kady nowy obiekt tworzony w rodowisku Unity jest
umieszczany w centrum widoku.
Kliknij przycisk Create w panelu Hierarchy, a nastpnie wybierz opcj Point Light (wiato
punktowe) z menu rozwijanego. Zmie nazw nowo utworzonego obiektu na Door Light. Zanim
umiecisz wiato w odpowiednim miejscu, zmodyfikuj jego intensywno i zakres. W kom-
ponencie Light, nalecym do obiektu Door Light, przypisz pozycji Range (zasig) warto 1,2.
Dla parametru Color (kolor) wybierz barw czerwon poprzez kliknicie prostoktnego obszaru
koloru i wskazanie jakiego odcienia czerwieni z okna wyboru koloru. Wreszcie w polu Intensity
(intensywno ) wprowad warto 3, dziki czemu ródo wiata bdzie miao krótki zasig, lecz
wysok jaskrawo .
Teraz uyj narzdzia Translate (skrót klawiszowy W), aby umieci ródo wiata zgodnie
z poprzednim rysunkiem.
218
Rozdzia 6. • Kolekcja, inwentarz i HUD
Jzyk C#:
public Light doorLight;
Jzyk JavaScript:
var doorLight : Light;
Mamy ju zmienn, dziki której moemy sterowa wiatem. Odpowiedni obiekt Door Light
zostanie przypisany do niej w póniejszym czasie. Teraz zlokalizuj zagniedon instrukcj if,
znajdujc si wewntrz gównego polecenia if w funkcji OnTriggerEnter():
if(Inventory.charge == 4){
transform.FindChild("door").SendMessage("DoorCheck");
}
Jest to fragment skryptu wykonywany w momencie, gdy drzwi s otwierane, po zebraniu przez
gracza wszystkich ogniw energetycznych. W tym wanie miejscu powinnimy sprawdzi ,
czy gracz próbuje otwiera drzwi po raz pierwszy, a póniej wykona dwie akcje, o których
pisalimy wczeniej.
Jzyk C# i JavaScript:
if(GameObject.Find("PowerGUI")){
Destroy(GameObject.Find("PowerGUI"));
doorLight.color = Color.green;
}
Powyszy kod jest zawarty w gównej instrukcji if, która zapewnia to, e gracz zebra wszystkie
cztery ogniwa energetyczne. Moemy wic zaoy , e jest to waciwy moment na usunicie
obiektu PowerGUI, dlatego te w warunku if nastpuje sprawdzenie, czy on istnieje.
219
Projektowanie gier w rodowisku Unity 3.x
Tego typu uproszczone wartoci s zdefiniowane dla wszystkich gównych kolorów. Moesz
take uywa zapisu RGB, reprezentujcego wszystkie trzy podstawowe kanay kolorów (czer-
wony, zielony, niebieski). Aby dowiedzie si wicej o tym zagadnieniu, zapoznaj si z doku-
mentacj tworzenia skryptów w rodowisku Unity: http://unity3d.com/support/documentation/
ScriptReference/Color.html.
Zapisz swój skrypt i wró do rodowiska Unity. Poniewa utworzylimy zmienn publiczn,
która reprezentuje obiekt Door Light, powinnimy j odpowiednio zainicjalizowa przed
kontynuowaniem dziaa. W tym celu wybierz obiekt outPost w panelu Hierarchy, a nastpnie
sprawd, czy zmienna publiczna Door Light pojawia si w komponencie Trigger Zone (Script)
w panelu Inspector. Jeli wszystko jest w porzdku, przecignij obiekt Door Light z panelu
Hierarchy na t zmienn.
Wreszcie kliknij przycisk Play i postaraj si zgromadzi cztery ogniwa energetyczne, pozwa-
lajce na zasilanie generatora sucego do otwierania drzwi. Gdy zbierzesz ju wszystkie,
podejd do drzwi obiektu outPost. Powinno to spowodowa ich otwarcie, wyczenie wywie-
tlacza PowerGUI oraz zmian koloru owietlenia z czerwonego na zielony.
Ponownie nacinij przycisk Play, aby zakoczy testy, a nastpnie zapisz biecy stan projektu
Unity, wybierajc opcj menu gównego File/Save Scene.
Postaramy si teraz wywietli dodatkow wskazówk dla gracza w postaci tekstu na ekranie.
Zrobimy to w stylu klasycznych gier przygodowych: uyjemy wewntrznego monologu, za pomoc
którego posta w grze rozmawia z graczem.
220
Rozdzia 6. • Kolekcja, inwentarz i HUD
Na tym etapie wane jest take zastanowienie si, w jakiej formie bdziemy przemawia do
gracza. Oczywicie moglibymy po prostu napisa : „Zgromad ogniwa energetyczne!”, lecz
duo lepszym rozwizaniem z punktu widzenia rozgrywki bdzie udostpnienie wskazówek przy
uyciu monologu wewntrznego. Polega on na tym, e myli postaci s przekazywane do gracza,
na przykad: „Wyglda na to, e generator otwierajcy drzwi nie ma zasilania…”.
Aby zaprezentowa tekst na ekranie, uyjemy komponentu GUIText. Istnieje wiele sposo-
bów wykonania tego zadania, lecz ten jest najprostszy. Inne metody, takie jak uycie klasy
GUIscripting, zostan zaprezentowane w dalszej czci ksiki.
Obiekt GUI Text jest tworzony za pomoc opcji menu gównego. Zawiera on ju komponenty
Transform i GUIText. Wybierz pozycj GUI Text, klikajc przycisk Create (stwórz) w panelu
Hierarchy. Moesz take wybra opcj menu gównego GameObject/Create Other/GUIText
(obiekt gry/stwórz inny/GUIText). Powiniene ju dysponowa nowym obiektem w panelu Hie-
rarchy (hierarchia), zwanym GUI Text, oraz widzie na ekranie dwuwymiarowy napis „Gui Text”.
Zmie nazw nowo utworzonego obiektu na TextHintGUI: wybierz go, a nastpnie nacinij
klawisz Return (Mac) lub F2 (PC).
Jeli obiekt jest wci wybrany w panelu Hierarchy, przyjrzyj si komponentowi GUIText
w panelu Inspector (inspektor). Chcemy wywietla informacj dla gracza, dlatego powinnimy
pozostawi biece parametry, definiujce pooenie napisu w komponencie Transform. War-
toci X i Y równe 0,5 oznaczaj rodek ekranu. Tekst wywietlony w tym miejscu na pewno
zostanie zauwaony przez gracza.
Oprócz moliwoci definiowania pooenia napisu na ekranie klasa GUIText zawiera równie
parametr Alignment (wyrównanie), który dziaa podobnie jak ustawienia justyfikacji w opro-
gramowaniu przetwarzajcym teksty. Kliknij ikon z dwoma maymi strzakami, znajdujc si
221
Projektowanie gier w rodowisku Unity 3.x
po prawej stronie parametru Anchor (zakotwiczenie), a nastpnie wybierz opcj middle center
(pooenie rodkowe, centrowane) i przypisz parametrowi Alignment warto center (centrowa-
nie). Spowoduje to, e tekst bdzie si symetrycznie rozprzestrzenia z centralnego punktu ekranu,
zamiast rozpoczyna si od rodka i wypenia praw cz okna.
Waciwo Text (tekst) komponentu GUIText pozwala na proste wprowadzenie tekstu, który
powinien si pojawi na ekranie. My jednak zastosujemy inne rozwizanie i wykorzystamy skrypt
w celu dynamicznego wywietlania napisów.
Jzyk C#:
public GUIText textHints;
Jzyk JavaScript:
var textHints : GUIText;
Uyty typ danych GUIText pozwoli na przecignicie obiektu TextHintGUI na zmienn publiczn
i bezporednie odwoanie si do komponentu GUIText. Wybralimy go dlatego, e moemy
zapamita w zmiennej cay obiekt gry.
Jzyk C# i JavaScript:
textHints.SendMessage("ShowHint", "This door seems locked... maybe that
generator needs power...");
222
Rozdzia 6. • Kolekcja, inwentarz i HUD
Zanim napiszemy kod odbierajcy komunikat, przypiszmy now zmienn publiczn do obiektu
GUIText. W tym celu wybierz obiekt outPost w panelu Hierarchy (hierarchia), aby wywietli
komponent Trigger Zone (script). Nastpnie przecignij obiekt TextHintGUI z panelu Hierarchy
na zmienn Text Hints.
A teraz stwórzmy odbiornik komunikatu, którym bdzie skrypt doczony do obiektu TextHintGUI.
Wybierz folder Scripts (skrypty) w panelu Project, kliknij przycisk Create oraz wybierz odpowia-
dajcy Ci jzyk programowania.
Jzyk C#:
void ShowHint(string message){
guiText.text = message;
if(!guiText.enabled){ guiText.enabled = true; }
}
Jzyk JavaScript:
function ShowHint(message : String){
guiText.text = message;
if(!guiText.enabled){ guiText.enabled = true; }
}
Stworzylimy funkcj z jednym argumentem (message), która bdzie odbiera tekst przesany
za pomoc procedury SendMessage(). Na samym pocztku przypisujemy waciwoci text
komponentu guiText acuch tekstowy, odebrany przez argument.
Nastpnie przeprowadzamy podobne dziaanie, jakie wykonywalimy ju dla obiektu PowerGUI:
sprawdzamy, czy komponent jest wczony. Jeli nie, wczamy go.
Wypróbujmy nasz funkcj. Zapamitaj nowo utworzony skrypt i wró do rodowiska Unity.
Przypisz go do obiektu TextHintGUI w panelu Hierarchy poprzez przecignicie go z panelu
Project. Nastpnie usu domylny tekst „Gui Text”, przypisany do parametru text w kompo-
nencie GUIText. Dziki temu na ekranie nie pojawi si aden napis.
Kliknij przycisk Play, znajdujcy si w górnej czci interfejsu. Powiniene zauway , e w czasie
pojawiania si postaci gracza w obszarze wyzwalania obiektu placówki na ekranie wywietla
si tekst zawierajcy napis, który zdefiniowalimy w funkcji SendMessage(), wywoujcej skrypt
TextHints.
Wszystko dziaa bardzo adnie, ale czy napis musi si równie wywietla , gdy oddalimy si od
placówki? Kliknij przycisk Play, aby zakoczy testowanie, a nastpnie wró do skryptu TextHints.
223
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
float timer = 0.0f;
Jzyk JavaScript:
private var timer : float = 0.0;
Zmienna ta jest po prostu licznikiem czasu. Do zwikszania wartoci zmiennej uyjemy funkcji
Update(), gdy tylko nastpi wczenie komponentu GUIText. Po osigniciu okrelonej wartoci
wyczymy go ponownie, aby usun tekst wywietlany na ekranie.
Jzyk C# i JavaScript:
if(guiText.enabled){
timer += Time.deltaTime;
if(timer >=4){
guiText.enabled = false;
timer = 0.0f;
}
}
Uwaga
Innym sposobem realizacji powyszego zadania byoby stworzenie zmiennej logicznej (o wartociach true
lub false) oraz przypisanie jej wartoci true, gdy funkcja ShowHint() wczy komponent GUIText.
Zmienna ta byaby nastpnie sprawdzana w pierwszej instrukcji if. Jednake moemy po prostu
sprawdzi stan samego komponentu, a przez to uproci uywany kod.
Jeli waciwo guiText.enable jest równa true, zwikszamy zmienn timer poprzez dodanie do
niej pola Time.deltaTime, które zlicza upyw czasu niezalenie od prdkoci klatek samej gry.
Po wierszu zwikszajcym licznik czasu umiecilimy zagniedon instrukcj if, która spraw-
dza, czy jego warto odpowiada czterem sekundom. Jeli tak, wyczamy komponent, przypi-
sujc false do waciwoci enabled, a nastpnie zerujemy licznik czasu, dziki czemu moe on
ponownie rozpocz swoje dziaanie, gdy bdziemy potrzebowali wskazówki.
224
Rozdzia 6. • Kolekcja, inwentarz i HUD
Zapamitaj skrypt i wró do rodowiska Unity, a nastpnie kliknij przycisk Play (granie). Testu-
jc gr, powiniene zauway , e podczas pojawiania si w strefie wyzwalania obiektu outPost
na ekranie wywietla si nastpujcy komunikat: This door seems locked… maybe that genera-
tor needs power… (te drzwi wygldaj na zamknite, by moe generator wymaga odpowied-
niego zasilania…).
Dziki zmiennej timer napis zniknie po czterech sekundach. Ponownie kliknij przycisk Play,
aby zakoczy testowanie. Jeli w dolnej czci interfejsu Unity pojawi si jakie informacje
o bdach, kliknij je dwukrotnie i wró do skryptu, by go poprawi , porównujc swój kod
z treci umieszczon w tej ksice.
A teraz zapamitaj scen w rodowisku Unity poprzez wybranie opcji menu gównego File/Save
Scene (plik/zapisz scen).
Jzyk C# i JavaScript:
else if(Inventory.charge > 0 && Inventory.charge < 4){
textHints.SendMessage("ShowHint", "This door won't budge... guess it needs
fully charging - maybe more power cells will help...");
transform.FindChild("door").audio.PlayOneShot(lockedSound);
}
W powyszym kodzie sprawdzamy, czy gracz zebra wicej ni zero ogniw energetycznych,
lecz mniej ni cztery. Jeli ten warunek jest speniony, uywamy polecenia SendMessage(), aby
wywoa funkcj ShowHint() dla obiektu TextHintGUI, a nastpnie odtwarzamy dwik zamkni-
tych drzwi.
225
Projektowanie gier w rodowisku Unity 3.x
Jzyk C# i JavaScript:
if(Inventory.charge == 4){
transform.FindChild("door").SendMessage("DoorCheck");
}else if(Inventory.charge > 0 && Inventory.charge < 4){
textHints.SendMessage("ShowHint", "This door won't budge... guess it needs
´fully charging - maybe more power cells will help...");
transform.FindChild("door").audio.PlayOneShot(lockedSound);
}else{
transform.FindChild("door").audio.PlayOneShot(lockedSound);
col.gameObject.SendMessage("HUDon");
textHints.SendMessage("ShowHint", "This door seems locked... maybe that
´generator needs power...");
}
Uycie czcionek
Czcionki uywane w projekcie Unity musz zosta zaimportowane w postaci zasobu tak jak
kady inny element dodawany przez Ciebie. Mona to zrobi , zwyczajnie dodajc plik typu
TTF (TrueType font) (czcionka typu TrueType) lub OTF (OpenType font) (czcionka typu OpenType)
do folderu projektu Assets (zasoby) przy uyciu aplikacji Finder (Mac) lub Windows Explorer
(PC), a take w samym rodowisku Unity dziki wybraniu opcji menu gównego Assets/Import
New Asset (zasoby/importowanie nowego zasobu).
Uwaga
Powiniene by wiadomy tego, e pewne strony internetowe udostpniaj czcionki, których wolno
uywa za darmo, lecz które zawieraj ograniczenie mówice, i nie mona ich wykorzystywa w pro-
jektach pozwalajcych na ich wyodrbnienie. Ten problem nie wystpuje w przypadku Unity, poniewa
wszystkie czcionki s zamieniane na tekstury podczas tworzenia wynikowego obrazu gry.
226
Rozdzia 6. • Kolekcja, inwentarz i HUD
Odwied t stron i pobierz czcionk, która Ci si podoba, a jednoczenie jest atwa do czy-
tania. Pamitaj, e zostanie ona uyta do wywietlania instrukcji, wic nie moe by nadmiernie
wyrafinowana, poniewa obniyaby wraenia odbioru gry. Jeli chciaby uy takiej samej
czcionki, któr wida w przykadach dostpnych w tej ksice, powiniene odszuka nazw Sugo.
Pobierz j, rozpakuj, a nastpnie uyj jednej z wczeniej wspomnianych metod, aby zaimpor-
towa plik Sugo.otf (lub ten, który wybrae) w postaci zasobu projektu.
Gdy czcionka znajduje si ju w projekcie, odszukaj j w panelu Project i wybierz. Czcionki
w rodowisku Unity s reprezentowane przez ikon w ksztacie wielkiej litery A.
Nastpnie uyj tej czcionki w obiekcie TextHintGUI. W tym celu wybierz go w panelu Hierarchy,
a póniej przecignij czcionk z panelu Project na parametr Font (czcionka) komponentu GUIText
w panelu Inspector.
Kliknij przycisk Play, by przetestowa gr. Wskazówki dla gracza s teraz wywietlane przy
uyciu nowo dodanej czcionki. Pamitaj, e pewne rodzaje czcionek mog wyglda odmiennie
nawet po wybraniu tej samej wielkoci liter, dlatego gdy stwierdzisz, i rozmiar 25 nie jest
odpowiedni, moesz go oczywicie zmodyfikowa zgodnie z wasnymi preferencjami.
Podsumowanie
W tym rozdziale z powodzeniem stworzylimy i zaimplementowalimy scenariusz gry. Dziki
ustaleniu, jakie elementy powinien widzie gracz podczas gry (niezalenie od wiedzy o jego
dziaaniach), moesz wybra najlepsz metod, której powiniene uy jako projektant.
Spójrz na kady nowy element w swojej grze z punktu widzenia gracza — zagraj w jakie ist-
niejce gry, zastanów si nad scenariuszami ze wiata realnego, ale przede wszystkim zaó,
e gracz nie dysponuje adn wczeniejsz wiedz (nawet w przypadku tradycyjnych gier,
poniewa mog one by nowoci w technologii komputerowej). Najbardziej intuicyjna rozgrywka
ma miejsce w grach, w których jest zachowana równowaga midzy zoonoci amigówek
a waciwym wyposaeniem gracza z punktu widzenia uzyskiwanych informacji oraz przyjaznoci
zastosowanej prezentacji. Bardzo wane jest zapewnienie odpowiedniej reakcji na dziaania
gracza dziki wykorzystaniu w tym celu elementów wizualnych lub dwikowych. Podczas
projektowania zawsze zwracaj uwag na to, jakie informacje s przekazywane do gracza w ka-
dym etapie gry.
227
Projektowanie gier w rodowisku Unity 3.x
Gdy zrealizowalimy ju prosty scenariusz gry oraz przyjrzelimy si, w jaki sposób mona two-
rzy i kontrolowa elementy graficznego interfejsu uytkownika, powinnimy zaj si imple-
mentacj innego scenariusza. Bdzie on polega na stworzeniu specjalnego pomieszczenia,
w którym gracz po trafieniu wszystkich celów wygra dodatkowe ogniwo energetyczne.
228
7
Konkretyzowanie
obiektów
i bryy sztywne
Gdy rozpoczynasz tworzenie sceny, zdajesz sobie spraw z tego, e nie wszystkie obiekty, które
s w niej wymagane, bd obecne na samym pocztku gry. Jest to prawda w przypadku takich
gatunków gier, jak na przykad ukadanki — we pod uwag spadajce bloki w grze Tetris.
W tym przypadku co pewien czas w górnej czci ekranu nastpuje tworzenie (lub konkrety-
zowanie) obiektów o losowych ksztatach, poniewa nie mog one by tam przechowywane
w nieskoczono .
Wemy teraz pod uwag nasz gr zwizan z eksploracj wyspy. W tym rozdziale zapoznamy
si z konkretyzowaniem obiektów oraz fizyk bryy sztywnej poprzez stworzenie prostej gry
opartej na rzucaniu do celu. Jednake w przeciwiestwie do prototypu, który wykonalimy
wczeniej, pociski z orzechów kokosowych nie bd obecne w grze po jej rozpoczciu. Wynika
std, e naley w tym przypadku zastosowa metod konkretyzowania obiektów. Uywajc pre-
fabrykatów (z zapamitanym pooeniem i obrotem), mona konkretyzowa obiekty ju pod-
czas trwania gry. Pozwoli nam to na utworzenie nowego orzecha kokosowego w momencie
nacinicia przez gracza przycisku strzau.
Projektowanie gier w rodowisku Unity 3.x
Aby poczy t now cz gry z jej gównym wtkiem, usuniemy jedno ogniwo energetyczne.
Poprzez wzicie udziau w grze rzucania do celu umoliwimy graczowi wygranie ostatniego
ogniwa energetycznego, które jest wymagane do otwarcia drzwi placówki. W zasobach zwi-
zanych z t ksik moesz znale odpowiedni model pomieszczenia oraz tarcz strzelniczych,
które w nim umiecimy. Bdziesz musia stworzy prefabrykat orzecha kokosowego, a take
zarzdza animacj tarcz strzelniczych. W tym celu wykorzystasz odpowiednie skrypty, które
bd wykrywa zderzenia midzy orzechami i tarczami.
Poniewa udostpnione tarcze zawieraj animacje typu „trafiony” i „gotowy do strzau”, bdziemy
musieli równie napisa skrypt, który po trafieniu orzecha w cel umoliwi tarczom powrót
w okrelonym czasie do stanu pocztkowego. Oznacza to, e gracz bdzie móg wygra t minigr
jedynie wówczas, gdy wszystkie trzy cele zostan trafione w okrelonym przedziale czasu. Dziki
temu uzyskujemy dodatkowy poziom trudnoci — moe on by modyfikowany poprzez zmian
liczby sekund, po których upywie tarcze wracaj do pozycji pocztkowej.
Wykorzystywanie konkretyzacji
W tym rozdziale ponownie wykorzystamy polecenie Instantiate(), którego ju uywalimy
w naszym wczeniejszym prototypie. Jest ono czsto stosowane w wielu grach do tworzenia
pocisków, gromadzonych obiektów, a nawet postaci takich jak wrogowie.
230
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Takie rozwizanie pomoe nam podj decyzj o lokalizacji kodu, czyli powizaniu midzy
skryptem a odpowiednim obiektem. Doczenie skryptu do pustego obiektu, którego lokalizacj
wykorzystamy dla nowo tworzonego orzecha kokosowego, pozwoli nam uy skadni z kropk
i zastosowa wyraenie transform.position jako parametr pooenia w poleceniu Instantiate().
Dziki temu tworzony obiekt dziedziczy pooenie komponentu Transform, nalecego do
pustego obiektu, do którego zosta doczony skrypt. Podobnie dziaa dziedziczenie obrotu,
którego waciwoci zostaj pobrane z pustego obiektu nadrzdnego.
Bryy sztywne
Silniki fizyczne pozwalaj na uzyskanie w grach odpowiedniego poziomu symulowanego reali-
zmu w sensie fizycznym. Obecnie s one wbudowane w prawie wszystkie silniki gier lub uy-
wane jako dodatkowa wtyczka. rodowisko Unity wykorzystuje nowoczesny i dokadny silnik
fizyczny nVidia PhysX, który jest stosowany w wielu grach komercyjnych. Uycie silnika fizycz-
nego oznacza nie tylko branie pod uwag takich parametrów, jak ciar i grawitacja, lecz równie
realistyczne reagowanie na zjawiska fizyczne, np. tarcie, moment obrotowy oraz zderzenie mas.
231
Projektowanie gier w rodowisku Unity 3.x
Siy
Silnik fizyczny oddziauje na obiekty gry odpowiednimi siami. Mog by one stosowane przy
uyciu rónych metod, np. komponentów lub skryptów. Aby reagowa na dziaanie si fizycz-
nych, obiekt gry musi by tak zwan bry sztywn.
Komponent Rigidbody
Aby uy silnika fizycznego w obiekcie rodowiska Unity (czyli uczyni go bry sztywn),
naley uzupeni go o komponent Rigidbody. Dziki temu nie ma potrzeby wykorzystania wa-
ciwoci silnika fizycznego w caej scenie — dziaa on w tle jedynie dla okrelonych obiektów.
232
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Uwaga
W rodowisku Unity istnieje take globalne ustawienie zwizane z grawitacj. Wybierz opcj menu
gównego Edit/Project Settings/Physics (edycja/ustawienia projektu/parametry fizyczne), a nastpnie poprzez
kliknicie szarej strzaki rozwi parametry Gravity (grawitacja). Pozwalaj one na zdefiniowanie wielkoci
i kierunku dziaania siy cienia. Zwró uwag na to, e parametr Y jest równy 9,81, co oznacza stan-
dardowe przyspieszenie ziemskie 9,81 m/s . 2
Tworzenie minigry
Aby wykorzysta w praktyce powysze informacje, stworzymy gr polegajc na rzucaniu orze-
chami kokosowymi do celu. Zostanie ona powizana z uzyskaniem dostpu do placówki. Dziki
wziciu udziau w grze gracz bdzie móg zdoby brakujce ogniwo energetyczne, wymagane
do zasilania generatora otwierajcego drzwi budynku.
Poniewa zdefiniowalimy ju ogniwa energetyczne, musimy z istniejcej sceny usun jedno
z nich, co spowoduje, e gracz bdzie musia je zdoby .
233
Projektowanie gier w rodowisku Unity 3.x
W panelu Hierarchy (hierarchia) wybierz jeden z obiektów zwanych powerCell, a nastpnie usu
go za pomoc skrótu klawiszowego Command+Backspace (Mac) lub Delete (PC).
Teraz zmienimy parametry obiektu, aby lepiej dopasowa go do ksztatu orzecha kokosowego.
W tym celu zmniejszymy jego rozmiar oraz delikatnie poszerzymy go w osi Z. W panelu Inspector
(inspektor) przejd do komponentu Transform obiektu Coconut, a nastpnie odpowiednio wype-
nij pola w grupie Scale (skala). Parametrom X i Z przypisz warto 0,5, a Y — warto 0,6.
Tekstura, która bdzie uyta w obiekcie orzecha kokosowego, zostaa pobrana razem z pozosta-
ymi zasobami wykorzystywanymi w tej ksice. Nazywa si ona coconutTexture i znajduje si
w katalogu Book Assets/Textures (zasoby ksiki/tekstury).
234
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Pamitaj, e prezentuje ono jedynie wygld materiau naoonego na kul. Jest to domylny
podgld w rodowisku Unity i jedynie zbiegiem okolicznoci jest to, e nasz obiekt ma równie
ksztat kuli. Moesz zmodyfikowa prosty ksztat wywietlany w oknie podgldu. W tym celu
naley klikn lewy przycisk, znajdujcy si po prawej stronie napisu Preview (podgld). Drugi
przycisk suy do wyczania i wczania owietlenia oraz cienia.
Nastpnie powinnimy przypisa materia Coconut Skin do obiektu gry Coconut, który umie-
cilimy w naszej scenie. Aby to zrobi , po prostu przecignij materia z panelu Project na odpo-
wiedni obiekt w widoku Scene (scena) lub jego nazw w panelu Hierarchy.
Moesz przetestowa , jak orzech kokosowy upada i si toczy (jeli umiecie go nad powierzchni
wyspy — jeli nie, moesz go przemieci przy uyciu narzdzia Translate). Wystarczy klikn
przycisk Play (granie) i obserwowa obiekt w widoku Scene (scena) lub Game (gra). Po zakocze-
niu testów ponownie nacinij przycisk Play.
Aby zapisa obiekt w postaci prefabrykatu, po prostu przecignij go z panelu Hierarchy i upu
w dowolnym miejscu obszaru Project (projekt). W naszym przypadku wykonaj t czynno dla
obiektu Coconut i umie go w folderze Prefabs (prefabrykaty), który wczeniej utworzylimy.
Uwaga
Twojemu prefabrykatowi zostanie nadana nazwa pochodzca od pierwotnego obiektu. Tekst wywietlony
w panelu Hierarchy powinien zmieni kolor na niebieski, co oznacza, e ródem obiektu jest prefabrykat.
Zalet takiego rozwizania jest to, i dowolna instancja obiektu moe zosta zmodyfikowana poprzez
zmian ustawie prefabrykatu znajdujcego si w panelu Project. Przykadowo zaómy, e Twoja scena
gry zawiera kilka budynków opartych na tym samym prefabrykacie. Modyfikacja wartoci przypisanego
skryptu lub zamiana materiau moe zosta wówczas zrealizowana wycznie w prefabrykacie, co bdzie
miao wpyw na wszystkie instancje obiektu dostpne w danej scenie.
235
Projektowanie gier w rodowisku Unity 3.x
Poniewa Twój obiekt Coconut jest ju zapamitany jako prefabrykat, usu pierwotn instancj
ze sceny poprzez wybranie jej w panelu Hierarchy i nacinicie skrótu klawiszowego Com-
mand+Backspace (Mac) lub Delete (PC).
Gdy w wiecie rzeczywistym rzucamy kul (znad gowy), wówczas staje si ona widoczna i poja-
wia si po której stronie gowy, kiedy nasze rami prostuje si, uwalniajc j z uchwytu. Wynika
std, e powinnimy umieci nasz obiekt poza polem widzenia gracza i upewni si, e bdzie
wyrzucany w kierunku jego spogldania. Widok gracza jest zarzdzany przez obiekt podrzdny
Main Camera, nalecy do obiektu First Person Controller. Utworzenie pustego obiektu pod-
rzdnego umoliwi poruszanie kamer, jego pooenie i obrót bd bowiem zawsze zalene od
rodzica. Gdy kamera bdzie si obraca , tak samo bdzie si zachowywa jej obiekt podrzdny.
Rozpocznij od utworzenia w scenie nowego pustego obiektu gry. Mona to zrobi , wybierajc
opcj menu gównego GameObject/Create Empty (obiekt gry/stwórz pusty) lub uywajc skrótu
klawiszowego Ctrl+Shift+N (PC) albo Command+Shift+N (Mac). Wybierz ten obiekt w panelu
Hierarchy (domyln jego nazw jest GameObject) i zmie jego nazw na Launcher. Nastpnie
rozwi obiekt First Person Controller poprzez kliknicie szarej strzaki po lewej stronie jego
nazwy w panelu Hierarchy. Przecignij nowo utworzony obiekt Launcher nad obiekt Main Camera,
co spowoduje, e stanie si on jego potomkiem. Zauwaysz, e wykonae t operacj prawi-
dowo, gdy obok nazwy Main Camera pojawi si szara strzaka, która oznacza istnienie obiektów
podrzdnych.
Jak zaprezentowano na poniszym rysunku, obiekt Launcher znajduje si wewntrz obiektu
Main Camera:
Poniewa jest on potomkiem obiektu Main Camera, porusza si i obraca razem ze swoim rodzicem.
Wymaga on jednak zdefiniowania swojego pooenia. Przejd do komponentu Transform, zawar-
tego w obiekcie Launcher i znajdujcego si w panelu Inspector. Pooenie mona zresetowa ,
wprowadzajc zera w odpowiednich polach, lecz wystarczy take uy ikony kóka zbatego,
znajdujcego si w prawym górnym naroniku obszaru komponentu, a nastpnie wybra opcj
Reset Position (resetuj pooenie) z rozwijanego menu.
236
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Wskazówka
Ikona kóka zbatego suy do szybkiego przeprowadzania okrelonych operacji. Znajduje si w panelu
Inspector przy kadym komponencie. Zwizane z ni menu jest take przydatne, pozwala bowiem na
usuwanie komponentów, które nie s ju potrzebne lub zostay dodane przez pomyk.
Aby tego unikn , musimy po prostu przesun obiekt Launcher do przodu i w prawo w stosunku
do jego biecej lokalizacji. W tym celu w komponencie Transform przypisz parametrom poo-
enia X i Z warto 1. Launcher znajduje si teraz w miejscu, w którym powinno nastpowa
uwalnianie obiektu rzucanego praw rk gracza, tak jak zaprezentowano na poniszym rysunku.
By zobaczy obiekt, powiniene wybra narzdzie Translate (skrót klawiszowy W), co umoliwi
wywietlanie osi wspórzdnych. Na poniszym rysunku wybrano równie obiekt Main Camera,
by przedstawi odpowiedni perspektyw.
237
Projektowanie gier w rodowisku Unity 3.x
Aby sprawi , by orzech kokosowy by rzucany w kierunku, w którym spogldamy, musimy obró-
ci obiekt Launcher wokó osi Y. W komponencie Transform wprowad warto 352 w polu Y dla
pozycji Rotation (obrót), co oznacza obrót o 8 stopni.
Teraz zajmiemy si tworzeniem skryptu, w którym obsuymy konkretyzacj orzecha kokosowego
oraz jego sterowanie po naciniciu przez gracza przycisku strzau.
Wród wywietlonych pozycji znajduj si trzy najwaniejsze parametry: Name (nazwa), Positive
Button (przycisk zwikszania) i Alt Positive (alternatywny przycisk zwikszania). Parametr Name
oznacza nazw portu, natomiast Positive Button i Alt Positive Button s faktycznymi klawiszami
przyporzdkowanymi do niego. Nowe porty wejciowe mog zosta zdefiniowane przez zwyke
zwikszenie wartoci pola Size (rozmiar), znajdujcego si w górnej czci interfejsu menedera
wej . Spowoduje to utworzenie nowego portu, który moe zosta odpowiednio skonfigurowany.
Aby gracz móg rzuca orzechami kokosowymi w kierunku celów (umiecimy je w naszej scenie
w dalszej kolejnoci), musimy stworzy skrypt, w którym zaimplementujemy dwie funkcjo-
nalnoci:
238
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
W tym celu wybierz folder Scripts (skrypty) w panelu Project (projekt) i stwórz nowy plik
w jzyku C# lub JavaScript, uywajc dostpnego przycisku Create (stwórz). Nacinij klawisz
Return (Mac) lub F2 (PC) i zmie nazw skryptu na CoconutThrower. Nastpnie kliknij dwukrot-
nie jego ikon i wywoaj edytor.
Sprawdzanie wej
Sprawdzanie, czy gracz nie nacisn odpowiedniego klawisza, powinno nastpowa w kadej
klatce gry. Wynika std, e kod obsugujcy to zadanie musi si zawiera w funkcji Update().
Przesu zamykajcy nawias klamrowy tej funkcji o kilka wierszy w dó, a póniej umie w niej
ponisz instrukcj if, która — podobnie jak w poprzednim prototypie — sprawdza, czy zosta
nacinity klawisz Fire1:
Jzyk C# i JavaScript:
if(Input.GetButtonDown("Fire1")){
}
Najpierw powinnimy odtworzy dwik, który bdzie sygnaem zwrotnym dla gracza, informu-
jcym o rzuceniu orzechem kokosowym. Gdybymy tworzyli strzelank, w tym miejscu naj-
prawdopodobniej wykorzystalibymy dwik strzau. Jednake w naszym przypadku uyjemy
delikatnego odgosu wistu, który bdzie reprezentowa rzut orzechem kokosowym.
Jzyk C#:
public AudioClip throwSound;
Jzyk JavaScript:
var throwSound : AudioClip;
Powyszy kod tworzy zmienn publiczn, do której po zakoczeniu tworzenia skryptu przypi-
szemy faktyczny klip audio w panelu Inspector (inspektor).
239
Projektowanie gier w rodowisku Unity 3.x
Jzyk C# i JavaScript:
audio.PlayOneShot(throwSound);
Dziki powyszemu kodowi zostanie odtworzony odpowiedni dwik, gdy gracz nacinie
przycisk Fire1. Sprawdmy, czy tak jest w rzeczywistoci — zapamitaj skrypt i wró do rodo-
wiska Unity.
Zanim rozpoczniemy test, musimy przypisa klip audio do dostpnej zmiennej publicznej Throw
Sound. W tym celu przecignij klip coconut_throw z folderu Book Assets/Sounds (zasoby
ksiki/dwiki) na t zmienn w komponencie Coconut Thrower (Script) obiektu Launcher.
Wreszcie dodaj komponent Audio Source do obiektu Launcher poprzez wybranie go w panelu
Hierarchy, a nastpnie przejcie do opcji menu gównego Component/Audio/Audio Source (kom-
ponent/audio/ródo audio). Kliknij przycisk Play (granie) i nacinij lewy klawisz Ctrl lub lewy
klawisz myszy — powiniene usysze dwik rzucanego przedmiotu.
Jzyk C#:
public Rigidbody coconutPrefab;
Jzyk JavaScript:
var coconutPrefab: Rigidbody;
Powyszy kod dodaje zmienn publiczn typu Rigidbody. Mimo e nasz orzech kokosowy jest
przechowywany w zasobie prefabrykatu, podczas konkretyzacji utworzymy obiekt gry zawiera-
jcy komponent Rigidbody — std wynika uyty typ danych. Dziki temu bdziemy pewni, e
do zmiennej w panelu Inspector nie przypiszemy adnego obiektu nieposiadajcego komponentu
Rigidbody. cise zdefiniowanie typu danych oznacza równie, i w przypadku, gdy chcemy
odwoa si do komponentu Rigidbody, nie musimy wykorzystywa polecenia GetComponent().
240
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Po prostu piszemy kod, który bezporednio wykorzystuje klas Rigidbody podczas odwoywania
si do nazwy zmiennej.
Wewntrz instrukcji if, znajdujcej si w funkcji Update(), umie poniszy fragment kodu
zaraz pod istniejcym wierszem, który dotyczy odtwarzania klipu audio:
Jzyk C#:
Rigidbody newCoconut = Instantiate(coconutPrefab, transform.position,
´transform.rotation) as Rigidbody;
Jzyk JavaScript:
var newCoconut : Rigidbody = Instantiate(coconutPrefab, transform.position,
´transform.rotation);
W powyszym kodzie tworzymy lokaln zmienn newCoconut. Jest ona zwana lokaln, poniewa
zostaa zadeklarowana wewntrz funkcji Update(), co oznacza, e nie jest poza ni dostpna.
Do tej zmiennej przypisujemy konkretyzacj nowego obiektu Rigidbody, dlatego te charakte-
ryzuje si ona wanie tym typem.
Pamitaj, e trzema parametrami funkcji Instantiate() s: obiekt, pooenie i obrót. Bdziesz
móg zauway , i wykorzystalimy zmienn publiczn coconutPrefab, aby stworzy instancj
naszego prefabrykatu, a nastpnie odziedziczy wartoci pooenia i obrotu po komponencie
Transform obiektu, do którego zosta przypisany skrypt — jest nim obiekt Launcher.
Sprawdmy, jak wyglda postp naszych prac w rodowisku Unity. W tym celu zapamitaj
skrypt i wró do interfejsu Unity. Wybierz obiekt podrzdny Launcher, przypisany rodzicowi Main
Camera w panelu Hierarchy, co spowoduje, e zauwaysz pojawienie si nowej zmiennej publicz-
nej, zwanej Coconut Prefab, która musi zosta zainicjalizowana. Aby to zrobi , przecignij i upu
na ni prefabrykat Coconut znajdujcy si w folderze Prefabs.
A teraz kliknij przycisk Play w górnej czci interfejsu, aby przetestowa gr. Kadorazowe
nacinicie klawisza Fire1 powinno skutkowa utworzeniem nowej instancji prefabrykatu Coconut,
co bdzie si objawia pojawianiem si obiektów Coconut (Clone) w panelu Hierarchy.
Jednake kokosy nie poruszaj si! Dzieje si tak, gdy powiniene przypisa im jak prdko
pocztkow. Jeszcze raz kliknij przycisk Play, aby przerwa testowanie, a nastpnie powró do
edycji skryptu CoconutThrower.
Instancje nazwane
Gdy w trakcie dziaania programu tworzysz obiekty przy uyciu funkcji Instantiate(), rodowi-
sko Unity pobiera nazw prefabrykatu i docza do niej acuch tekstowy (Clone). Poniewa
uzyskana nazwa nie jest odpowiednia do wykorzystania w kodzie (bdziemy musieli to póniej
zrobi z naszymi obiektami celów), moemy po prostu j zdefiniowa , umieszczajc nastpujcy
wiersz kodu poniej tego, który wanie dodalimy:
241
Projektowanie gier w rodowisku Unity 3.x
Jzyk C# i JavaScript:
newCoconut.name = "coconut";
W powyszym kodzie uylimy nazwy stworzonej zmiennej, która odwouje si do nowej instancji
prefabrykatu. Nastpnie zastosowalimy skadni z kropk, by uzyska dostp do parametru
name. Wreszcie wykorzystalimy pojedynczy znak równoci, aby przypisa temu parametrowi
odpowiedni acuch znakowy.
Aby ustali szybko rzucanego orzecha kokosowego, musimy powyej funkcji Update() utwo-
rzy kolejn zmienn publiczn. Uzyskanie odpowiedniej precyzji bdzie moliwe dziki zasto-
sowaniu typu danych float. Pozwoli to na uycie wartoci dziesitnych. Umie nastpujcy
kod poniej ostatnio zdefiniowanej zmiennej publicznej, zwanej coconutPrefab:
Jzyk C#:
public float throwSpeed = 30.0f;
Jzyk JavaScript:
var throwSpeed: float = 30.0;
Poniej wywoania funkcji Instantiate() oraz wiersza name = "coconut";, znajdujcych si
wewntrz instrukcji if, umie poniszy kod:
Jzyk C# i JavaScript:
newCoconut.velocity = transform.forward * throwSpeed;
Poprzez nazw zmiennej odwoujemy si do nowo utworzonego obiektu typu Rigidbody, czyli
newCoconut. Nastpnie, uywajc skadni z kropk, wyuskujemy waciwo velocity klasy
Rigidbody.
242
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Rzu my kilkoma orzechami kokosowymi! Zapamitaj skrypt i wró do rodowiska Unity. Kliknij
przycisk Play i spróbuj nacisn przycisk Fire1. Tym razem orzech powinien zosta wyrzucony
w kierunku, w którym spogldasz, poniewa odpowiedni parametr obiektu podrzdnego Launcher
jest dziedziczony po rodzicu Main Camera.
Kontynuujmy ulepszanie naszego skryptu poprzez umieszczenie w nim kilku elementów zabez-
pieczajcych. Kliknij przycisk Play, aby zakoczy testowanie mechaniki rzucania orzechami
kokosowymi, a nastpnie wró do edytora skryptu.
Q projektowania gry,
Q grania w gr.
Wanie stworzylimy mechanik, w której posta gracza moe rzuca orzechami kokosowymi.
Jednake przed kontynuacj procesu projektowania powinnimy wykona kilka dziaa zapew-
niajcych to, e nasza mechanika nie spowoduje jakichkolwiek problemów:
Q Musimy si upewni , e prefabrykat orzecha kokosowego, którym rzucamy, jest typu
Rigidbody, poniewa parametr prdkoci wykorzystuje waciwoci uytej klasy.
Dlatego te musimy uzupeni kod o odpowiednie zabezpieczenie.
Q Powinnimy si upewni , e midzy postaci gracza i orzechami kokosowymi nigdy
nie wystpi adne kolizje. Przyjrzymy si dwóm metodom, które wykonuj powysze
zadanie. Jedna z nich zostanie zaimplementowana w kodzie, a druga bdzie
wykorzystywa warstwy i macierz kolizji w rodowisku Unity.
Q Dysponujemy klipem audio, odtwarzanym podczas rzutu. Musimy si upewni ,
e obiekt, któremu zosta przypisany skrypt, zawiera komponent róda audio.
243
Projektowanie gier w rodowisku Unity 3.x
if(newCoconut.rigidbody == null) {
newCoconut.AddComponent(Rigidbody);
}
Powysze polecenie sprawdza, czy komponent Rigidbody nie jest doczony do instancji zmien-
nej (czyli jest równy null), i jeli tak jest, dodaje go.
Wskazówka
Sprawdzenie, e komponent Rigidbody nie istnieje, nastpuje tu przez porównanie pola rigidbody
z wartoci null. Zwyke umieszczenie znaku wykrzyknika na pocztku wyraenia wewntrz warunku if
nie bdzie dziaa, poniewa w ten sposób mona sprawdzi jedynie stan obiektu. Praktyka ta moe jed-
nak zosta wykorzystana do sprawdzenia, czy zmiennej typu acuchowego zostaa przypisana jaka war-
to, co nie dziaaoby, gdybymy uyli znaku wykrzyknika.
Poniewa nasz prefabrykat zawiera ju komponent Rigidbody, nie musimy wykonywa dodatkowego
sprawdzenia. Jest to jednak przydatna technika, o której powiniene wiedzie.
Moe to zosta zrealizowane poleceniem IgnoreCollision()z klasy Physics. Zawiera ono trzy
argumenty:
IgnoreCollision(Zderzacz A, Zderzacz B, czy naley ignorowa);
Do funkcji naley tylko przekaza dwa zderzacze, które nie powinny oddziaywa na siebie,
a nastpnie przypisa trzeciemu parametrowi warto true.
Umie wic poniszy kod w skrypcie CoconutThrower poniej wiersza, który ostatnio dodae
(newCoconut.velocity...):
Jzyk C# i JavaScript:
Physics.IgnoreCollision(transform.root.collider, newCoconut.collider, true);
244
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
dzieckiem obiektu Main Camera, a sama kamera nie zawiera zderzacza. W rzeczywistoci chcemy
wic znale obiekt, do którego ona naley, czyli First Person Controller. Robimy to, uywajc
wanie wyraenia transform.root.
Wskazówka
W naszym przypadku musielimy znale gówny obiekt nadrzdny, ale jeli odwoujesz si tylko do rodzica,
moesz wykorzysta zapis transform.parent.
Rozpocznijmy od utworzenia dwóch nowych warstw. Otwórz Tag Manager (meneder znacz-
ników), wybierajc opcj menu gównego Edit/Project Settings/Tags (edycja/ustawienia pro-
jektu/znaczniki). Poniej istniejcych znaczników swojego projektu bdziesz móg zauway list
gotowych warstw, a pod ni — warstwy uytkownika (User Layers):
Dodaj dwie warstwy o nazwach Projectiles (pociski) i Player (gracz), tak jak przedstawiono na
powyszym rysunku. Aby potwierdzi wprowadzenie zmian, nacinij klawisz Return (Mac) lub
Enter (PC).
245
Projektowanie gier w rodowisku Unity 3.x
Dziki temu warstwy bd ignorowa kolizje zachodzce midzy nimi. Teraz moemy po prostu
przypisa nasze obiekty do nowo utworzonych warstw. Wybierz obiekt First Person Controller
w panelu Hierarchy, a nastpnie, na samej górze panelu Inspector, wybierz warstw Player
z rozwijanego menu.
Wybierz prefabrykat Coconut z folderu Prefabs w panelu Project i uyj tej samej metody co
poprzednio, aby przypisa go do warstwy Projectiles.
Mamy ju dwa zabezpieczenia, które nie pozwalaj orzechowi kokosowemu oddziaywa na
posta gracza. Implementacja takich rozwiza jest wanym elementem, minimalizujcym
ryzyko pojawienia si bdów pod koniec procesu projektowania gry.
Jzyk C#:
Na samym pocztku skryptu zlokalizuj ponisze wiersze:
using UnityEngine;
using System.Collections;
246
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Jzyk JavaScript:
Na samym kocu skryptu umie nastpujcy wiersz kodu:
@script RequireComponent(AudioSource)
Zapisz skrypt przy uyciu opcji menu gównego File/Save (plik/zapisz), a nastpnie wró do
rodowiska Unity.
Jeli pojawi si jakie problemy, wró do skryptu i sprawd dokadnie, czy jego tre odpowiada
poniszemu kodowi:
Jzyk C#:
Pamitaj, e funkcja Start() oraz komentarze // zostay usunite.
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (AudioSource))]
void Update () {
if(Input.GetButtonDown("Fire1")){
audio.PlayOneShot(throwSound);
RigidbodynewCoconut = Instantiate(coconutPrefab, transform.position,
´transform.rotation) as Rigidbody;
newCoconut.name = "coconut";
newCoconut.rigidbody.velocity = transform.forward * throwSpeed;
Physics.IgnoreCollision(transform.root.collider, newCoconut.collider,
´true);
}
}
}
247
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
var throwSound : AudioClip;
var coconutPrefab: Rigidbody;
var throwSpeed : float;
function Update () {
if(Input.GetButtonDown("Fire1")){
audio.PlayOneShot(throwSound);
var newCoconut : Rigidbody = Instantiate(coconutPrefab,
´transform.position, transform.rotation);
newCoconut.name = "coconut";
newCoconut.rigidbody.velocity = transform.forward * throwSpeed;
Physics.IgnoreCollision(transform.root.collider, newCoconut.collider,
´true);
}
}
@scriptRequireComponent(AudioSource)
Jednake tworzenie wielu kopii obiektu Rigidbody moe by kosztowne, poniewa kady z nich
wymaga uycia silnika fizycznego oraz procesora karty grafiki. Dodatkowo do poruszania si
po trójwymiarowym wiecie i oddziaywania na inne obiekty jest zuywany czas (moc) procesora.
A teraz wyobra sobie, e pozwoliby graczowi na utworzenie nieskoczonej liczby obiektów
o parametrach fizycznych. Skoczyoby si to zatrzymaniem caej gry po krótkim czasie. Ponie-
wa wykorzystywaaby ona zbyt wiele czasu procesora oraz pamici, prdko klatek staaby
si zbyt niska. Spowodowaoby to pojawienie si przestojów w grze w przeciwiestwie do
poprzedniego pynnego trybu dziaania. Zrobioby to na pewno ze wraenie na graczu,
a w sensie komercyjnym po prostu unicestwioby sam gr.
Uwaga
Gry przeznaczone na komputery typu PC i Mac maj niewielkie wymagania systemowe. Wynika to std,
e projektanci przyjrzeli si istniejcemu sprztowi i stworzyli odpowiednie specyfikacje, pozwalajce na
przeprowadzanie testów w celu zagwarantowania poprawnych wrae odbioru w sytuacjach nawet
najbardziej intensywnego wykorzystania gier.
Zamiast mie nadziej, e gracz nie wyrzuci zbyt wielu orzechów kokosowych, wykonamy dwa
dziaania, które zabezpiecz nas przed wygenerowaniem duej liczby obiektów mogcych spo-
wolni dziaanie gry:
248
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Uwaga
Gdybymy zajmowali si konkretyzacj na wiksz skal, na przykad wykorzystujc modele broni maszy-
nowej, równie zastosowalibymy pewne opó nienie czasowe, zapewniajce istnienie okresu „przea-
dowania”. W naszym przypadku nie jest to jednak konieczne, poniewa nie dopuszczamy do jednoczesnego
wyrzucenia zbyt wielu orzechów kokosowych, wykorzystujc do tego procedur GetButtonDown().
Mimo e jest ona uywana w funkcji Update(), gracz po oddaniu pierwszego strzau musi ponownie
nacisn przycisk, aby wykona kolejny rzut — samo przytrzymanie klawisza nie bdzie dziaa.
Zezwolenie graczowi na rzucanie orzechami kokosowymi w pooeniu, które nie jest zwizane
z minigr, nie miaoby sensu. Ograniczenie tego dziaania do okrelonego obszaru jest dobrym
rozwizaniem, bez wzgldu na nasze rozwaania nad wydajnoci gry.
Jeli skrypt CoconutThrower zosta zamknity, otwórz go, klikajc dwukrotnie jego ikon
w panelu Project (projekt). W przeciwnym razie po prostu wró do edytora i kontynuuj prac.
Wczeniej zajmowalimy si skryptami aktywujcymi i dezaktywujcymi, które wykorzystyway
parametr enabled nalecy do danego komponentu. Teraz jednak moglibymy równie uy
polecenia GetComponent(), wybra skrypt, a nastpnie wyczy go, by zabroni graczowi rzuca-
nia orzechami kokosowymi. Jednake, podobnie jak w przypadku kadego problemu zwiza-
nego ze skryptami, istnieje wiele rozwiza. My uyjemy zmiennych statycznych, pozwalajcych
na komunikacj midzyskryptow.
249
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
public static bool canThrow = false;
Jzyk JavaScript:
static var canThrow : boolean = false;
Prefiks static przed zmienn powoduje, e ma ona zasig globalny — moe by dostpna
z innych skryptów. Korzystajc z tego, umiecimy dodatkowy warunek w istniejcej instrukcji if,
który pozwoli nam na rzucanie orzechami. Zlokalizuj wic nastpujcy wiersz w funkcji Update():
if(Input.GetButtonUp("Fire1")){
Aby doda drugi warunek, po prostu uyj dwóch znaków && razem z nazw zmiennej statycznej
i umie je przed prawym nawiasem klamrowym w instrukcji if:
Jzyk C# i JavaScript:
if(Input.GetButtonUp("Fire1") && canThrow){
Zmiennej canThrow przypisalimy warto false podczas jej deklaracji. Jest ona statyczna (czyli
nie jest zmienn publiczn, przez co nie pojawi si w panelu Inspector i nie bdzie moga zosta
tam zmodyfikowana), dlatego bdziemy musieli stworzy kolejny fragment kodu, w którym
przypiszemy jej warto true. Zakadajc, e gracz musi znajdowa si w okrelonym miejscu,
najlepsz metod modyfikacji wartoci zmiennej canThrow jest uycie funkcji wykrywajcej
kolizj. Bdzie ona moga sprawdzi , czy gracz zderza si z okrelonym obiektem, a jeli tak,
ustawi zmienn statyczn na warto true i pozwoli na rzucanie orzechami kokosowymi.
Gracz musi stan na podecie, aby mie moliwo rzucania do celu. Aby przypisa wartoci
true lub false do zmiennej CoconutThrower.canThrow, uyjemy funkcji OnTriggerEnter() oraz
OnTriggerExit().
250
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Jzyk C#:
void OnTriggerEnter(Collider col){
if(col.gameObject.tag == "Player"){
CoconutThrower.canThrow=true;
}
}
Jzyk JavaScript:
function OnTriggerEnter(col : Collider){
if(col.gameObject.tag == "Player"){
CoconutThrower.canThrow=true;
}
}
Powysze funkcje po prostu sprawdzaj, czy obiekt zderzajcy si z wyzwalaczem jest gra-
czem. Jest to realizowane przez sprawdzenie znacznika tag, a nastpnie przypisanie zmiennej
statycznej canThrow w skrypcie CoconutThrower wartoci true, gdy gracz pojawia si w obszarze
wyzwalania, oraz false, gdy go opuszcza. Zapamitaj swój skrypt i wró do rodowiska Unity.
Teraz w wiecie gry umiecimy pomieszczenie do rzucania kokosami, a w dalszej kolejnoci
przypiszemy skrypt do obiektu podrzdnego mat.
Dodawanie pomieszczenia
przeznaczonego do rzucania kokosami
Dziki umieszczeniu w scenie pomieszczenia do rzucania kokosami oraz trzech celów bdziemy
mogli sprawdza kolizje zachodzce midzy orzechami i celami. Stworzymy take skrypt, który
sprawdzi, czy wszystkie trzy cele zostay trafione za jednym razem — jest to warunek zwycistwa
w minigrze. Rozpocznijmy od umieszczenia w wiecie gry pomieszczenia do rzucania kokosami,
a take dodania zderzacza skrzynkowego z aktywnym trybem wyzwalania i powizania go ze
skryptem ThrowTrigger, który wanie napisalimy.
251
Projektowanie gier w rodowisku Unity 3.x
W panelu Project (projekt) odszukaj folder Book Assets/Models (zasoby ksiki/modele). Wybierz
trójwymiarowy model o nazwie coconutShy, aby wywietli jego waciwoci w panelu Inspector
(inspektor).
Importowanie ustawie
Zanim umiecimy pomieszczenie w scenie, stworzymy zderzacze dla kadej czci modelu, aby
si upewni , e ma on waciw skal, pozwalajc na zmieszczenie si w nim postaci gracza.
Aby potwierdzi wprowadzenie zmian, kliknij przycisk Apply (zastosuj) w dolnej czci panelu
Inspector.
Teraz przecignij model z panelu Project na okno Scene (scena), a nastpnie zastosuj narzdzie
Translate (skrót klawiszowy W), by umieci go w pobliu placówki. Dziki temu gracz bdzie
móg zrozumie , e te dwa obiekty s ze sob zwizane. Obró model coconutShy o 150–180
stopni w osi Y przy uyciu komponentu Transform, aby wejcie do niego byo umieszczone po
tej samej stronie co drzwi do placówki. Moesz przeprowadzi pewne indywidualne korekty,
tak by caa konstrukcja wygldaa bardziej naturalnie, a nie jak budynki w miecie, które stoj
równo w rzdzie obok siebie — w kocu jeste na wyspie!
Upewnij si, e pomieszczenie jest waciwie umieszczone: przecignij zielony uchwyt osi Y
w ten sposób, by podstawy supków, które podtrzymuj biao-czerwony brezent, znajdoway si
na powierzchni gruntu. Ta operacja moe by czasochonna — w razie potrzeby uyj klawisza Alt
podczas przecigania myszy, aby odpowiednio zmodyfikowa widok.
Pamitaj, e jeli powierzchnia gruntu, na którym umiecie pomieszczenie, nie jest dokadnie
paska, spowoduje to, e bdzie si ona czy z podog. Moe to wyglda tak, jakby z desek
podogowych wyrastay roliny. Jeli tak jest, po prostu ponownie wybierz obiekt Terrain
w panelu Hierarchy (hierarchia), a nastpnie uyj drugiego w kolejnoci narzdzia z komponentu
Terrain (script), sucego do modyfikacji wysokoci terenu, czyli Paint Height (modyfikacja
wysokoci). Ustal wysoko równ 30, poniewa taki jest poziom gruntu, który zdefiniowalimy
podczas tworzenia wyspy w pocztkowym rozdziale tej ksiki. Obni powierzchni gruntu
do tego poziomu, a nastpnie znowu spróbuj umieci na nim pomieszczenie — warto poo-
enia dla osi Y powinna wynosi 30.
252
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Pojawi si okno dialogowe, informujce, e dodanie tego obiektu podrzdnego spowoduje
utrat poczenia z prefabrykatem. Kliknij przycisk Add (dodaj). Komunikat informuje, e zmiany
wprowadzone w komponentach doczonych do pierwotnego modelu w panelu Project (na
przykad modyfikacja parametrów skryptów) nie bd ju stosowane do kopii obiektu znajdu-
jcego si w scenie, poniewa poczenie midzy instancj a zasobem lub prefabrykatem zostanie
zerwane.
Nastpnie rodowisko Unity wywietli kolejny komunikat z pytaniem, czy chcesz zamieni
istniejcy zderzacz lub doda nowy. Dzieje si tak, poniewa wczeniej zaznaczylimy opcj
wyboru Generate Colliders (stwórz zderzacze), która spowodowaa, e zderzacze siatkowe zostay
doczone do kadego elementu w hierarchii modelu. Zachowajmy zderzacz siatkowy, gdy
chcemy, by gracz móg wchodzi na podest. Wybierz wic opcj Add (dodaj).
Teraz powiniene widzie oba zderzacze (Box Collider i Mesh Collider), dostpne dla obiektu mat
w panelu Inspector. Podczas dodawania zderzacza skrzynkowego do elementu o ksztacie pro-
stopadocianu, takiego jak podest, nastpuje odpowiednie dopasowanie jego rozmiaru do obiektu
docelowego. Zazwyczaj jest to oczekiwane rozwizanie, lecz w naszym przypadku postaramy
si zwikszy wysoko zderzacza skrzynkowego. Wybierz narzdzie Hand (rka), aby ukry
uchwyty osi w widoku Scene (scena), i przytrzymaj klawisz Shift w celu wywietlenia kraw-
dziowych punktów zderzacza. Przecignij punkt znajdujcy si na górze podestu, a osigniesz
wysoko równ w przyblieniu wielkoci postaci gracza.
253
Projektowanie gier w rodowisku Unity 3.x
Gdy zderzacz ma ju waciw skal, aktywuj jego opcj wyzwalania poprzez zaznaczenie opcji
wyboru Is Trigger (jest wyzwalaczem), znajdujcej si w komponencie Box Collider w panelu
Inspector.
Przetestujmy gr! Zapamitaj projekt w rodowisku Unity poprzez wybranie opcji menu gów-
nego File/Save Scene (plik/zapisz scen), a nastpnie kliknij przycisk Play (granie). Moesz teraz
rzuca orzechami kokosowymi jedynie wówczas, gdy stoisz na podecie.
Wybierz folder Scripts (skrypty) w panelu Project (projekt), a nastpnie kliknij przycisk Create
(stwórz), aby stworzy nowy skrypt w wybranym przez Ciebie jzyku programowania. Uywajc
klawisza Return (Mac) lub F2 (PC), zmie jego nazw na TidyObject. Nastpnie dwukrotnie
kliknij ikon znajdujc si przy skrypcie, aby wczyta go do edytora.
Usu ze skryptu domyln funkcj Update(), poniewa nie bdzie nam potrzebna. W celu
wyeliminowania obiektu z sceny moemy po prostu uy funkcji Destroy() i wykorzysta jej
drugi argument do zdefiniowania czasu opónienia. Funkcja ta dziaa nastpujco:
Destroy(który obiekt lub komponent naley usun, opcjonalny czas opónienia);
254
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Aby uczyni skrypt uniwersalnym, stworzymy zmienn publiczn, która pozwoli na zdefiniowa-
nie czasu opónienia. Moemy mie bowiem w przyszoci potrzeb usuwania innych obiektów
po upywie pewnego czasu, lecz nie takiego, jak w przypadku prefabrykatu Coconut. Nad funkcj
Start() umie deklaracj nastpujcej zmiennej:
Jzyk C#:
public float removeTime = 3.0f;
Jzyk JavaScript:
var removeTime: float = 3.0;
Jzyk C#:
void Start () {
Destroy(gameObject, removeTime);
}
Jzyk JavaScript:
function Start(){
Destroy(gameObject, removeTime);
}
Uywajc polecenia Start(), wywoamy funkcj Destroy(), gdy tylko obiekt pojawi si w wie-
cie gry, to znaczy gdy zostanie skonkretyzowany przez gracza po naciniciu przycisku strzau.
Odwoanie do zmiennej gameObject oznacza po prostu: „Uyj obiektu, do którego zosta do-
czony ten skrypt”. Po przecinku umieszczamy zmienn removeTime typu float, zawierajc czas
(mierzony w sekundach), po którego upywie obiekt zostanie usunity.
W wyniku dziaania skryptu wyrzucony orzech kokosowy bdzie pozostawa w wiecie gry przez
trzy sekundy, a nastpnie zostanie usunity. Wybierz opcj File/Save (plik/zapisz) w edytorze
i wró do rodowiska Unity.
Istniej dwa sposoby pozwalajce zastosowa skrypt do prefabrykatu. Prostsza metoda jest
nastpujca:
255
Projektowanie gier w rodowisku Unity 3.x
Przejd do opcji File/Save Project (plik/zapisz projekt) w rodowisku Unity, aby zapamita stan
projektu. Nastpnie kliknij przycisk Play, by przetestowa gr. Gdy stoisz na podecie, moesz
ju rzuca orzechami kokosowymi, które znikaj po upywie domylnych 3 sekund, zdefinio-
wanych w funkcji Destroy(). Oznacza to, e maksymalna liczba kokosów obecnych jednoczenie
w wiecie gry zostaa ograniczona.
W komponencie Animations powinnimy okreli wartoci klatek oraz poda nazwy animacji,
które chcielibymy utworzy dla modelu, podobnie jak uczynilimy w przypadku drzwi placówki.
256
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Dodane animacje mog zosta wywoane w skrypcie, gdy tylko stwierdzimy, e nastpia kolizja
midzy kokosem a odpowiednim elementem obiektu celu.
Dodaj trzy animacje (jak zaprezentowano na poniszym rysunku) poprzez kliknicie ikony plusa
(+), która znajduje si po prawej stronie tabeli animacji. Nastpnie wprowad odpowiednie war-
toci w polach Name (nazwa), Start (pocztek) i End (koniec):
Lokalizacja
Aby w prosty sposób umieci cele wewntrz pomieszczenia, powinnimy je zdefiniowa jako
potomków obiektu platform, znajdujcego si ju w scenie. Aby to zrobi , przecignij model target
z folderu Book Assets/Models w panelu Project, a nastpnie upu na obiekt rodzica coconutShy
w panelu Hierarchy.
Zdefiniowanie obiektu target jako potomka obiektu coconutShy spowoduje, e struktura rodzica
zostanie poszerzona i zaprezentuje nowo dodany element.
Zresetujmy teraz pooenie obiektu target, aby umieci go w samym centrum pomieszczenia.
Dziki temu bdziemy mogli go w prosty sposób przemieszcza . Gdy obiekt target jest wci
wybrany, kliknij ikon kóka zbatego po prawej stronie komponentu Transform, a póniej
wybierz opcj Reset position (resetuj pooenie) z rozwijanego menu. Obiekt target znajduje si
ju w rodku pomieszczenia, dlatego umie my go w pooeniu bardziej odpowiednim dla gracza.
257
Projektowanie gier w rodowisku Unity 3.x
Najpierw obró cel o 180 stopni w osi Y, aby upewni si, e jest zwrócony w stron gracza.
Pamitaj, e wybrana warto nie musi by równa wielkoci obrotu samego pomieszczenia,
gdy cel jest teraz jego obiektem podrzdnym, co powoduje, i wspórzdne s ustalane wzgl-
dem rodzica. W odpowiednich polach Position (pooenie) wprowad wartoci (0, 0, -2,4).
Rozwi obiekt target w panelu Hierarchy poprzez kliknicie szarej strzaki po lewej stronie
nazwy, a nastpnie wykonaj t sam czynno w odniesieniu do potomka target_pivot, co
spowoduje wywietlenie trzech kolejnych obiektów podrzdnych target, target_support_1
i target_support_2.
Bd one animowane w trakcie dziaania gry, dlatego powinny zosta wyposaone w kinematyczny
komponent Rigidbody, niewykorzystujcy prawa grawitacji, aby poprawnie oddziaywa na
inne bryy sztywne (np. orzechy kokosowe), lecz nie ulega istniejcym siom.
258
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Wybierz folder Scripts w panelu Project i kliknij przycisk Create, aby utworzy skrypt w jzyku
C# lub JavaScript. Zmie jego nazw na TargetCollision, a nastpnie dwukrotnie kliknij jego
ikon, by otworzy go w edytorze.
Deklaracja zmiennych
Najpierw musimy zadeklarowa pi zmiennych:
Aby to zrobi , umie poniszy kod w skrypcie przed rozpoczciem funkcji Update():
Jzyk C#:
bool beenHit = false;
Animation targetRoot;
public AudioClip hitSound;
public AudioClip resetSound;
public float resetTime = 3.0f;
Jzyk JavaScript:
private var beenHit : boolean = false;
private var targetRoot : Animation;
var hitSound : AudioClip;
var resetSound : AudioClip;
var resetTime : float = 3.0;
259
Projektowanie gier w rodowisku Unity 3.x
Zwró uwag na to, e zmienne beenHit i targetRoot s prywatne, poniewa nie musz by
dostpne w panelu Inspector — ich wartoci s modyfikowane i uywane jedynie wewntrz
skryptu.
Zmienna beenHit zostanie uyta w kadym obiekcie celu jako wskanik informujcy o jego stanie.
Jeli bdzie równa true (warto ta zostanie przypisana po wykryciu kolizji z orzechem koko-
sowym), cel bdzie uwaany za trafiony i nie bdzie móg przyj kolejnego uderzenia, dopóki
jego stan nie zostanie przywrócony do wartoci pocztkowej.
Mamy take zmienn prywatn targetRoot o typie Animation. Bdzie ona uywana do repre-
zentowania komponentu animacji obiektu, który zosta do niej przypisany w skrypcie. Poniewa
nasz skrypt zostanie przypisany do obiektu podrzdnego w modelu target, zmienn targetRoot
wykorzystamy, aby przechowywa w niej odwoanie do gównego rodzica, do którego doczono
komponent animacji.
Oprócz tego mamy dwie zmienne przechowujce klipy dwikowe, które s odtwarzane po ude-
rzeniu w cel i podczas przywracania jego stanu do wartoci pocztkowej. Wreszcie zmienna typu
float okrela odstp czasowy midzy uderzeniem celu a jego powrotem do stanu pocztkowego.
Zainicjalizujmy zmienn targetRoot w funkcji Start(). Umie poniszy kod w swoim skrypcie:
Jzyk C#:
void Start(){
targetRoot = transform.parent.transform.parent.animation;
}
Jzyk JavaScript:
function Start(){
targetRoot = transform.parent.transform.parent.animation;
}
Nie moemy po prostu napisa transform.parent, poniewa rodzicem obiektu target jest
target_pivot — spójrz na panel Hierarchy, a zobaczysz t zaleno (patrz poniszy rysunek).
Jest to wane, poniewa obiekt podrzdny target nie zawiera komponentu animacyjnego. Dla-
tego te uywamy skadni z kropk, aby odwoa si do jego rodzica (target_pivot), a nastpnie
do rodzica rodzica (target), do którego doczono ju komponent Animation.
260
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Wykrywanie kolizji
Teraz powinnimy sprawdzi , czy obiekt target zosta trafiony przez orzech kokosowy. Stwórz
nastpujc funkcj, która wykrywa kolizj:
Jzyk C#:
void OnCollisionEnter(Collision theObject) {
if(beenHit==false && theObject.gameObject.name=="coconut"){
}
}
Jzyk JavaScript:
function OnCollisionEnter(theObject : Collision) {
if(beenHit==false && theObject.gameObject.name=="coconut"){
}
}
Argument theObject, wykorzystywany w tej funkcji, jest instancj klasy Collision, która dla
danej kolizji przechowuje informacje o prdkociach, bryach sztywnych, zderzaczach, transfor-
macjach, obiektach gry oraz punktach zderzenia. Dlatego te wewntrz instrukcji if po prostu
uyjemy tego argumentu, aby sprawdzi , czy zawiera on informacj o obiekcie gameObject,
nazywajcym si coconut. By upewni si, e cel nie moe zosta wielokrotnie trafiony, uywamy
dodatkowego warunku w poleceniu if, sprawdzajcego, czy zmienna beenHit jest równa false.
Ten przypadek bdzie rozpatrywany na pocztku gry. W funkcji, która zostanie wywoana
w momencie pojawienia si kolizji, zmiennej beenHit zostanie przypisana warto true, dziki
czemu nie bdzie moliwe przypadkowe ponowne jej zresetowanie i ustawienie.
Jednake powinnimy jeszcze wykona odpowiednie polecenia, gdy pojawia si sama kolizja,
zamierzamy bowiem zastosowa inn metod rozwizania problemu, którym si ju kiedy
zajmowalimy.
261
Projektowanie gier w rodowisku Unity 3.x
if(doorTimer>doorOpenTime){
Door(doorShutSound, false, "doorshut");
doorTimer = 0.0f;
}
}
Problem zwizany z resetowaniem naszych celów jest w rzeczywistoci taki sam jak z otwiera-
niem i zamykaniem drzwi — co si dzieje, mamy opónienie czasowe, a nastpnie dzieje si
co innego. Jednake w tym przypadku uzupenimy nasz wiedz programistyczn i zamiast
zastosowa licznik czasu, wykorzystamy rozwizanie zwane wspóprogramem.
Przeprowadzanie dziaa w funkcji Update() jest kosztowne z punktu widzenia wydajnoci gry
i jeli to moliwe, powinno si tego unika . Jednake w celu zapoznania si z mechanizmami
Unity chcielimy zaprezentowa obie metody: poprzedni, wykorzystujc nieefektywn metod
zliczania czasu i resetowania go, oraz teraz omawian, duo bardziej sprawn. Umiejtno two-
rzenia i obsugi liczników czasu jest równie przydatna w innych kontekstach, dlatego te zdo-
byta wiedza nie powinna zosta zapomniana — przyda si w sytuacji, gdy zaczniesz tworzy gr
wykorzystujc mechanizmy czasu!
Wykorzystajmy wic nasz wiedz w praktyce, umieszczajc poniszy kod w skrypcie Target-
Collision:
262
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Jzyk C#:
IEnumerator targetHit(){
audio.PlayOneShot(hitSound);
targetRoot.Play("down");
beenHit=true;
audio.PlayOneShot(resetSound);
targetRoot.Play("up");
beenHit=false;
}
Jzyk JavaScript:
function targetHit(){
audio.PlayOneShot(hitSound);
targetRoot.Play("down");
beenHit=true;
audio.PlayOneShot(resetSound);
targetRoot.Play("up");
beenHit=false;
}
Jak wida , powysza procedura jest prosta, a dodatkowo nie wykorzystujemy ju funkcji Update()
do sprawdzania, czy zmienna beenHit zostaa zmieniona. Nie ma równie potrzeby uycia zmien-
nej typu float, bdcej licznikiem czasu, któr równie naleaoby resetowa .
263
Projektowanie gier w rodowisku Unity 3.x
Gratulacje, wanie napisae swój pierwszy wspóprogram! Jednake musimy go jeszcze wywo-
a w momencie, gdy pojawia si kolizja. Wró do funkcji OnCollisionEnter() i umie w niej
poniszy wiersz kodu, który wywoa wspóprogram, gdy warunki instrukcji if zostan spenione:
Jzyk C# i JavaScript:
StartCoroutine("targetHit");
Jzyk C#:
void OnCollisionEnter(Collision theObject) {
if(beenHit==false && theObject.gameObject.name=="coconut"){
StartCoroutine("targetHit");
}
}
Jzyk JavaScript:
function OnCollisionEnter(theObject : Collision) {
if(beenHit==false && theObject.gameObject.name=="coconut"){
StartCoroutine("targetHit");
}
}
Powyszy kod wywouje wspóprogram, korzystajc z jego nazwy — proste, nieprawda? I to jest
wszystko, czego potrzebujemy. Nasz skrypt zarzdza wszystkim, poniewa zmienna beenHit
jest odpowiednio modyfikowana przez wspóprogram, bez wzgldu na to, czym bdziemy rzu-
ca . Procedura na pewno bdzie dziaa .
Jzyk C#:
Zlokalizuj ponisze wiersze w skrypcie:
using UnityEngine;
using System.Collections;
Pod nimi, a jednoczenie nad deklaracj klasy, umie taki wiersz kodu:
[RequireComponent (typeof (AudioSource))]
Jzyk JavaScript:
Umie nastpujcy wiersz kodu na kocu skryptu:
@script RequireComponent(AudioSource)
264
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Przypisywanie skryptu
W panelu Hierarchy rozwi model target, który zosta dodany do projektu, co spowoduje
wywietlenie jego obiektów podrzdnych. Nastpnie rozwi grup target_pivot, aby uzyska
dostp do obiektu target i jego potomków. Struktura powinna wyglda tak jak na rysunku:
Na powyszym rysunku widzimy, e zosta wybrany model siatkowy okrgej tarczy celu (target).
Ty równie go wybierz, a nastpnie przemie kursor myszy nad okno Scene i nacinij klawisz F,
by przybliy widok. Powinnimy sprawdza wystpowanie kolizji z elementem podrzdnym,
nie chcemy bowiem, aby byy one wykrywane, gdy gracz uderzy kokosem na przykad w supki
utrzymujce tarcz.
Gdy obiekt target jest wybrany, przejd do opcji menu gównego Component/Scripts/Target
Collision (komponent/skrypty/Target Collision). Z obiektem zostanie poczony wanie napisany
przez nas skrypt, wcznie z komponentem Audio Source. Teraz przecignij pliki dwikowe
target_hit oraz target_reset z folderu Book Assets/Sounds (zasoby ksiki/dwiki) w panelu
Project, a nastpnie upu je na odpowiednie zmienne publiczne w panelu Inspector.
Wybierz opcj menu gównego File/Save Scene (plik/zapamitaj scen), aby zapamita biecy
stan sceny. Kliknij przycisk Play, eby rozpocz testowanie gry, i sta na podecie (czyli obiek-
cie mat), by aktywowa zderzacz wyzwalajcy. Teraz powiniene mie moliwo rzucania
orzechami kokosowymi i trafiania w cel. Ponownie kliknij przycisk Play, by przerwa testy.
Aby ukoczy tworzenie minigry, musimy umieci w niej jeszcze dwie tarcze, uywajc do tego
systemu prefabrykatów.
265
Projektowanie gier w rodowisku Unity 3.x
Nazwa target w panelu Hierarchy zmieni kolor na niebieski, co oznacza, e obiekt zosta
podczony do prefabrykatu w projekcie.
Teraz wybierz obiekt rodzica target w panelu Hierarchy, a nastpnie nacinij skrót klawiszowy
Command+D (Mac) lub Ctrl+D (PC), by utworzy jego kopi.
Wygrywanie gry
Aby zapewni pen funkcjonalno minigry i udostpni graczowi ostatnie ogniwo energetyczne
potrzebne do zasilania generatora otwierajcego drzwi, musimy stworzy skrypt, który bdzie
sprawdza , czy wszystkie trzy cele zostay trafione za jednym razem.
Wybierz folder Scripts (skrypty) w panelu Project (projekt), a nastpnie uyj przycisku Create
(stwórz), by utworzy plik w jzyku C# lub JavaScript. Zmie nazw skryptu na CoconutWin
oraz dwukrotnie kliknij jego ikon, eby wczyta go do edytora.
Deklaracja zmiennych
Umie ponisze cztery zmienne na pocztku skryptu:
266
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Jzyk C#:
public static int targets = 0;
public static bool haveWon = false;
public AudioClip winSound;
public GameObject cellPrefab;
Jzyk JavaScript:
static var targets : int = 0;
static var haveWon : boolean = false;
var winSound : AudioClip;
var cellPrefab : GameObject;
Pierwsza zmienna statyczna targets przechowuje informacj o tym, ile celów jest w danym
momencie trafionych — jej inicjalizacja zostanie póniej umieszczona w skrypcie TargetCollisions.
Kolejna zmienna statyczna haveWon zakoczy minigr, gdy po pierwszym zwycistwie zostanie
jej przypisana warto true. Bdziemy si do niej odwoywa podczas sprawdzania, czy graczowi
powinny zosta wywietlone wskazówki. Jeli wygra ju gr, wskazówki nie bd potrzebne.
Nastpnie deklarujemy dwie zmienne publiczne: jedn, która przechowuje klip audio, oraz
drug, zawierajc odwoanie do ogniwa energetycznego. Gdy gracz wygra minigr, w skrypcie
utworzymy instancj nowej baterii na podstawie prefabrykatu, który zosta przez nas stworzony.
Usuniemy równie widoczne ogniwo energetyczne, które znajduje si w pomieszczeniu. Sprawi
to wraenie, e gracz po wygraniu gry otrzyma brakujc bateri.
Jzyk C#:
if(targets==3 && haveWon == false){
targets=0;
audio.PlayOneShot(winSound);
GameObject winCell = transform.Find("powerCell").gameObject;
winCell.transform.Translate(-1,0,0);
Instantiate(cellPrefab, winCell.transform.position, transform.rotation);
Destroy(winCell);
haveWon = true;
}
Jzyk JavaScript:
if(targets==3 && haveWon == false){
targets=0;
audio.PlayOneShot(winSound);
var winCell : GameObject = transform.Find("powerCell").gameObject;
267
Projektowanie gier w rodowisku Unity 3.x
winCell.transform.Translate(-1,0,0);
Instantiate(cellPrefab, winCell.transform.position, transform.rotation);
Destroy(winCell);
haveWon = true;
}
Instrukcja if skada si z dwóch warunków. Pierwszy z nich zapewnia, e warto zmiennej
target jest równa 3, co oznacza, i wszystkie cele zostay trafione. Drugi — e zmienna haveWon
jest równa false, czyli gracz nie ukoczy jeszcze minigry.
Jzyk C#:
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (AudioSource))]
268
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
void Update () {
if(targets==3 && haveWon == false){
targets=0;
audio.PlayOneShot(winSound);
GameObject winCell = transform.Find("powerCell").gameObject;
winCell.transform.Translate(-1,0,0);
Instantiate(cellPrefab, winCell.transform.position,
´transform.rotation);
Destroy(winCell);
haveWon = true;
}
}
}
Jzyk JavaScript:
static var targets : int = 0;
static var haveWon : boolean = false;
var winSound : AudioClip;
var cellPrefab : GameObject;
function Update () {
if(targets==3 &&haveWon == false){
targets=0;
audio.PlayOneShot(winSound);
var winCell : GameObject = transform.Find("powerCell").gameObject;
winCell.transform.Translate(-1,0,0);
Instantiate(cellPrefab, winCell.transform.position, transform.rotation);
Destroy(winCell);
haveWon = true;
}
}
@scriptRequireComponent(AudioSource)
Przypisywanie skryptu
Wybierz obiekt nadrzdny coconutShy w panelu Hierarchy (hierarchia) i przejd do opcji menu
gównego Component/Scripts/Coconut Win (komponent/skrypty/Coconut Win).
269
Projektowanie gier w rodowisku Unity 3.x
Jest to proste zadanie, poniewa nasz skrypt jest ju gotowy do obsugi powyszych dwóch funkcji
wewntrz jednego wspóprogramu. Przejd wic do skryptu TargetCollision lub gdy nie jest on
otwarty, dwukrotnie kliknij jego ikon w folderze Scripts (skrypty), aby uruchomi edytor.
W obu przypadkach zwikszania i zmniejszania licznika uywamy skadni z kropk, aby uzyska
dostp do skryptu (lub nazwy klasy). Nastpnie wystpuje nazwa zmiennej statycznej targets
oraz zapis ++ lub --, sucy odpowiednio do jej zwikszania lub zmniejszania. Wymienione
cigi znaków s skrótowymi instrukcjami, które zwikszaj i zmniejszaj zmienn o warto 1.
Mog one zosta równie zapisane w postaci +=1 i -=1.
270
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
W edytorze przejd do opcji menu gównego File/Save (plik/zapisz), a nastpnie wró do rodo-
wiska Unity.
Kliknij przycisk Play (granie), aby przetestowa gr. Rzucanie orzechami kokosowymi i strcenie
wszystkich trzech celów powinno spowodowa pojawienie si dodatkowego ogniwa energetycz-
nego, które moesz zabra . Gdy to nastpi, podejd i je we, podobnie jak uczyniby z jego
innymi instancjami. Kliknij przycisk Play, aby zakoczy testy, a póniej wybierz w rodowisku
Unity opcj menu gównego File/Save Scene (plik/zapisz scen), by zapisa biecy stan sceny.
Kocowe usprawnienia
Aby uczyni minigr bardziej interesujc, na wywietlaczu póprzezroczystym umiecimy celow-
nik, który bdzie aktywowany, gdy gracz stanie na podecie. Wykorzystamy take istniejcy
obiekt TextHintGUI do przekazania graczowi wskazówki, co naley zrobi , by wygra t gr.
Dodawanie celownika
Aby umieci celownik w scenie, wykonaj nastpujce czynnoci:
Obiekt zostanie automatycznie wybrany w panelu Hierarchy, dziki czemu w panelu Inspector
pojawi si komponent GUITexture. Jeli opcja Game Overlay (warstwy gry) jest wczona, obraz
celownika powinien by równie widoczny w widokach Game (gra) i Scene (scena). Poniewa
domylnie pojawia si on w rodku okna, dokadnie pasuje do naszego niewielkiego pliku tekstury
o rozmiarze 64×64 piksele.
Podczas tworzenia pliku tekstury dla tego obiektu byo wane, e uylimy jasnych i ciemnych
krawdzi, dziki czemu celownik jest dobrze widoczny bez wzgldu na to, na co spoglda gracz.
271
Projektowanie gier w rodowisku Unity 3.x
Wskazówka
Pamitaj, e jeli podczas tworzenia obiektu GUITexture nie wybierzesz pliku tekstury, zostanie wywie-
tlone domylne logo Unity. Musisz nastpnie wybra waciw tekstur w panelu Inspector oraz poda
odpowiednie wymiary. Z tego powodu lepiej jest najpierw wybra tekstur, która posuy do utworzenia
obiektu GUITexture.
Jzyk C#:
public GUITexture crosshair;
Jzyk JavaScript:
var crosshair : GUITexture;
Zadeklarowany obiekt moemy teraz z atwoci wcza i wycza wewntrz funkcji OnTrigger
´Enter() oraz OnTriggerExit().
Jzyk C# i JavaScript:
crosshair.enabled=true;
Zapamitaj skrypt i wró do rodowiska Unity. Wybierz obiekt podrzdny mat, nalecy do
rodzica coconutShy, co spowoduje, e w komponencie Throw Trigger (script) bdziesz móg
zobaczy nowo dodan zmienn publiczn Crosshair. Przecignij na ni obiekt Crosshair z
panelu Hierarchy.
Wreszcie upewnij si, e celownik bdzie domylnie wyczony. W tym celu wybierz obiekt
Crosshair w panelu Hierarchy, a nastpnie wycz opcj wyboru, znajdujc si obok komponentu
GUITexture w panelu Inspector. Zapamitaj stan projektu, wybierajc opcj menu gównego
File/Save Scene, a nastpnie kliknij przycisk Play, by przetestowa gr. Celownik powinien
pojawia si w scenie jedynie wówczas, gdy znajdujesz si na podecie w pomieszczeniu do rzu-
cania orzechami. Gdy wyjdziesz z niego, powinien od razu znikn .
272
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
Jzyk C#:
public GUIText textHints;
Jzyk JavaScript:
var textHints : GUIText;
Jzyk C# i JavaScript:
if(!CoconutWin.haveWon){
textHints.SendMessage("ShowHint", "\n\n\n\n\n There's a power cell attached
´to this game, \n maybe I'll win it if I can knock down all the
´targets...");
}
Dziki powyszemu kodowi aktywujemy obiekt TextHintGUI jedynie wówczas, gdy zmienna
statyczna haveWon w skrypcie CoconutWin jest równa false. Wskazuje na to uycie wykrzyknika
na pocztku warunku. W rzeczywistoci sprawdzamy, czy zmienna nie jest równa true. Jeli jest
ona równa false, wczamy obiekt TextHintGUI poprzez uycie polecenia SendMessage(), podob-
nie jak czynilimy to w skrypcie TriggerZone dla drzwi placówki.
Tak jak poprzednio wywoujemy funkcj ShowHint(), przekazujc jej nastpujcy acuch tek-
stowy:
"\n\n\n\n\n There's a power cell attached to this game, \n maybe I'll win it if
´I can knock down all the targets...");
Moesz zauway , e w tekcie znajduje si kilka znaków \n. S to instrukcje przejcia do
nowego wiersza. Dlaczego wic uywamy a piciu tego typu wyrae na samym pocztku
naszego tekstu? Czy potrafisz odgadn ?
Dzieje si tak, poniewa w tym samym czasie na ekranie wywietlamy równie celownik. Aby
unikn nakadania si tych dwóch elementów, a take koniecznoci zmiany pooenia obiektu
TextHintGUI, troch oszukujemy i umieszczamy na pocztku pi pustych wierszy, by odpowied-
nio obniy pooenie wywietlanego tekstu.
Wykorzystujemy take znak nowego wiersza, aby podzieli wywietlany acuch tekstowy na
dwie czci, dziki czemu jest on atwiejszy do odczytania.
273
Projektowanie gier w rodowisku Unity 3.x
Zapamitaj skrypt i wró do rodowiska Unity. W komponencie Throw Trigger (Script) musimy
przypisa nasz zmienn publiczn do obiektu TextHintGUI. W tym celu w panelu Hierarchy
wybierz obiekt mat, bdcy potomkiem obiektu coconutShy. Nastpnie przecignij obiekt
TextHintGUI z panelu Hierarchy na zmienn Text Hints.
Kliknij przycisk Play, eby przetestowa gr. Stojc na podecie, powiniene widzie celownik
oraz tekst wskazówki, który dodalimy.
Po zejciu gracza z podestu celownik powinien znikn , a po nim, za kilka sekund, zniknie
równie wywietlana wiadomo . Ponownie kliknij przycisk Play, aby zakoczy testowanie
gry, i wybierz opcj menu gównego File/Save Project (plik/zapisz projekt) w celu zapisania
stanu projektu.
Podsumowanie
W tym rozdziale omówilimy róne zagadnienia, które maj due znaczenie podczas tworzenia
kadego rodzaju scenariusza gry. Przyjrzelimy si implementacji obiektów bry sztywnych
w kontekcie tworzenia animowanych elementów dynamicznych oraz pocisków. Tego typu
wiedza bdzie czsto wykorzystywana przez Ciebie w wielu scenariuszach gier tworzonych
w rodowisku Unity. Zajlimy si równie dokadniej procesem konkretyzacji, o którym wspo-
minalimy ju na pocztku ksiki podczas tworzenia przykadowego prototypu. Stworzylimy
274
Rozdzia 7. • Konkretyzowanie obiektów i bryy sztywne
mechanik gry, która jest zwizana z naszym projektem, poniewa zmusza gracza do nawizania
interakcji z okrelonym skadnikiem w celu uzyskania dostpu do placówki. Oprócz tego zapla-
nowalimy i zaimplementowalimy prost amigówk, polegajc na wygraniu minigry wyko-
rzystujcej rzucanie orzechami kokosowymi do celu. Zwycistwo w niej pozwoli graczowi na
uzyskanie dostpu do ostatniego ogniwa energetycznego, które jest niezbdne do zasilania
generatora otwierajcego drzwi placówki.
Zagadnienia omówione w tym rozdziale bd wykorzystywane zarówno w dalszej czci tej
ksiki, jak i w Twoich przyszych projektach w rodowisku Unity. W nastpnym rozdziale zro-
bimy sobie przerw w kodowaniu i zajmiemy si dokadniej efektami wizualnymi. Przeanali-
zujemy systemy czstek, pozwalajce na utworzenie ogniska na zewntrz budynku placówki.
Stanie si on naszym kocowym celem gry — gracz bdzie musia znale w budynku pudeko
zapaek, które zostanie uyte do rozpalenia ognia oraz wysania dziki temu widocznego sygnau
pomocy.
275
Projektowanie gier w rodowisku Unity 3.x
276
8
Systemy czstek
W tym rozdziale zajmiemy si bardziej uniwersalnymi efektami renderingu, które mog zosta
osignite w wiecie 3D dziki uyciu systemów czstek. Gry wykorzystuj systemy czstek,
by stworzy wiele rónych efektów, poczynajc od mgy i dymu, a koczc na iskrach, pro-
mieniach laserów i prostych ksztatach. W niniejszym rozdziale przyjrzymy si metodzie uzy-
skiwania symulacji ognia przez zastosowanie dwóch systemów czstek.
Q Particle Emitter (emiter czstek) — obsuguje tworzenie czstek, ich czas ycia,
prdkoci i zasig dziaania,
Q Particle Animator (animator czstek) — okrela zachowanie czstki podczas jej ycia,
Q Particle Renderer (renderer czstek) — definiuje wygld renderowanych czstek.
Zanim rozpoczniemy prac z samymi systemami, powinnimy zapozna si dokadniej z wymie-
nionymi powyej komponentami.
Projektowanie gier w rodowisku Unity 3.x
Particle Emitter
Emiter jest odpowiedzialny za tworzenie poszczególnych czstek. W rodowisku Unity s
dostpne elipsoidalne oraz siatkowe emitery czstek.
Emiter elipsoidalny jest najczciej uywany do tworzenia efektów, takich jak dym i kurz, oraz
innych skadników otoczenia, które mog si pojawia w ograniczonej przestrzeni. Jego nazwa
wynika std, i tworzy czstki wewntrz trójwymiarowej przestrzeni o ksztacie elipsoidal-
nym. W trakcie swojego ycia mog si one jednak rozprzestrzenia poza ten obszar.
Emiter siatkowy tworzy czstki, które s bezporednio zwizane z ksztatem siatki trójwymia-
rowej i mog by animowane na jej powierzchni lub po prostu emitowane z jej wierzchoków.
Tego typu emitery s czciej uywane w przypadkach, gdy naley bezporednio zarzdza poo-
eniem czstek. Udostpnienie projektantowi moliwoci obsugi wierzchoków siatki oznacza,
e moe on tworzy precyzyjnie dziaajce systemy czstek, zawierajce si w dowolnym kszta-
cie trójwymiarowym.
Z punktu widzenia komponentów oba wyej wymienione emitery zawieraj nastpujce wspólne
parametry:
W dalszej czci tego rozdziau przyjrzymy si bardziej szczegóowym ustawieniom, zwizanym
z okrelonym typem emiterów. W przypadku naszego zadania, dotyczcego tworzenia ognia,
uyjemy emitera elipsoidalnego, który pozwoli na uzyskanie bardziej przypadkowych efektów,
poniewa nie jest zwizany z okrelonym ksztatem siatki.
Particle Animator
Animator definiuje sposób zachowania si poszczególnych czstek w miar upywu czasu.
Aby uzyska odpowiedni dynamik dziaania, czstki maj okrelony czas ycia, po którym
nastpuje ich samounicestwienie. W przypadku tworzenia ognia czstki powinny by animo-
wane, dziki czemu ich wygld bdzie si zmienia w trakcie ich ycia w wiecie gry.
Pomienie rzeczywistego ognia zmieniaj si przez cay czas, wzrastajc i przygasajc. Moemy
uy animatora w celu uzyskania odpowiedniej zmiennoci koloru i widocznoci symulowa-
nego ognia, a take zastosowa odpowiednie siy do samych czstek, by uzyska wraenie dyna-
miki ruchu.
278
Rozdzia 8. • Systemy czstek
Particle Renderer
Renderer definiuje wygld poszczególnych czstek. Czstki s w rzeczywistoci kwadratowymi
sprajtami (elementami dwuwymiarowymi), renderowanymi w wikszoci przypadków tak jak
trawa, któr umiecilimy na naszym terenie w rozdziale 3. Sposób ten polega na wykorzystaniu
techniki billboardingu, sprawiajcej, e obiekt jest zawsze skierowany w kierunku kamery.
Renderery w rodowisku Unity mog wywietla czstki przy uyciu rónych metod, lecz wród
nich najczciej jest wykorzystywany billboarding.
Komponent Particle Renderer obsuguje take materiay uyte w systemie czstek. Poniewa
s one traktowane jako sprajty, moliwe staje si uycie w komponencie renderera odpowied-
nich procedur cieniowania materiaów. Oznacza to, e korzystajc z kanau alfa (przezroczy-
stoci) w celu zaokrglenia krawdzi tekstur, moesz stworzy iluzj istnienia elementów o kszta-
cie rónym od kwadratowego. Na poniszym rysunku zaprezentowano to, co wkrótce zastosujemy
w naszym materiale, czyli przykad z ogniem — ciemne obszary oznaczaj wczon przezro-
czysto .
W wyniku zastosowania opcji przezroczystoci czstki nie bd ju miay kwadratowych kszta-
tów, jak w przypadku zwykych sprajtów 2D. Dziki poczeniu renderingu jedynie widocz-
nych czci tekstury z wysokimi wartociami emisji emitera bdziemy mogli uzyska wrae-
nie spoistoci materiau.
Renderery mog równie animowa czstki przy uyciu animacji UV. Wykorzystuje si do tego
zestawy obrazów, by skutecznie zamienia tekstury w trakcie ycia czstek. Jest to jednak bar-
dziej zaawansowane rozwizanie ni te, które omawiamy w niniejszej ksice, dlatego propo-
nujemy, aby zapozna si z odpowiednim fragmentem dokumentacji w celu uzyskania bardziej
szczegóowych informacji: http://unity3d.com/support/documentation/Components/class-Particle
Renderer.html.
279
Projektowanie gier w rodowisku Unity 3.x
Zastanowimy si teraz nad kolejnym etapem projektowania naszej gry, którego kulminacj bdzie
rozpalenie ogniska, zdefiniowanego za pomoc dwóch systemów czstek. Jeden z nich bdzie
odpowiedzialny za tworzenie ognia, a drugi — dymu.
Definiowanie zadania
Nasza istniejca gra zawiera zadanie dla gracza, które powinno zosta wykonane, by uzyska
dostp do placówki. Gracz musi mianowicie zgromadzi cztery ogniwa energetyczne, z których
jedno powinno zosta wygrane w grze, stworzonej przez nas w poprzednim rozdziale i pole-
gajcej na rzucaniu kokosami do celu.
Po wejciu do budynku placówki gracz doznaje pewnego rozczarowania, poniewa nie znajduje
w nim nic oprócz pustego biurka. W tym rozdziale wprowadzimy pewn zmian, polegajc na
umieszczeniu w placówce pudeka zapaek, które moe zosta znalezione przez gracza. Nastpnie
na zewntrz stworzymy ognisko, które bdzie mogo zosta rozpalone jedynie wówczas, gdy
gracz zdobdzie zapaki. Moemy poinformowa gracza, e musi rozpali ognisko, co spowo-
duje, e bdzie on szuka pudeka zapaek, czyli przystpi do wykonania okrelonego zadania
(otwarcia drzwi placówki).
Aby zrealizowa powyszy scenariusz, w rodowisku Unity musz zosta wykonane nastpu-
jce czynnoci:
Uyte zasoby
Nasze wiczenie bdzie wykorzystywa kilka plików, które zostay ju zaimportowane w ramach
zasobów zwizanych z t ksik:
280
Rozdzia 8. • Systemy czstek
Sprawi to, e model zostanie zaimportowany do naszej sceny i bdzie mia odpowiedni rozmiar
w stosunku do innych obiektów, które ju w niej istniej. Aby zatwierdzi wprowadzenie zmian,
kliknij przycisk Apply (zastosuj) w dolnej czci panelu Inspector.
A teraz przecignij model ogniska na obszar Scene (scena) i uyj narzdzia Transform, aby
umieci go obok obiektów placówki i pomieszczenia do rzucania orzechami kokosowymi, które
ju si tam znajduj.
281
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Modele znajdujce si w rodowisku Unity mog wymaga przeprowadzenia operacji zmiany skali. Jeli
tworzysz je sam, powi troch czasu na zdefiniowanie waciwej skali, w której bd one wystpowa
po zaimportowaniu. Upewnij si, e wczytany model szecianu o rozmiarze (1, 1, 1) odpowiada
skal temu samemu typowi obiektu, utworzonemu w rodowisku Unity. Bdziesz móg zauway, e
wymiary tworzonych obiektów róni si w zalenoci od uytego narzdzia modelowania.
Poniewa nie chcemy, bo gracz móg przechodzi przez ten model, musimy zdefiniowa dla
niego odpowiedni zderzacz. W tak zoonych modelach jak nasz uywa si zazwyczaj kompo-
nentu FBXImporter do wygenerowania zderzaczy siatkowych dla kadej oddzielnej siatki, która
si w nim znajduje. Skoro jednak wiemy o tym, e chcemy tylko sprawi , by gracz móg uderzy
w obiekt, moemy wykorzysta prosty zderzacz kapsuowy. W naszym przypadku bdzie on ca-
kiem dobrze wykonywa swoje zadanie, a dodatkowo pozwoli na zaoszczdzenie mocy procesora,
poniewa nie bdzie konieczne tworzenie zderzaczy dla kadej siatki zwizanej z modelem.
Wybierz obiekt campfire w panelu Hierarchy (hierarchia) i przejd do opcji menu gównego
Component/Physics/Capsule Collider (komponent/parametry fizyczne/zderzacz kapsuowy).
W wywietlonym oknie dialogowym Losing Prefab (utrata poczenia z prefabrykatem) zosta-
niesz poproszony o zgod na odczenie instancji od pierwotnego modelu. Jak zwykle kliknij
przycisk Add (dodaj).
Przy podstawie obiektu ogniska pojawi si niewielki, kulisty zderzacz. Musimy zwikszy jego
rozmiar, aby zawrze w nim cay obiekt. W tym celu uyj narzdzia Hand (rka) (skrót klawi-
szowy Q), a nastpnie, trzymajc wcinity klawisz Shift, odpowiednio przecignij punkty lece
na krawdziach zderzacza. Moesz take zmodyfikowa odpowiednie parametry komponentu
282
Rozdzia 8. • Systemy czstek
Capsule Collider, znajdujcego si w panelu Inspector (inspektor): w polu Radius (promie)
wprowad warto 2, w polu Height (wysoko ) — 3, natomiast w polu Y dla opcji Center
(rodek) wpisz 1. Twój zderzacz powinien wyglda podobnie do tego na poniszym rysunku.
Przeprowadzenie testu gry potwierdzi, e gracz moe si ju zderza z obiektem.
Tworzenie ognia
Na samym pocztku musimy zdefiniowa obiekt gry, który zawiera trzy podstawowe komponenty
zwizane z systemem czstek. W panelu Hierarchy (hierarchia) kliknij przycisk Create (stwórz),
a nastpnie wybierz opcj Particle System (system czstek). Alternatywnie moesz przej do
opcji menu gównego GameObject/Create Other/Particle System (obiekt gry/stwórz inny/system
czstek). Zmie nazw stworzonego systemu na FireSystem (PC: F2, Mac: Return) i upewnij si,
e nie wystpuje w niej aden znak spacji. Jest to wane, poniewa pozwoli nam zachowa
konsekwentne nazewnictwo w tworzonych skryptach.
Pamitaj, e dopóki nie ukoczymy definicji systemu czstek dla ognia, nie musimy jeszcze
okrela jego pooenia. Dlatego te moe on zosta umieszczony w dowolnym miejscu trójwy-
miarowego wiata, z wyjtkiem sytuacji, w której znajdzie si pod ziemi. W tym przypadku
283
Projektowanie gier w rodowisku Unity 3.x
uyj narzdzia Translate (skrót klawiszowy W), aby go umieci na powierzchni gruntu, dziki
czemu bdzie widoczny w oknie Scene (scena). Moesz go nastpnie przemieci do obiektu
ogniska, by mu si przyjrze w tym kontekcie. eby to zrobi , po prostu wybierz obiekt campfire
w panelu Hierarchy. Póniej przemie kursor myszy nad widok Scene i nacinij klawisz F, aby
przybliy widok ogniska. Wybierz obiekt FireSystem w panelu Hierarchy, po czym przejd do
opcji menu gównego GameObject/Move to View (obiekt gry/umie w widoku).
W polu Min Energy (energia minimalna) wprowad warto 1, a w polu Max Energy (energia
maksymalna) — 1,5. Te parametry definiuj czas ycia i oznaczaj, e czstki bd istnie
w wiecie gry przez 1 sekund do 1,5 sekundy, po czym nastpi ich automatyczne samounice-
stwienie. W polu Min Emission (emisja minimalna) wprowad warto 15, a w Max Emission
(emisja maksymalna) — 20. Parametry te okrelaj, ile czstek w danym momencie istnieje
w scenie. Im s one wysze, tym wicej czstek bdzie wystpowa , co przyczyni si do zwik-
szenia gstoci pomieni. Jednake generowanie wikszej liczby czstek moe by kosztowne
dla procesora karty graficznej. Ogólnie mówic, wybrane przez nas ustawienia s minimalnymi
wartociami, które mog by ju akceptowane z punktu widzenia estetyki.
W polu Y opcji Word Velocity (prdko wiata) wprowad warto 0,1. Spowoduje to, e czstki
bd si unosi w gór podobnie jak prawdziwe pomienie.
Wykorzystalimy opcj Word Velocity, poniewa dotyczy ona obiektów, które w wiecie gry
musz si zawsze porusza w gór. Gdyby dla obiektu, który w trakcie gry si porusza i obraca,
zosta uyty parametr Local Velocity (prdko lokalna), wówczas jego lokalna o Y nie odpowia-
daaby osi Y dla wiata.
Na przykad ponca beczka, obsugiwana przez silnik fizyczny, mogaby si rozpa , co spo-
wodowaoby, e osie doczonego do niej systemu czstek obróciyby si. Pomienie powinny
si jednake wci unosi we wspórzdnych wiata. Poniewa ognisko nie porusza si, warto
zrozumie rónice midzy jego wspórzdnymi lokalnymi i globalnymi.
284
Rozdzia 8. • Systemy czstek
W polu Y opcji Rnd Velocity (prdko losowa) wprowad warto 0,2. Spowoduje to, e nie-
które pomienie bd wysze ni pozostae.
Parametr Tangent Velocity (prdko stycznej) powinien przyj warto 0,1 dla obu pól X i Z;
warto 0 naley pozostawi dla osi Y. Definiuje on pocztkow prdko oraz kierunek ruchu
poszczególnych czstek w odniesieniu do przestrzeni elipsoidalnej, w której s one genero-
wane. Przypisanie osiom X i Z powyszych wartoci oznacza, e pomienie bd miay ten-
dencj do rozprzestrzeniania si w poziomie.
Pole Emitter Velocity Scale (skala prdkoci emitera) moe mie warto 0. Jest ono wane
jedynie w przypadku poruszajcych si systemów czstek i okrela, jak szybko czstki prze-
mieszczaj si, gdy ich obiekt nadrzdny jest w ruchu. Poniewa ognisko jest statyczne, parametr
Emitter Velocity Scale moe by równy 0.
Parametr Simulate in Worldspace (symulacja w przestrzeni wiata) okrela, czy czstki pod-
aj za obiektem gry, w którym zostay utworzone, czy te pozostaj w swoim pooeniu, zde-
finiowanym w przestrzeni wiata, podczas gdy sam system si porusza. Nasze ognisko nie bdzie
si przemieszcza , dlatego te parametr ten nie jest dla nas wany. Jednake gdybymy utwo-
rzyli poruszajc si pochodni, chcielibymy wczy t opcj, aby spowodowa , e pomie
bdzie porusza si w przestrzeni wiata, lecz jednoczenie bdzie wci emitowany z okre-
lonego miejsca obiektu, do którego naley.
Opcja One Shot (pojedynczy incydent) powinna zosta niewczona, poniewa chcemy, by
ogie pon przez cay czas. Byaby ona bardziej przydatna na przykad w czasie tworzenia
pojedynczego oboku dymu, wystpujcego po wystrzale armatnim.
Wartoci pola Ellipsoid (elipsoida) mog by równe 0,5 dla kadej z osi. S one niewielkie,
poniewa system czstek powinien generowa pomienie w niewielkim obszarze. W przypadku
pióropusza dymu nad wulkanem parametry pola Ellipsoid powinny by odpowiednio wik-
sze, co pozwoli czstkom unosi si znacznie wyej ni w zwykym ognisku.
Swoje dziaania rozpocznij od upewnienia si, e opcja Does Animate Color (czy animowa
kolory) jest wczona. Spowoduje to pojawienie si piciu obszarów Color Animation (anima-
cja koloru). Kliknij kady z nich, a pojawi si okno wyboru koloru. Wybierz odcienie od biaego
(Color Animation[0]) do ciemnopomaraczowego (Color Animation[4]).
Nastpnie zdefiniuj odpowiednie wartoci kanau alfa (suwak A w dolnej czci okna wyboru
koloru) w taki sposób, by pola Color Animation[0] i Color Animation[4] miay ten sam poziom
285
Projektowanie gier w rodowisku Unity 3.x
Jeli czytasz ksik w wersji papierowej, nie wiesz dokadnie, jakie kolory powinny zosta
wybrane, poniewa ilustracje zostay wydrukowane w odcieniach szaroci. Zmodyfikuj wic
wartoci znajdujce si przy suwakach RGBA w taki sposób, aby odpowiaday poniszym
ustawieniom.
Twój system czstek, widoczny w oknie Scene, bdzie si teraz zachowywa bardziej naturalnie,
a jego skadniki powinny zmienia kolor i wartoci kanau alfa.
Uwaga
Wynik dziaania elementu Color Animation moe by mniej lub bardziej widoczny. Zaley to od tego, jakie
materiay, uyte w systemie czstek, wykorzystuj okrelone procedury cieniowania — niektóre z nich
prezentuj kolory w wikszym stopniu ni inne. Na przykad procedury cieniowania z przezroczystoci
mog prezentowa kolory w sposób mniej widoczny.
Wartoci opcji Rotation Axis (o obrotu) powinny by równe 0 dla wszystkich osi. W polu Size
Grow (zwikszanie rozmiaru) wprowad warto -0,3. Dziki temu czstki bd si zmniejsza
w trakcie swojego ycia, co stworzy bardziej dynamiczny wygld ognia.
286
Rozdzia 8. • Systemy czstek
Teraz powinnimy zastosowa siy, by uzyska bardziej realistyczny ruch pomieni. Siy róni
si od prdkoci zdefiniowanych w ustawieniach emitera, poniewa s uywane w momencie
tworzenia czstek. Powoduj one przyspieszenie ich ruchu, a nastpnie jego spowolnienie
i kontynuowanie z prdkoci okrelon w parametrach emitera. Rozwi pole Rnd Force (sia
losowa) poprzez kliknicie szarej strzaki, znajdujcej si po lewej stronie jego nazwy, a nastpnie
wprowad warto 1 w pozycjach X i Z. Nastpnie w taki sam sposób rozwi pole Force (sia)
i wprowad w pozycji Y warto równ 1.
Poniewa czstki lub pomienie ognia powinny faktycznie emitowa wiato, wyczymy obie
opcje Cast Shadows (rzucaj cienie) i Receive Shadows (wywietlaj cienie), aby upewni si, e
nie bd one rzuca adnych cieni. Pamitaj, e wykonana przez nas czynno ma sens jedy-
nie dla uytkowników systemu Unity Pro, gdy wersja darmowa nie obsuguje dynamicznego
cieniowania.
Teraz adne materiay nie s przypisane do systemu czstek, dlatego te obszar Materials
(materiay) nie zawiera adnych pozycji. Za chwil zostanie to zmienione. Upewnij si, e pole
Camera Velocity Scale (skala prdkoci kamery) zawiera warto 0. Mogoby by ono wykorzy-
stywane jedynie wówczas, gdyby rendering naszych czstek nie stosowa opcji billboardingu.
Jeli chcielibymy dynamicznie zmienia rozmiar czstek, uylibymy tego pola w celu okre-
lenia poziomu wpywu ruchu kamery na ich rozciganie.
Jak powiedziano wczeniej, parametr Stretch Particles (rozciganie czstek) powinien wywie-
tla opcj Billboard. Dziki temu czstki bd zawsze zwrócone w stron gracza, bez wzgldu
na to, gdzie si on znajduje. Poniewa pola Length Scale (skalowanie dugoci) i Velocity Scale
(skalowanie prdkoci) s wykorzystywane jedynie w czstkach rozciganych, moemy je bez
287
Projektowanie gier w rodowisku Unity 3.x
problemu pozostawi z ich domylnymi wartociami, równymi 0. Ich modyfikacja nie wpynie
na czstki renderowane przy uyciu opcji billboardingu.
Biorc pod uwag to, e nie skorzystamy z opcji UV Animation (animacja UV), moemy przyjrze
si ostatniemu parametrowi, zwanemu Max Particle Size (maksymalny rozmiar czstki). Okrela
on wielko czstki w odniesieniu do rozmiaru ekranu. Na przykad jeli przypiszemy mu war-
to 1, wówczas czstki bd miay maksymalny rozmiar równy wysokoci ekranu. Liczba 0,5
oznacza, e mog osiga wielko do poowy wysokoci ekranu itd. Poniewa czstki ognia
nigdy nie bd musiay by tak due jak okno ekranu, moemy pozostawi domyln wielko
tego parametru, równ 0,25.
Dodawanie materiau
Gdy system czstek zosta ju zdefiniowany, pozostao nam tylko stworzy materia: wykorzy-
stamy w tym celu tekstur ognia. Wybierz folder Materials (materiay) w panelu Project
(projekt), a nastpnie kliknij przycisk Create (stwórz), znajdujcy si w górnej czci interfejsu,
i z rozwijanego menu wybierz opcj Material (materia). Spowoduje to utworzenie nowego
materiau o nazwie New Material. Zmie jego nazw na Flame i pozostaw zaznaczenie, by
wywietli odpowiednie waciwoci w panelu Inspector (inspektor).
Aby uy stworzonego materiau, po prostu przecignij go z folderu Materials i upu na obiekt
FireSystem w panelu Hierarchy. Pojawi si on w komponencie Particle Renderer, znajduj-
cym si w panelu Inspector, i dziki temu bdzie móg by tam modyfikowany.
Po tej operacji Twój system czstek bdzie si znajdowa dokadnie w rodku jego obiektu nad-
rzdnego. Jak moesz zauway , jest on teraz pooony zbyt nisko. Jeli tego nie widzisz, wybierz
obiekt w panelu Hierarchy, a nastpnie przemie kursor myszy nad okno Scene i nacinij
klawisz F, by przybliy widok. W komponencie Transform przypisz osi Y warto 0,8, aby troch
podnie system czstek.
288
Rozdzia 8. • Systemy czstek
Czas na test!
Kliknij przycisk Play (granie), aby przetestowa gr, i zacznij podziwia swoje dzieo! Pamitaj,
by ponownie nacisn przycisk Play w celu przerwania testowania i powrotu do projektu.
Tworzenie dymu
Znane powiedzenie mówi: „Nie ma dymu bez ognia” (i na odwrót). Biorc to pod uwag,
bdziemy potrzebowali pióropusza dymu unoszcego si nad ogniskiem, aby wygldao ono
realistycznie.
Rozpocznij od dodania nowego systemu czstek do sceny: kliknij przycisk Create, znajdujcy
si w panelu Hierarchy, a nastpnie wybierz pozycj Particle System z rozwijanego menu lub
przejd do opcji menu gównego GameObject/Create Other/Particle System. Zmie nazw nowo
powstaego systemu czstek na SmokeSystem (ponownie zwró uwag, aby nie uywa w niej
adnego znaku spacji, poniewa uatwi nam to tworzenie skryptów).
289
Projektowanie gier w rodowisku Unity 3.x
Jeszcze raz powiniene wzi pod uwag, e animacja koloru musi zawiera si pomidzy
dwoma wartociami kanau alfa bliskimi zeru, by moga rozpoczyna si i koczy w sposób
niewidoczny dla gracza. Dziki temu unikniemy wizualnego „szarpnicia”, gdy czstki bd
usuwane. Jeli s one widoczne podczas przeprowadzania tego dziaania, staje si ono duo
bardziej zauwaalne, a przez to mniej naturalne.
Lokalizacja
Powtórz etap umieszczania ognia dla systemu dymu poprzez przecignicie i upuszczenie obiektu
SmokeSystem na obiekcie nadrzdnym campfire w panelu Hierarchy. Nastpnie przy uyciu ikony
kóka zbatego, znajdujcej si po prawej stronie komponentu Transform, wybierz opcj Reset
oraz przypisz polu Y warto 1,5. Kliknij przycisk Play, aby upewni si, e nad ogniem pojawi si
pióropusz dymu, zgodnie z poniszym rysunkiem. Jak zawsze pamitaj o ponownym naci-
niciu przycisku Play, by zakoczy testowanie.
290
Rozdzia 8. • Systemy czstek
zostaa wybrana opcja 3D Sound (dwik trójwymiarowy). Oznacza ona, e po przypisaniu pliku
do róda audio oddalanie si gracza od ognia bdzie powodowao zanikanie dwiku, co jest
sensownym rozwizaniem.
Wybierz obiekt campfire w panelu Hierarchy, a nastpnie przejd do opcji menu gównego
Component/Audio/Audio Source (komponent/audio/ródo audio). Spowoduje to dodanie kompo-
nentu Audio Source do obiektu. Póniej po prostu przecignij klip fire_atmosphere z folderu
Book Assets/Sounds, znajdujcego si w panelu Project, i upu go na parametr Audio Clip,
zawarty w komponencie Audio Source w panelu Inspector. Aby upewni si, e dwik bdzie
odtwarzany przez cay czas, zaznacz opcj wyboru Loop (ptla).
Kliknij przycisk Play oraz podejd do ogniska, aby usysze dwik poncego ognia. Nastpnie
odejd od niego, by sprawdzi efekt zanikania dwiku. Ponownie nacinij przycisk Play, by
zakoczy testy.
D wik trójwymiarowy
Parametr Rolloff (zanikanie) definiuje, w jaki sposób nastpuje zanikanie dwiku podczas odda-
lania si od jego róda komponentu Audio Listener (zazwyczaj doczonego do kamery gracza).
Moemy go zmieni poprzez odpowiedni modyfikacj krzywej zanikania w komponencie
Audio Source.
291
Projektowanie gier w rodowisku Unity 3.x
Poprzez przypisanie parametrowi Rolloff Mode (tryb zanikania) opcji Custom (konfiguracja
uytkownika) i odpowiednie przecignicie punktów Béziera moesz zdefiniowa wasny ksztat
krzywej, a nawet uczyni j lini prost w przypadku, gdy tworzysz gry wykorzystujce mniej
realistyczne rodowiska.
Standardowa krzywa logarytmiczna jest waciw opcj dla naszego ognia, lecz jeli chciaby
troch poeksperymentowa , moesz to oczywicie zrobi .
Rozpalanie ognia
Poniewa ogie zosta ju przygotowany, moemy teraz sprawi , by zacz dziaa w grze. W tym
celu stworzymy mechanik, która zmusi gracza do wzicia pudeka zapaek, a nastpnie roz-
palenia za jego pomoc ogniska.
Najpierw musimy zablokowa dziaanie ogniska, poniewa nie powinno by ono aktywne na
samym pocztku gry. Aby to zrobi , powinnimy wyczy wszystkie systemy czstek i ródo
audio:
292
Rozdzia 8. • Systemy czstek
Teraz musimy utworzy kolekcj zapaek oraz wywietlacz HUD, który bdzie informowa
o fakcie ich posiadania. W tym celu powinnimy wykona nastpujce czynnoci:
Q Umieci w placówce model matchbox, który bdzie nagrod dla gracza za otwarcie
wejcia do niej.
Q Przy uyciu komponentu GUITexture stworzy wywietlacz HUD prezentujcy pudeko
zapaek, a nastpnie zapisa go w postaci prefabrykatu.
Q Napisa skrypt Trigger, który pozwoli na zebranie pudeka zapaek i zarejestruje
odpowiedni kolekcj w skrypcie Inventory, podczonym do postaci gracza, a take
wywietli element HUD.
Jeli obiekt matchbox jest wci wybrany, przejd do komponentu Transform, znajdujcego si
w panelu Inspector (inspektor). Kliknij ikon kóka zbatego, widoczn po prawej stronie nazwy
komponentu, a nastpnie wybierz opcj Reset Position (resetuj pozycj). W dalszej kolejnoci
przypisz osi Y parametru Position (pooenie) warto 2,5. Poniewa pudeko zapaek znajduje
si ju wewntrz placówki, uyj narzdzia Translate (skrót klawiszowy W), aby umieci je na
stole, dziki czemu moe by atwo zauwaone przez gracza. Ma to sens, poniewa ten obiekt
powinien by przez niego wzity po wejciu do budynku.
Z tego powodu pudeko zapaek powinno by wyposaone w zderzacz, który bdzie wykrywa
kolizje midzy nim i postaci gracza. Jeli obiekt matchbox jest wci wybrany, przejd do opcji
menu gównego Component/Physics/Box Collider (komponent/parametry fizyczne/zderzacz
skrzynkowy), a nastpnie kliknij przycisk Add (dodaj), gdy pojawi si okno dialogowe Losing
Prefab (utrata poczenia z prefabrykatem). W celu uniknicia zderzania si postaci gracza
z obiektem, a take umoliwienia wzicia pudeka zapaek przy uyciu funkcji OnTriggerEnter()
w zderzaczu wczymy tryb wyzwalania. Aby to zrobi , po prostu zaznacz opcj wyboru
Is Trigger (jest wyzwalaczem), znajdujc si w komponencie Box Collider, który naley do
panelu Inspector.
Poniewa obiekt nie ley na krawdzi stou, jest prawdopodobne, e najpierw nastpi kolizja
zderzacza postaci gracza ze stoem ni z pudekiem zapaek. Aby tego unikn , moemy po
prostu powikszy zderzacz pudeka zapaek, a nie przemieszcza samego obiektu. Odszukaj
opcj Size (rozmiar) w komponencie Box Collider, a nastpnie wprowad w polach X, Y i Z
warto 1. Twój zderzacz powinien teraz wyglda jak na poniszym rysunku, przedstawiajcym
panel Scene (scena):
293
Projektowanie gier w rodowisku Unity 3.x
Operacje interakcji z pudekiem zapaek bd teraz prostsze do zrealizowania. Gdy gracz widzi
pudeko, chce podej do niego i je wzi . Nie myli wówczas o pooeniu zderzacza postaci,
lecz po prostu w swoim polu widzenia widzi obiekt, który chciaby wzi , dlatego zblia si do
niego i go zabiera.
Zaznacz folder Scripts (skrypty) w panelu Project (projekt), kliknij przycisk Create (stwórz)
i wybierz odpowiedni jzyk programowania. Zmie nazw nowo powstaego skryptu na Matches.
Wczytaj go do edytora i umie w nim nastpujc funkcj:
Jzyk C#:
void OnTriggerEnter(Collider col){
if(col.gameObject.tag == "Player"){
col.gameObject.SendMessage("MatchPickup");
Destroy(gameObject);
}
}
Jzyk JavaScript:
function OnTriggerEnter(col : Collider){
if(col.gameObject.tag == "Player"){
294
Rozdzia 8. • Systemy czstek
col.gameObject.SendMessage("MatchPickup");
Destroy(gameObject);
}
}
W powyszym kodzie — podobnie jak w skrypcie PowerCell — sprawdzamy, czy obiekt gry
zawiera znacznik Player. Jeli tak, wysyamy do niego komunikat w celu wywoania funkcji
MatchPickup, któr wkrótce umiecimy w skrypcie Inventory. Wreszcie sam obiekt gry, czyli
pudeko zapaek, jest usuwany z gry za pomoc funkcji Destroy().
Zapisz swój skrypt i wró do rodowiska Unity. Nastpnie przecignij go z folderu Scripts na
obiekt matchbox, znajdujcy si w panelu Hierarchy. Przetestuj gr, co powinno spowodowa
pojawienie si bdu SendMessage has no receiver (funkcja SendMessage nie zawiera odbiornika).
Wynika to std, i w adnym ze skryptów przypisanych graczowi nie istnieje funkcja, która
odbieraaby wysyany komunikat. Powinnimy wic uzupeni kod o funkcj MatchPickup(), aby
dokoczy tworzenie mechaniki zwizanej ze zbieraniem zapaek.
Jeli tekstura jest wci wybrana w panelu Project, przejd do opcji menu gównego Game-
Object/Create Other/GUI Texture (obiekt gry/stwórz inny/tekstura GUI). Nie musimy umiesz-
cza tekstury na ekranie, poniewa zrobimy to, gdy utworzymy odpowiedni obiekt na podsta-
wie prefabrykatu. Teraz okno gry powinno wyglda jak na poniszym rysunku.
Aby zapisa tekstur jako prefabrykat, otwórz folder Prefabs (prefabrykaty), znajdujcy si
w panelu Project, a nastpnie przecignij do niego obiekt MatchGUI z panelu Hierarchy.
Wreszcie ponownie wybierz pierwotny obiekt MatchGUI, znajdujcy si w panelu Hierarchy, i usu
go ze sceny poprzez uycie skrótu klawiszowego Delete (PC) lub Command+Backspace (Mac).
295
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
// Zapaki
bool haveMatches = false;
public GUITexture matchGUIprefab;
Jzyk JavaScript:
// Zapaki
private var haveMatches : boolean = false;
var matchGUIprefab : GUITexture;
Jzyk C#:
GUITexture matchGUI;
296
Rozdzia 8. • Systemy czstek
Jzyk JavaScript:
private var matchGUI : GUITexture;
Nastpna funkcja, któr stworzymy, bdzie si nazywa MatchPickup(). Jak zapewne pamitasz,
jest ona wywoywana przez instrukcj SendMessage() w skrypcie Matches, gdy dochodzi do
kolizji postaci gracza ze zderzaczem pudeka zapaek.
Jzyk C#:
void MatchPickup(){
haveMatches = true;
AudioSource.PlayClipAtPoint(collectSound, transform.position);
GUITexture matchHUD = Instantiate(matchGUIprefab, new Vector3(0.15f, 0.1f, 0),
´transform.rotation) as GUITexture;
matchGUI = matchHUD;
}
Jzyk JavaScript:
function MatchPickup(){
haveMatches = true;
AudioSource.PlayClipAtPoint(collectSound, transform.position);
var matchHUD : GUITexture = Instantiate(matchGUIprefab, Vector3(0.15, 0.1, 0),
´transform.rotation);
matchGUI = matchHUD;
}
297
Projektowanie gier w rodowisku Unity 3.x
Wybierz obiekt First Person Controller, aby wywietli komponent Inventory (Script). Moesz
zauway pojawienie si zmiennej publicznej Match GUIprefab, której naley przypisa obiekt
GUITexture. W tym celu przecignij i upu na ni prefabrykat MatchGUI z folderu Prefabs, znajdu-
jcego si w panelu Project.
Zapamitaj biec scen poprzez wybranie opcji menu gównego File/Save Scene (plik/zapisz
scen). Kliknij przycisk Play, by sprawdzi , czy po wejciu do placówki moesz wzi pudeko
zapaek, jeli zbliysz si do niego. Jego tekstura powinna si pojawi w lewym dolnym obszarze
okna. A teraz uyjemy zmiennej haveMatches, aby okreli , czy mona ju rozpali ognisko.
Rozpalanie ogniska
Aby zapali ogie, musimy sprawdzi , czy nie zachodzi kolizja midzy graczem i obiektem ogni-
ska. W tym celu wró do edytora, by zmodyfikowa skrypt Inventory. Jeli jest on zamknity,
otwórz go ponownie, klikajc jego nazw w folderze Scripts, znajdujcym si w panelu Project.
Bdziemy wykrywa kolizje gracza z ogniskiem. Jednake teraz uywamy zderzacza fizycznego,
a nie zderzacza z wczonym trybem wyzwalania. Dlatego powinnimy wykorzysta funkcj
wykrywania kolizji dla kontrolera postaci — OnControllerColliderHit(). Zajmowalimy si ni
podczas pierwszej próby otwierania drzwi placówki, lecz zrezygnowalimy z niej, poniewa
uycie wyzwalaczy w tym przypadku byo bardziej odpowiednie.
298
Rozdzia 8. • Systemy czstek
Jzyk C#:
void OnControllerColliderHit(ControllerColliderHit col){
if(col.gameObject.name == "campfire"){
LightFire(col.gameObject);
}
}
Jzyk JavaScript:
function OnControllerColliderHit(col : ControllerColliderHit){
if(col.gameObject.name == "campfire"){
LightFire(col.gameObject);
}
}
Jeli warunek if jest speniony, wówczas wywoujemy wasn funkcj LightFire(), do której
przekazujemy obiekt gry biorcy udzia w kolizji. Stwórzmy teraz t funkcj.
Jzyk C#:
void LightFire(GameObject campfire){
}
Jzyk JavaScript:
function LightFire(campfire : GameObject){
}
W nawiasach powyszej funkcji znajduje si argument campfire o typie GameObject, który zawiera
obiekt biorcy udzia w kolizji, przesany przez funkcj OnControllerColliderHit().
299
Projektowanie gier w rodowisku Unity 3.x
Funkcja rozpala ognisko poprzez wczenie waciwoci emit w komponencie Particle Emitter
dla systemów czstek FireSystem i SmokeSystem. W tym celu powinnimy utworzy tablic zawie-
rajc komponenty emitera, a nastpnie przeglda j i kolejno wcza waciwoci emit.
Jzyk C#:
Rozpocznij od zadeklarowania lokalnej tablicy wewntrz funkcji LightFire():
ParticleEmitter[] fireEmitters;
Teraz musimy zainicjalizowa t tablic obydwoma komponentami emitera czstek. W tym celu
wykorzystamy funkcj GetComponentsInChildren, która odszuka komponenty we wszystkich
potomkach okrelonego obiektu gry. Z tego powodu uywamy argumentu campfire, poniewa
przechowuje on odwoanie do nadrzdnego obiektu, zawierajcego obiekty FireSystem i Smoke
´System. Umie poniszy wiersz kodu w funkcji LightFire():
fireEmitters = campfire.GetComponentsInChildren<ParticleEmitter>();
Wewntrz warunku ptli tworzymy zmienn zwan emitter, do której przekazujemy kolejny
element tablicy fireEmitters w trakcie trwania kadej iteracji.
Jest ona nastpnie uywana, by uzyska parametr emit komponentu Particle Emitter, któremu
przypisujemy warto true.
Jzyk JavaScript:
Umie poniszy kod w funkcji LightFire():
var fireEmitterComponents : Component[] =
campfire.GetComponentsInChildren(ParticleEmitter);
var fireEmitter : ParticleEmitter;
for (var i=0; i< fireEmitterComponents.Length; i++) {
fireEmitter = fireEmitterComponents[i] as ParticleEmitter;
fireEmitter.emit=true;
}
300
Rozdzia 8. • Systemy czstek
jej wartoci 0. Zmienna ta reprezentuje okrelony skadnik tablicy. Ptla dziaa tyle razy, ile
elementów skada si na tablic fireEmitterComponents, std uycie wyraenia .Length.
Na samym kocu powinnimy wczy efekt dwikowy dla ogniska. Po zamykajcym nawiasie
klamrowym ptli for umie taki wiersz kodu:
Jzyk C# i JavaScript:
campfire.audio.Play();
Powinnimy take przypisa zmiennej logicznej haveMatches warto false, aby zapamita ,
e nie moemy ju uywa zapaek. Po wierszu wczajcym efekt dwikowy w funkcji Light
´Fire() umie nastpujcy kod:
Jzyk C# i JavaScript:
Destroy(matchGUI);
haveMatches=false;
Funkcja Destroy() usuwa obiekt gry MatchGUI, który zosta umieszczony w zmiennej matchGUI
przez funkcj OnControllerColliderHit(). Wreszcie przypisujemy zmiennej haveMatches war-
to false. Uyjemy jej, by zagwarantowa , e wykrycie kolizji bdzie dziaa inaczej, gdy mamy
zapaki, a inaczej, gdy ich nie posiadamy.
Wró na sam pocztek skryptu i umie w nim kolejn zmienn publiczn, która pozwoli nam
na odwoanie si do obiektu TextHintGUI.
Jzyk C#:
public GUIText textHints;
Jzyk JavaScript:
var textHints : GUIText;
301
Projektowanie gier w rodowisku Unity 3.x
Gdy ukoczymy tworzenie skryptu, w panelu Inspector przypiszemy obiekt TextHintGUI do po-
wyszej zmiennej. Wewntrz istniejcego polecenia if, zawartego w funkcji OnControllerCol
´liderHit(), powinnimy zdefiniowa zagniedon instrukcj if else. Kod wyglda teraz
nastpujco:
if(col.gameObject.name == "campfire"){
LightFire(col.gameObject);
}
Teraz kolizja z obiektem ogniska spowoduje jego rozpalenie, gdy gracz posiada pudeko zapaek.
W przeciwnym razie na ekranie zostanie wywietlona wskazówka.
Zapamitaj swój skrypt i wró do rodowiska Unity. Powinnimy teraz przypisa obiekt Text
´HintGUI do zmiennej Text Hints, któr wanie dodalimy do skryptu Inventory.
Wybierz obiekt First Person Controller w panelu Hierarchy, a nastpnie przecignij obiekt
TextHintGUI na zmienn publiczn Text Hints, znajdujc si w komponencie Inventory (script)
w panelu Inspector.
Ponownie przetestuj gr, aby upewni si, e gdy podchodzisz do ogniska bez pudeka zapa-
ek, pojawia si wskazówka, natomiast gdy ju je posiadasz, nastpuje rozpalenie ognia (patrz
poniszy rysunek).
Wszystko dziaa prawidowo, lecz jest jeszcze jeden problem — czy wiesz jaki? Moe ju go
odkrye? Za chwil o nim powiemy i znajdziemy rozwizanie, lecz najpierw zapamitajmy
stan naszego projektu. Kliknij przycisk Play, aby przerwa dziaanie gry, a nastpnie wybierz
opcj menu gównego File/Save Project (plik/zapisz projekt).
302
Rozdzia 8. • Systemy czstek
Teraz powiniene si upewni , e gra na razie dziaa prawidowo. Nawet jeli w konsoli rodo-
wiska Unity nie wywietlaj si adne bdy (PC: Ctrl+Shift+C, Mac: Command+Shift+C),
musisz zawsze sprawdza , e podczas grania w gr nie pojawiaj si problemy.
Uwaga
Jeli podczas testowania napotkasz jakie bdy, przycisk Pause (zatrzymaj), znajdujcy si w górnej czci
interfejsu Unity, pozwoli na zatrzymanie gry, a nastpnie jej kontynuowanie. Dziki temu bdziesz móg
zapozna si z bdami pojawiajcymi si w oknie Console (konsola). Gdy zauwaysz jaki bd, po prostu
kliknij go dwukrotnie w konsoli, a zostaniesz przeniesiony do okrelonego wiersza kodu, który odpo-
wiada za jego powstanie, a przynajmniej do samego skryptu, w którym si on pojawi. Moesz take
wcisn przycisk Error Pause (zatrzymanie podczas bdu) w oknie Console, co spowoduje, e gra zatrzyma
si po napotkaniu dowolnego bdu.
Moesz próbowa analizowa sam bd lub zapozna si z dokumentacj Unity, aby si upewni, e
uye waciwego rozwizania. Jeli w dalszym cigu nie moesz sobie da rady z bdami, popro
o pomoc na forum Unity lub kanale IRC. By uzyska wicej informacji, odwied nastpujc stron:
http://unity3d.com/support/community.
303
Projektowanie gier w rodowisku Unity 3.x
Podczas grania w gr powiniene zauway , e podczas kolizji gracza dysponujcego pude-
kiem zapaek z obiektem ogniska nastpuje, co prawda, rozpalenie ognia, ale podpowied jest
wci widoczna na ekranie, gdy znajduje si wewntrz instrukcji else, czyli jest wywietlana,
gdy warto zmiennej haveMatches jest równa false. Aby to naprawi , powinnimy stworzy
kolejn zmienn logiczn, sprawdzajc, czy ogie zosta rozpalony.
Jeli uwaasz, e potrafisz to zrobi sam, zamknij ksik, a nastpnie spróbuj napisa odpo-
wiedni kod.
Lecz jeli nie jeste jeszcze cakowicie pewien, jak naley to zrobi , nie martw si. Za chwil
poznasz waciwe rozwizanie.
Jzyk C#:
bool fireIsLit = false;
Jzyk JavaScript:
private var fireIsLit : boolean = false;
Jzyk C# i JavaScript:
fireIsLit=true;
Jzyk C# i JavaScript:
if(haveMatches&& !fireIsLit){
LightFire(col.gameObject);
}else if(!haveMatches&& !fireIsLit){
textHints.SendMessage("ShowHint", "I could use this campfire to signal for
´help... if only I could light it...");
}
W powyszym kodzie upewniamy si, e gdy gracz, majc przy sobie pudeko zapaek, zblia
si do nieponcego jeszcze ogniska, nastpi jego rozpalenie poprzez wywoanie funkcji Light
´Fire(). Jeli jednak gracz nie ma zapaek i ognisko nie ponie, wówczas na ekranie zostanie
wywietlona wskazówka. Oznacza to, e podczas zapalania ognia podpowied nie bdzie pre-
zentowana, poniewa warunek else if wymaga, by zmienna fireIsLit bya równa false (umiesz-
czony przed ni wykrzyknik oznacza negacj). Zapamitaj swój skrypt i wró do rodowiska Unity.
304
Rozdzia 8. • Systemy czstek
Podsumowanie
W tym rozdziale uylimy systemów czstek, by poprawi dynamik naszej gry. S one wyko-
rzystywane w rónych scenariuszach gier, poczynajc od samochodów i statków kosmicznych,
a koczc na broni palnej i uwalnianiu pary wodnej. Najlepsz metod przyswojenia sobie
wiedzy, któr wanie poznalimy, jest eksperymentowanie. Poniewa mona modyfikowa wiele
parametrów, najlepsze wyniki osiga si po jakim czasie, w którym sprawdzamy, jakie efekty
mona uzyska . Zapoznalimy si take ze sposobem doczania systemów czstek do naszej
aplikacji. Bdziesz go czsto wykorzystywa w trakcie projektowania rónych rodzajów gier.
W nastpnym rozdziale zajmiemy si budowaniem systemu menu naszej gry. Bdzie to wyma-
gao tworzenia skryptów wykorzystujcych klas graficznego interfejsu uytkownika (GUI) dla
rodowiska Unity, a take zasobów typu GUISkin, pozwalajcych na zdefiniowanie stylu i sposobu
zachowania Twojego interfejsu. Klasa GUI jest specjalnym skadnikiem silnika Unity i moe by
wykorzystywana do tworzenia menu oraz wywietlaczy póprzezroczystych HUD. Po poczeniu
jej z zasobami GUISkin staje si cakowicie modyfikowalna wizualnie oraz jest gotowa do ponow-
nego wykorzystania. Wynika to std, e zasoby typu GUISkin mog by stosowane w dowolnej
liczbie skryptów wykorzystujcych klas GUI, co powoduje, e przyczyniaj si do zdefinio-
wania jednolitego stylu w projektach Unity.
305
Projektowanie gier w rodowisku Unity 3.x
306
9
Projektowanie menu
Aby w tym rozdziale stworzy atrakcyjnie wygldajc gr, bdziemy musieli zaprojektowa
oddzieln scen, która posuy jako menu aplikacji. Menu w rodowisku Unity moe zosta
zaimplementowane w róny sposób: mona uy poczenia istniejcej funkcjonalnoci oraz ren-
deringu dwuwymiarowych tekstur.
Odpowiednie tytuy mog zosta dodane przy uyciu klasy GUITexture lub zastosowaniu skryp-
tów z wykorzystaniem klasy GUI, a take poprzez umieszczenie tekstur na paszczynie. Dziki
temu mona uzyska winiet powitaln, zawierajc logo projektanta, elementy interfejsu gra-
ficznego uytkownika lub ekrany wczytywania zasobów gry. W tym rozdziale poznasz nast-
pujce zagadnienia:
Do utworzenia interaktywnych elementów menu moesz wykorzysta dwie róne metody. Jedna
z nich polega na uyciu prostego komponentu Unity, opartego na klasie GUITexture — jest to
zagadnienie, które poznalimy ju podczas implementowania elementu graficznego dla pudeka
zapaek w poprzednim rozdziale oraz celownika w rozdziale 7. Inn metod jest uycie klasy
GUI, zawartej w rodowisku Unity, i poczenie jej z zasobami pozwalajcymi na definiowanie
kompozycji graficznych interfejsu.
Projektowanie gier w rodowisku Unity 3.x
Tak wic za chwil poznamy dwa sposoby na umieszczenie w grze interaktywnych elementów
menu.
1. Klasa GUITexture i uycie skryptów wykorzystujcych zdarzenia myszy.
Pierwsza metoda polega na tworzeniu obiektów GUITexture oraz skryptów
obsugujcych zdarzenia myszy (na przykad przemieszczenie kursora myszy,
nacinicie przycisku, zwolnienie przycisku). Dziki temu mona podmieni
odpowiednie tekstury wykorzystywane przez te obiekty. Samo tworzenie przycisków
jest do proste, lecz wszystkie dziaania zwizane z obsug grafiki musz by
zarzdzane za pomoc skryptów.
2. Klasa GUI rodowiska Unity oraz kompozycje graficzne interfejsu uytkownika.
Druga metoda wykorzystuje metodyk opart w wikszym stopniu na skryptach.
W przeciwiestwie do pierwszego sposobu tworzenie caego menu realizuje si
za pomoc skryptu.
Cho w celu wygenerowania elementów menu wykorzystuje si skrypty, jednake
moliwe staje si uycie zasobów definiujcych kompozycje graficzne interfejsu
uytkownika. Dziki temu mona zmodyfikowa styl grafiki i okreli jej dziaanie
przy uyciu panelu Inspector (inspektor), definiujcego zdarzenia myszy.
Wykorzystujc to rozwizanie, w mniejszym stopniu obciamy procesor karty
graficznej, poniewa zazwyczaj mamy do czynienia tylko z jednym obiektem
obsugiwanym przez skrypt, a nie z wieloma elementami reprezentujcymi kady
ze skadników menu.
Drugi sposób jest, ogólnie rzecz biorc, bardziej akceptowan metod tworzenia penego menu
do gry, poniewa pozostawia projektantowi wicej swobody. Same elementy menu s tworzone
w skrypcie, lecz póniejsza ich stylizacja przy zastosowaniu kompozycji graficznych GUI jest
opcj porównywaln z rozwizaniami typu HTML i CSS, stosowanymi podczas tworzenia stron
internetowych. CSS (kaskadowe arkusze stylów, ang. Cascading Style Sheets) zarzdzaj wygl-
dem formularza, a HTML dostarcza waciwych treci. W naszym przypadku graficzny interfejs
uytkownika jest elementem HTML, natomiast kompozycja graficzna GUI odpowiada kaska-
dowym arkuszom stylów.
Interfejsy i menu
Menu jest najczciej uywane do definiowania elementów sterujcych i modyfikowania usta-
wie gry zwizanych z grafik i dwikiem. Umoliwia take wczytywanie zapamitanych sta-
nów rozgrywki. Wane jest, by stworzone menu nie przeszkadzao graczowi w uzyskaniu odpo-
wiedniego poziomu immersji. Gdy mówimy o wspaniaej grze, mamy na myli waciwy program,
a nie jego system menu (chyba e zosta on wyjtkowo dobrze lub le zaprojektowany).
308
Rozdzia 9. • Projektowanie menu
Czsto projektanci staraj si powiza menu z wygldem lub stylem samej gry. Na przykad
w wymienitej grze World Of Goo („ wiat glutów”), dostpnej na platformach 2D Boy oraz
Wii, kursor przyjmuje ksztat gluta, który zostawia za sob lad w trakcie poruszania si po
strukturze menu gry, dopasowujc si do wizualnego stylu caego interfejsu.
Jest to waciwy przykad, poniewa gra udostpnia graczowi co podobnego do jej zasadni-
czej mechaniki, dziki czemu bawi równie w trakcie przemieszczania si po strukturze menu
pocztkowego.
Zasoby, które zostan uyte podczas tworzenia menu, s dostpne w folderze Book Assets/
Textures (zasoby ksiki/tekstury). Znajdziesz tam nastpujce pliki:
Q Tekstury suce do stworzenia gównego tytuu gry oraz trzech przycisków: Play
(granie), Instructions (instrukcje) oraz Quit (zakoczenie). Ich nazwy rozpoczynaj
si od sowa menu_.
Q Klip audio beep, odtwarzany podczas klikania przycisków.
309
Projektowanie gier w rodowisku Unity 3.x
Tworzenie sceny
W tym punkcie wykorzystamy istniejcy widok wyspy i uyjemy go jako to naszego menu.
Dziki stworzonemu kontekstowi wizualnemu gracze bd mieli ju jakie pojcie o otoczeniu,
w którym si znajd.
Widok naszej wyspy z dalekiej perspektywy posuy jako to dwuwymiarowych elementów
interfejsu, których uyjemy, wykorzystujc w tym celu dwa wczeniej zaprezentowane
rozwizania.
W naszym menu chcemy wykorzysta ju utworzone rodowisko wyspy. Umieszczenie jej
widoku w tle menu spowoduje, e gracz zapozna si z otoczeniem, które wkrótce bdzie móg
bada . Tego typu wizualne zachty mog si wydawa nieznaczce, lecz dziaaj w sposób
podwiadomy, zachcajc gracza do rozpoczcia gry i narzucajc mu odpowiedni nastrój.
Duplikowanie wyspy
Na pocztku uyjemy naszej sceny Island (wyspa), któr ju utworzylimy. By uatwi zarz-
dzanie caoci, zgrupujemy gówne zasoby zwizane z otoczeniem: sam wysp, wod oraz ró-
do wiata kierunkowego. Oddzielimy je od obiektów, których nie potrzebujemy, czyli budynku
placówki, pomieszczenia do rzucania orzechami kokosowymi oraz ogniw energetycznych.
W ten sposób podczas duplikowania poziomu moemy po prostu usun wszystko oprócz grupy
elementów, które chcemy zachowa .
310
Rozdzia 9. • Projektowanie menu
Duplikowanie sceny
Wykonaj ponisze czynnoci w celu zduplikowania sceny:
1. Wybierz opcj menu gównego File/Save Scene (plik/zapisz scen), aby zapamita
scen Island. Nastpnie wybierz zasób Island w panelu Project (projekt).
2. Przejd do opcji menu gównego Edit/Duplicate (edycja/duplikacja) lub uyj
odpowiedniego skrótu klawiszowego (PC: Ctrl+D, Mac: Command+D). Podczas
operacji duplikowania rodowisko Unity po prostu dodaje kolejny numer do nazwy
nowo tworzonego obiektu lub zasobu, dlatego Twój duplikat bdzie si nazywa
Island 1. Wybierz go w panelu Project, a nastpnie zmie jego nazw na Menu.
3. Wczytaj scen Menu poprzez dwukrotne kliknicie jej ikony w panelu Project.
4. Jeeli scena Menu jest otwarta, moemy usun wszystkie obiekty, których nie
potrzebujemy. Jeli uywasz komputera PC, przytrzymaj wcinity klawisz Ctrl,
natomiast w przypadku komputera Mac uyj klawisza Command. Nastpnie wybierz
wszystkie obiekty w panelu Hierarchy z wyjtkiem grupy Environment, klikajc
je po kolei.
5. Usu zaznaczone obiekty ze sceny skrótem klawiszowym Delete (PC) lub Command+
Backspace (Mac).
311
Projektowanie gier w rodowisku Unity 3.x
Aby stworzy kamer, kliknij przycisk Create (stwórz) w panelu Hierarchy, a nastpnie z roz-
wijanego menu wybierz opcj Camera (kamera). Alternatywnie moesz take przej do opcji
menu gównego GameObject/Create Other/Camera (obiekt gry/stwórz inny/kamera).
W dalszej kolejnoci zdefiniuj widok w oknie Scene (scena) w taki sposób, by uzyska odlegy
obraz wyspy, tak jak zaprezentowano na poniszym rysunku:
A teraz dopasuj kamer do utworzonego widoku: wybierz obiekt Camera w panelu Hierarchy,
a nastpnie przejd do opcji menu gównego GameObject/Align with view (obiekt gry/dopasuj
do widoku). Jeli widok gry nie zawiera adnych szczegóów, po prostu zmodyfikuj warto
parametru Far (paszczyzna daleka), nalecego do grupy Clipping Planes (paszczyzny obcina-
jce), znajdujcej si w komponencie Camera w panelu Inspector. Zwikszaj j a do momentu,
gdy w widoku zobaczysz ca wysp i horyzont wody.
Jeli jednak nie podoba Ci si uzyskany wynik, moesz zawsze zmodyfikowa widok sceny
i powtórzy powysz operacj. Jest ona prostym i do uniwersalnym sposobem definiowania
pooenia kamer bez potrzeby wykorzystywania uchwytów osi oraz widoku gry.
Rozpocznij od wybrania pliku tekstury menu_mainTitle, znajdujcego si w folderze Book Assets/
Textures (zasoby ksiki/tekstury) w panelu Project. W panelu Inspector pojawi si odpowiednie
312
Rozdzia 9. • Projektowanie menu
ustawienia komponentu Texture Importer. Aby sprawi , e plik bdzie traktowany jako element
GUI, a nie tekstura, po prostu wybierz opcj GUI (graficzny interfejs uytkownika) z menu
podrcznego Texture Type (rodzaj tekstury). Kliknij przycisk Apply (zastosuj), by potwierdzi
wprowadzon zmian.
To ustawienie powinno zosta wybrane w komponencie Texture Importer dla wszystkich tek-
stur, których uyjemy w naszym menu.
Powtórz wic powysz czynno dla nastpujcych tekstur, znajdujcych si w folderze Book
Assets/Textures:
Q menu_instructionsBtn,
Q menu_instructionsBtnOver,
Q menu_playBtn,
Q menu_playBtnOver,
Q menu_quitBtn,
Q menu_quitBtnOver.
Poniewa zajmujemy si grafik dwuwymiarow, nie musimy modyfikowa ustawie Aniso Level
(poziom filtrowania anizotropowego), Filter Mode (tryb filtrowania) oraz Wrap Mode (tryb
zawijania) — s one zwizane z renderowaniem tekstur trójwymiarowych obiektów.
Oto inne parametry dostpne w komponencie Texture Importer, o których powiniene wiedzie :
Q Max Size (rozmiar maksymalny): ten parametr moe mie mniejsz warto ni rozmiar
pierwotnego pliku. Graficy czsto wykorzystuj grafik o wysokiej rozdzielczoci,
a nastpnie uywaj tego ustawienia, by skompresowa swój plik do mniejszych
rozmiarów, dziki czemu nie musz wykonywa odpowiedniej czynnoci w aplikacji
graficznej.
Q Format (format): ogólnie mówic, dla tego parametru powinna zosta wybrana opcja
Compressed (skompresowany), gdy pozwala ona rodowisku Unity na zarzdzanie
poziomem kompresji tekstur. Jeli jednak jest to konieczne, mona równie wybra
ustawienie Truecolor (peen kolor), umoliwiajce uzyskanie penej gamy kolorów.
313
Projektowanie gier w rodowisku Unity 3.x
Definiowanie pooenia
Poniewa w dzisiejszych czasach wikszo komputerów potrafi obsuy rozdzielczoci równe
1024×768 pikseli lub wiksze, wybierzemy t warto jako domyln do przeprowadzenia testów
menu. Uywajc klasy Screen, upewnimy si równie, e gra dziaa take dla innych wielkoci
ekranu, oraz sprawdzimy funkcjonowanie dynamicznej zmiany rozdzielczoci. W górnym lewym
naroniku widoku Game (gra) widnieje rozwijane menu. Pozwala ono na okrelanie rónych
wspóczynników ksztatu ekranu oraz jego rozdzielczoci. Wybierz z tego menu opcj Stan-
dalone (1024x768) (aplikacja samodzielna, 1024×768), aby odpowiednio zmieni wielko
okna podgldu.
Wskazówka
Pamitaj, e w przypadku, gdy rozdzielczo Twojego komputera jest zbliona do wybranej przez Ciebie
wartoci, okno Game nie bdzie dokadnie odwzorowywa wygldu gry, poniewa moe wykorzysty-
wa niedostateczny obszar interfejsu rodowiska Unity.
Aby dla widoku Game (i innych paneli interfejsu) przej w tryb penoekranowy, moesz umieci nad nim
kursor myszy, a nastpnie nacisn klawisz spacji. W tym rozdziale podczas umieszczania elementów
GUI uywaj tej metody do sprawdzenia, jak bdzie wyglda interfejs gry po jej ukoczeniu. Pamitaj,
e zarzdzanie wielkociami interfejsu jest duo atwiejsze, gdy tryb gry nie jest aktywny, poniewa ro-
dowisko Unity zakada, i klawisz spacji moe by domylnie uywany w rozgrywce, i zmusza Ci do klika-
nia mysz poza obszarem widoku gry, jeli chcesz powikszy lub pomniejszy inne panele. Z tego powodu
na górnej krawdzi okna Game znajduje si przycisk Maximize on Play (maksymalizuj podczas gry).
Domylnie wszystkie obiekty GUITexture maj pooenie równe (0,5, 0,5, 0), co oznacza
rodek ekranu przy zaoeniu, e wspórzdne ekranowe zawieraj si w przedziale od 0 do 1.
314
Rozdzia 9. • Projektowanie menu
Gdy w grze umiecilimy ju gówne logo, powinnimy doda trzy przyciski, wykorzystujc
kolejne obiekty GUITexture.
Nastpnie napiszemy skrypt, aby spowodowa , e tekstura bdzie otrzymywa zdarzenia myszy,
takie jak przemieszczenie lub usunicie kursora z obszaru menu oraz nacinicie i zwolnienie
przycisku.
315
Projektowanie gier w rodowisku Unity 3.x
Wybierz folder Scripts (skrypty), znajdujcy si w panelu Project (projekt), kliknij przycisk
Create (stwórz) i wybierz odpowiedni jzyk programowania. Zmie nazw nowo utworzonego
skryptu NewBehaviorScript na MainMenuBtns oraz kliknij jego ikon, by wczyta go do edy-
tora. Uytkownicy jzyka C# powinni dodatkowo usun ca funkcj Start().
Jzyk C#:
public string levelToLoad;
public Texture2D normalTexture;
public Texture2D rollOverTexture;
public AudioClip beep;
Jzyk JavaScript:
var levelToLoad : String;
var normalTexture : Texture2D;
var rollOverTexture : Texture2D;
var beep : AudioClip;
Dwie kolejne zmienne s typu Texture2D, jednake nie zostay im jeszcze przypisane adne
zasoby. Nastpi to podczas przecignicia i upuszczenia odpowiedniej tekstury w panelu Inspector
(inspektor).
Wreszcie jest tworzona zmienna typu AudioClip, która zostanie uyta podczas odtwarzania
dwiku odpowiadajcego klikniciu myszy.
Poniewa nasze zmienne s ju zadeklarowane, moemy stworzy funkcj, która zdefiniuje
tekstur uywan przez komponent GUITexture w momencie, gdy kursor myszy pojawi si w jej
obszarze. Taka sytuacja jest zazwyczaj zwana stanem aktywowania lub przeczania.
Jzyk C#:
void OnMouseEnter(){
guiTexture.texture = rollOverTexture;
}
Jzyk JavaScript:
function OnMouseEnter(){
guiTexture.texture = rollOverTexture;
}
316
Rozdzia 9. • Projektowanie menu
Jzyk C#:
void OnMouseExit(){
guiTexture.texture = normalTexture;
}
Jzyk JavaScript:
function OnMouseExit(){
guiTexture.texture = normalTexture;
}
Gdyby powyszej funkcji nie byo, tekstura rollOverTexture pozostaaby na przycisku, infor-
mujc, e opcja menu jest wci podwietlona.
Jzyk C#:
IEnumerator OnMouseUp(){
audio.PlayOneShot(beep);
yield return new WaitForSeconds(0.35f);
Application.LoadLevel(levelToLoad);
}
Jzyk JavaScript:
function OnMouseUp(){
audio.PlayOneShot(beep);
yield new WaitForSeconds(0.35);
Application.LoadLevel(levelToLoad);
}
Zauwa, e w jzyku C# funkcja zwraca inny typ danych, zwany IEnumerator. Oznacza to, e
wspiera ona operacj udostpnienia czasu procesora, co nie moe zosta zrealizowane przy
uyciu zwykego typu void, z którego zazwyczaj korzystamy. Zdefiniowanie typu zwracanego
jako IEnumerator sprawia, e funkcja staje si wspóprogramem, poniewa ogólne pojcie
programu oznacza zestaw instrukcji wykonywanych zgodnie z zasadami programowania.
317
Projektowanie gier w rodowisku Unity 3.x
w naszym przykadzie. Odpowiednik powyszego kodu zapisany w jzyku JavaScript nie wymaga
takiej modyfikacji, poniewa udostpnianie czasu procesora jest realizowane w standardowej
funkcji OnMouseUp().
Pierwszym poleceniem wykonywanym w funkcji jest odtworzenie dwiku. Dziki temu spra-
wimy, e zostanie to cakowicie zrealizowane przed wczytaniem nowej sceny. Umieszczajc
polecenie yield midzy odtworzeniem dwiku a zaadowaniem kolejnej sceny, zatrzymujemy
dziaanie skryptu na okrelon liczb sekund.
Wskazówka
Uycie polecenia yield w skryptach jest prost metod tworzenia opó nienia bez koniecznoci pisania
dodatkowego kodu obsugujcego licznik czasu.
Wczytywanie scen
Po wykonaniu polecenia yield gra wczyta scen przy uyciu instrukcji Application.LoadLevel().
Wykorzystuje ona argument bdcy acuchem tekstowym, który zawiera napis przypisany do
publicznej zmiennej levelToLoad w panelu Inspector. Pozwoli to na zaadowanie odpowied-
niego pliku sceny.
Aby wykona pewne operacje w tworzonym przez Ciebie projekcie, moesz uy klasy Appli
´cation. Zawiera ona funkcj LoadLevel(), a take szereg innych procedur i waciwoci. Pod-
czas kocowych usprawnie gry wykorzystamy t klas do dynamicznego wyboru renderowania
przycisku zakoczenia gry, który nie powinien si pojawia w wersji przeznaczonej dla przegl-
darki. Aby dowiedzie si wicej o klasie Application, zapoznaj si z fragmentem dokumentacji
rodowiska Unity powiconym tworzeniu skryptów: http://unity3d.com/support/documentation/
ScriptReference/Application.html.
Poniewa zamierzamy odtwarza dwik, upewnij si, e Twój obiekt bdzie zawiera kompo-
nent AudioSource. W tym celu umie polecenie RequireComponent we waciwym miejscu swojego
skryptu. Jeli nie pamitasz, jak naley to zrobi , poniej przedstawiamy waciw procedur:
318
Rozdzia 9. • Projektowanie menu
Jzyk C#:
Zlokalizuj wiersz zawierajcy polecenie using System.Collections. Poniej niego, ale jeszcze
przed deklaracj klasy MainMenuBtns, umie nastpujcy kod:
[RequireComponent (typeof (AudioSource))]
Jzyk JavaScript:
Na samym kocu skryptu umie nastpujcy wiersz kodu:
@script RequireComponent(AudioSource)
W swoim edytorze przejd do opcji menu gównego File/Save (plik/zapisz), a nastpnie wró
do rodowiska Unity. Wybierz obiekt menu_playBtn w panelu Hierarchy (hierarchia), a nastpnie
przejd do opcji menu gównego Component/Scripts/Main Menu Btns (komponent/skrypty/Main
Menu Btns), aby przypisa mu nowo utworzony skrypt. Moesz take przecign skrypt
z panelu Project (projekt) na obiekt menu_playBtn, znajdujcy si w panelu Hierarchy. W panelu
Inspector (inspektor) powinien si pojawi nowy komponent Main Menu Btns (Script). W wyniku
dziaania polecenia RequireComponent zosta take wywietlony komponent Audio Source.
Odszukaj plik dwikowy menu_beep, znajdujcy si w folderze Book Assets/Sounds (zasoby
ksiki/dwiki), a nastpnie go wybierz. W dalszej kolejnoci odznacz opcj wyboru 3D Sound
(dwik trójwymiarowy), widoczn w komponencie Audio Importer w panelu Inspector. Ozna-
cza to, e dwik bdzie odtwarzany z normaln si, która nie bdzie zalena od odlegoci
od komponentu odbiornika audio znajdujcego si w kamerze. Pamitaj o klikniciu przycisku
Apply (zastosuj) w celu zapamitania wykonanej zmiany.
Wreszcie przecignij klip audio menu_beep z folderu Book Assets/Sounds na zmienn Beep.
Po zakoczeniu dziaa Twój komponent powinien wyglda nastpujco:
319
Projektowanie gier w rodowisku Unity 3.x
Testowanie przycisku
Aby upewni si, e bdziemy mie do czynienia z poprawnym wygldem ekranu, odszukaj
i nacinij przycisk Maximize on Play (maksymalizacja podczas gry), znajdujcy si w widoku
Game (gra). Oznacza to, e podczas testów widok gry zostanie powikszony. W zalenoci od
rozdzielczoci Twojego ekranu powinien on uywa domylnego rozmiaru, przyjtego dla samo-
dzielnej aplikacji. Aby uzyska ten rezultat, upewnij si, e w pierwszym rozwijanym menu,
widocznym po lewej stronie widoku gry, zostaa wybrana opcja Standalone (1024x768) (apli-
kacja samodzielna, 1024×768). Jeli jej nie widzisz, sprawd, czy w opcji menu gównego File/
Build Settings (plik/ustawienia docelowe) wybrano warto PC and Mac Standalone (aplikacja
samodzielna dla PC i Mac). Jeeli nie, wybierz j, a nastpnie kliknij przycisk Switch Platform
(zmie platform), znajdujcy si w dolnej czci okna dialogowego.
A teraz kliknij przycisk Play (granie), aby przetestowa dziaanie sceny. W trakcie przemiesz-
czania kursora myszy nad przycisk Play Game (rozpocznij gr) powinna si pojawia tekstura
PlayBtnOver, która zostaa zaprojektowana w kolorze czerwonym, a po prawej stronie zawiera
motyw ognia. Gdy kursor myszy zostanie usunity z tekstury, powinien zosta przywrócony jej
wczeniejszy wygld.
Spróbuj klikn przycisk. W dolnym pasku interfejsu rodowiska Unity pojawi si bd pocho-
dzcy z konsoli. Jego tre jest nastpujca: Level 'Island' (-1) couldn’t be loaded because it has
not been added to the build settings (poziom „Island” (–1) nie móg zosta wczytany, poniewa
nie by uwzgldniony w ustawieniach kompilacji docelowej).
W ten sposób rodowisko Unity upewnia si, czy nie zapomniae doda odpowiednich pozio-
mów w oknie dialogowym Build Settings (ustawienia docelowe). Suy ono do zdefiniowania
parametrów zwizanych z eksportem Twojej gry, czyli tworzeniem wersji finalnej lub testowej.
Ustawienia docelowe musz zawiera wszystkie sceny dostpne w grze. Aby rozwiza nasz
problem, kliknij przycisk Play, by przerwa testowanie, a nastpnie przejd do opcji menu
gównego File/Build Settings.
W oknie dialogowym Build Settings kliknij przycisk Add Current (dodaj biec scen), znajdu-
jcy si poniej obszaru Scenes to build (sceny zawarte w kompilacji docelowej). Sceny na licie
kompilacji docelowej s umieszczone w odpowiedniej kolejnoci, o której wiadczy numer
porzdkowy, znajdujcy si po prawej stronie nazwy sceny. Upewnij si, e scena, która powinna
zosta wczytana jako pierwsza, jest zawsze na pozycji równej 0.
Przecignij scen Island z panelu Project i upu j na licie, zaraz poniej sceny Menu.unity.
320
Rozdzia 9. • Projektowanie menu
Poniewa odpowiedni skrypt zosta ju stworzony, po prostu przejd do opcji menu gównego
Component/Scripts/Main Menu Btns (komponent/skrypty/Main Menu Btns) lub przecignij
skrypt na obiekt w panelu Hierarchy, a nastpnie przypisz odpowiednie tekstury i plik dwi-
kowy menu_beep w taki sam sposób, jak pokazano we wczeniejszym punkcie „Przypisywanie
zmiennych publicznych”. Poniewa nie zaprojektowalimy jeszcze adnego obszaru prezen-
tujcego instrukcje, pozostaw zmienn Level To Load niezainicjalizowan.
Oznacza to, e bdziemy musieli zmodyfikowa skrypt MainMenuBtns, aby uwzgldni t opcj.
Jeli nie jest on jeszcze otwarty, dwukrotnie kliknij jego nazw, znajdujc si w folderze
Scripts (skrypty) w panelu Project, by wczyta go do edytora.
Zlokalizuj w skrypcie deklaracj zmiennej beep, a poniej niej umie nastpujc logiczn
zmienn publiczn:
Jzyk C#:
public bool quitButton = false;
Jzyk JavaScript:
var quitButton : boolean = false;
Powysza zmienna bdzie uywana jako przecznik. Jeli zostanie jej przypisana warto true,
wówczas spowoduje to, e kliknicie przycisku w funkcji OnMouseUp() wywoa polecenie Quit().
Gdy zmienna quitButton bdzie równa false (stan domylny), nastpi wczytanie poziomu zdefi-
niowanego w zmiennej levelToLoad.
321
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
IEnumerator OnMouseUp(){
audio.PlayOneShot(beep);
yield return new WaitForSeconds(0.35f);
if(quitButton){
Application.Quit();
}
else{
Application.LoadLevel(levelToLoad);
}
}
Jzyk JavaScript:
function OnMouseUp(){
audio.PlayOneShot(beep);
yield new WaitForSeconds(0.35);
if(quitButton){
Application.Quit();
}
else{
Application.LoadLevel(levelToLoad);
}
}
Przejd do opcji File/Save (plik/zapisz) w swoim edytorze, a nastpnie wró do rodowiska Unity.
Gdy obiekt menu_quitBtn jest wci wybrany w panelu Hierarchy, przejd do opcji menu gów-
nego Component/Scripts/Main Menu Btns (komponent/skrypty/Main Menu Btns) lub przeci-
gnij skrypt MainMenuBtns z panelu Project na nazw obiektu. Tak jak poprzednio w panelu
Inspector zainicjalizuj zmienne publiczne, lecz tym razem pozostaw zmienn Level To Load
nieprzypisan, a take zaznacz opcj wyboru, znajdujc si przy nowo utworzonej zmiennej
Quit Button.
322
Rozdzia 9. • Projektowanie menu
Poniej prezentujemy poprawny kod caego skryptu, aby móg go dokadnie porówna z Twoj
wersj.
Jzyk C#:
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (AudioSource))]
void OnMouseEnter(){
guiTexture.texture = rollOverTexture;
}
void OnMouseExit(){
guiTexture.texture = normalTexture;
}
IEnumerator OnMouseUp(){
audio.PlayOneShot(beep);
yield return new WaitForSeconds(0.35f);
if(quitButton){
Application.Quit();
}
else{
Application.LoadLevel(levelToLoad);
}
}
}
Jzyk JavaScript:
var levelToLoad : String;
var normalTexture : Texture2D;
var rollOverTexture : Texture2D;
var beep : AudioClip;
var quitButton : boolean = false;
function OnMouseEnter(){
guiTexture.texture = rollOverTexture;
}
323
Projektowanie gier w rodowisku Unity 3.x
function OnMouseExit(){
guiTexture.texture = normalTexture;
}
function OnMouseUp(){
audio.PlayOneShot(beep);
yield new WaitForSeconds(0.35);
if(quitButton){
Application.Quit();
}
else{
Application.LoadLevel(levelToLoad);
}
}
@script RequireComponent(AudioSource)
Wybierz opcj menu gównego File/Save Scene (plik/zapisz scen), aby zapamita stan projektu,
a nastpnie kliknij przycisk Play w celu przetestowania menu gry. Nacinicie przycisku Play
(rozpoczcie gry) powinno spowodowa wczytanie poziomu Island. Przycisk Instructions (instruk-
cje) spowoduje powstanie tego samego bdu co poprzednio („poziom nie móg zosta wczy-
tany…”), gdy w komponencie skryptu nie przypisalimy adnej sceny do zmiennej Level To
Load. Kliknicie przycisku Quit (zakoczenie gry) nie spowoduje pojawienia si bdu ani te
wykonania oczekiwanej od niego czynnoci (jest to normalne — przecie nie chcemy, aby nasz test
by przyczyn zakoczenia dziaania samego edytora!). Musimy wic poczeka do momentu, gdy
stworzymy wersj docelow gry.
Pamitaj o ponownym klikniciu przycisku Play, by zakoczy faz testowania. Pierwsze roz-
wizanie tworzenia menu zostao ju w peni zaimplementowane, dlatego teraz przyjrzymy
si innej metodzie, która wykorzystuje skrypty i klas GUI w celu generowania przycisków w ro-
dowisku Unity.
Sprawdmy wic dziaanie instrukcji Debug. Wró do skryptu MainMenuBtns i w kodzie zlo-
kalizuj miejsce uycia zmiennej quitButton:
if(quitButton){
Application.Quit();
}
324
Rozdzia 9. • Projektowanie menu
Komunikaty otrzymywane dziki uyciu polecenia Debug pojawiaj si w konsoli obok innych
informacji o bdach. Przykadowe wywoanie instrukcji Debug wyglda nastpujco:
Debug.Log("Ten fragment kodu dziaa poprawnie!");
Dziki umieszczeniu powyszego wiersza kodu w miejscu, w którym powinno nastpi jego
wykonanie, moesz sprawdzi , czy okrelone fragmenty skryptu s poprawne. W naszym przy-
padku umiecimy polecenie Debug za wywoaniem funkcji Application.Quit(), poniewa bdzie
to dowodzi , e zostaa ona wykonana bezbdnie. Zmodyfikowany kod powinien wyglda
nastpujco:
Jzyk C# i JavaScript:
if(quitButton){
Application.Quit();
Debug.Log("This part works!");
}
Zapamitaj skrypt poprzez wybranie w edytorze opcji menu gównego File/Save (plik/zapisz),
a nastpnie wró do rodowiska Unity. Przetestuj dziaanie sceny menu: nacinij przycisk Play
i kliknij przycisk Quit w menu gry. Spowoduje to pojawienie si odpowiedniej informacji w wierszu
konsoli rodowiska Unity. Otwórz oddzielne okno konsoli poprzez wybranie opcji menu gów-
nego Window/Console (okno/konsola) lub uycie skrótu klawiszowego (PC: Ctrl+Shift+C, Mac:
Command+Shift+C). Bdziesz móg zobaczy w nim ten sam komunikat, który by widoczny
w wierszu konsoli, co zaprezentowano na poniszym rysunku:
Uyta przez nas metoda jest bardzo przydatna podczas analizowania problemów wystpujcych
w skrypcie, a nawet projektowania fragmentów programu, dla których nie zostay jeszcze zdefi-
niowane adne polecenia.
Wskazówka
Oprócz wywietlania za pomoc instrukcji Debug.Log() zwykych komunikatów tekstowych zawartych
w cudzysowach moesz take umieszcza w niej zmienne i funkcje, by sprawdza ich wartoci w trakcie
dziaania gry. Taka opcja staje si bezcenna podczas testowania aplikacji i zaleca si jej uycie po napotka-
niu jakiegokolwiek niewaciwego dziaania skryptów.
325
Projektowanie gier w rodowisku Unity 3.x
Tworzenie menu
za pomoc klasy GUI rodowiska Unity
oraz kompozycji graficznych
Poniewa nasze menu ju dziaa, nie usuniemy go ze sceny, lecz po prostu tymczasowo zablo-
kujemy dziaanie obiektów, które go tworz.
Q Wycz opcj znajdujc si w panelu Inspector (inspektor) po lewej stronie nazwy
danego obiektu.
Q Upewnij si, e nazwa obiektu w panelu Hierarchy zmienia kolor na jasnoszary, a sam
element znikn z widoku Game (gra). Teraz powinna tam widnie jedynie tekstura
z logo tytuowym gry.
Tworzenie menu
W metodzie wykorzystamy klas GUI rodowiska Unity, a take zastosujemy wartoci typu
float i Rect. Typ Rect zawiera cztery wartoci zmiennoprzecinkowe (float), z których dwie okre-
laj pooenie w osi X i Y, a pozostae — szeroko i wysoko . Tego typu uyjemy do zdefi-
niowania obszaru, w którym zawiera si menu, oraz by okreli powierzchni zajmowan przez
kady z przycisków.
Nastpnie w skrypcie umiecimy funkcj OnGUI(), w której wykorzystamy zasoby GUISkin. Dzia-
aj one podobnie jak arkusze stylów uywane podczas projektowania stron internetowych,
dostarczajc spójnego zestawu kompozycji graficznych, które mog by wielokrotnie stosowane.
Gotowe menu powinno wyglda jak na poniszym rysunku.
Na pocztku utwórz nowy obiekt gry poprzez wybranie opcji menu gównego GameObject/
Create Empty (obiekt gry/stwórz pusty). Spowoduje to pojawienie si nowego elementu w panelu
Hierarchy, zwanego GameObject i zawierajcego jedynie komponent Transform. Bdzie on zawie-
ra nasze menu, zarzdzane skryptem z wykorzystaniem klasy GUI. By skrypt móg by urucha-
miany, musi mieci si w jakim obiekcie w postaci jego komponentu. Ze wzgldu na zacho-
wanie porzdku sensowne jest wic utworzenie pustego obiektu, przeznaczonego wycznie
do tego celu.
326
Rozdzia 9. • Projektowanie menu
Wybierz folder Scripts (skrypty), znajdujcy si w panelu Project (projekt), a nastpnie kliknij
przycisk Create (stwórz) oraz wybierz opcj C# lub Javascript z menu podrcznego. Zmie nazw
nowo utworzonego skryptu na MainMenuGUI i dwukrotnie kliknij jego ikon, aby wczyta go
do edytora.
Jzyk C#:
public AudioClip beep;
public GUISkin menuSkin;
public Rect menuArea;
public Rect playButton;
public Rect instructionsButton;
public Rect quitButton;
Jzyk JavaScript:
var beep : AudioClip;
var menuSkin : GUISkin;
var menuArea : Rect;
327
Projektowanie gier w rodowisku Unity 3.x
W powyszym kodzie tworzymy tak sam zmienn, przechowujc klip dwikowy, której uy-
walimy w poprzedniej metodzie. Nastpnie deklarujemy kontener dla kompozycji graficznej,
któr zastosujemy dla menu, a oprócz tego cztery zmienne typu Rect, przechowujce informacje
o pooeniu i rozmiarach obszaru menu i jego przycisków.
Funkcja OnGUI()
Poniej zadeklarowanych zmiennych umie w skrypcie nastpujc funkcj:
Jzyk C#:
void OnGUI(){
GUI.skin = menuSkin;
}
Jzyk JavaScript:
function OnGUI(){
GUI.skin = menuSkin;
}
W powyszym kodzie tworzymy funkcj OnGUI() oraz inicjalizujemy w niej pierwszy podsta-
wowy skadnik, przypisujc mu zasób kompozycji graficznej, reprezentowany przez zmienn
menuSkin. Oznacza to, e dowolne elementy GUI, takie jak przyciski, formatki itd., umiesz-
czone w funkcji OnGUI(), bd podporzdkowane stylowi kompozycji graficznej zdefiniowa-
nemu w tej zmiennej. Dziki temu w prosty sposób mona zmienia same kompozycje, co z kolei
powoduje kompletne przeksztacenie stylu graficznego interfejsu uytkownika.
Wspórzdne pikselowe
W pierwszej metodzie definiowania pooenia elementów GUI umiecimy menu w okrelonym
miejscu ekranu. Przejd do funkcji OnGUI() i poniej wiersza GUI.skin stwórz obszar dla ele-
mentów interfejsu uytkownika poprzez zdefiniowanie nowej grupy GUI:
Jzyk C# i JavaScript:
GUI.BeginGroup(menuArea);
328
Rozdzia 9. • Projektowanie menu
Funkcja BeginGroup() wymaga podania parametru typu Rect. Do tego celu uylimy zmiennej
publicznej menuArea, której wkrótce przypiszemy odpowiednie wartoci pooenia i rozmiarów.
Instrukcja tworzenia nowej grupy GUI powinna koczy si odpowiednim poleceniem, zamy-
kajcym t definicj. Nacinij wic kilkakrotnie klawisz przejcia do nowego wiersza (PC: Return,
Mac: Enter), aby stworzy woln przestrze, w której umiecimy kod, a nastpnie wprowad
ponisz instrukcj:
Jzyk C# i JavaScript:
GUI.EndGroup();
Ten wiersz powoduje zakoczenie definicji nowej grupy GUI i jednoczenie oznacza, e unik-
niemy pojawienia si bdów w konsoli rodowiska Unity.
Po wierszu GUI.BeginGroup(), lecz przed EndGroup(), umie poniszy kod, który definiuje trzy
przyciski:
Jzyk C#:
if(GUI.Button(new Rect(playButton), "Play")){
}
if(GUI.Button(new Rect(instructionsButton), "Instructions")){
}
if(GUI.Button(new Rect(quitButton), "Quit")){
}
Jzyk JavaScript:
if(GUI.Button(Rect(playButton), "Play")){
}
if(GUI.Button(Rect(instructionsButton), "Instructions")){
}
if(GUI.Button(Rect(quitButton), "Quit")){
}
W powyszym kodzie wykorzystujemy funkcj Button klasy GUI, która wymaga podania para-
metrów typu Rect oraz acucha tekstowego, tekstury lub obiektu typu GUIContent.
329
Projektowanie gier w rodowisku Unity 3.x
Przyciski umieszczamy w instrukcjach if, gdy pozwala nam to odpowiednio reagowa na ich
kliknicia. W przeciwnym razie przyciski byyby tylko renderowane.
Uywajc zmiennych publicznych typu Rect, moemy w panelu Inspector (inspektor) zdefinio-
wa rozmiary i pooenie kadego z przycisków. Zanim jednak zapamitamy skrypt i zainicjali-
zujemy odpowiednie zmienne, sprawmy, aby uycie przycisków spowodowao wykonanie jakiej
akcji. Dziki temu bdziemy wiedzie , e operacja ich klikania dziaa poprawnie. W pierw-
szym rozwizaniu wykorzystalimy funkcj Debug.Log(), która wywietlaa komunikat w konsoli
rodowiska Unity. Tym razem jednak zastosujemy co innego, co faktycznie zostanie uyte
w samym menu. Jak pamitasz, stworzylimy zmienn, która przechowuje klip audio — spo-
wodujmy wic, by by on odtwarzany po klikniciu przycisku przez gracza. Umie nastpujcy
wiersz kodu w kadej instrukcji if:
Jzyk C# i JavaScript:
audio.PlayOneShot(beep);
Poniewa odtwarzamy klip dwikowy, wykorzystujc do tego komponent Audio Source (std
zastosowanie w skrypcie sowa audio), powinnimy si upewni , e bdzie on obecny w obiekcie,
któremu przypiszemy nasz skrypt. Aby to zrobi , uyjemy starego znajomego, czyli polecenia
RequireComponent(). Jeli nie pamitasz, jak naley to zrobi , skorzystaj z poniszej instrukcji:
Jzyk C#:
Umie nastpujcy wiersz przed deklaracj klasy:
[RequireComponent(typeof(AudioSource))]
Jzyk JavaScript:
Na samym kocu skryptu umie poniszy wiersz kodu:
@script RequireComponent(AudioSource)
A teraz zapamitaj skrypt i wró do rodowiska Unity. eby umoliwi jego uruchomienie,
musimy go doda do pustego obiektu Menu2. Przecignij skrypt MainMenuGUI z panelu Pro-
ject (projekt) i upu go na obiekcie Menu2 w panelu Hierarchy (hierarchia). Po wybraniu obiektu
powiniene zobaczy komponenty Main Menu GUI (Script) oraz Audio Source. Rozwi wszystkie
cztery zmienne publiczne typu Rect (Menu Area oraz trzy przyciski), klikajc szar strzak po
lewej stronie ich nazw.
Skrypty GUI przeprowadzaj rendering tylko wówczas, gdy gra jest uruchomiona. Poniewa
zmienna Menu Area, definiujca rozmiary grupy GUI, jest równa 0, musimy j odpowiednio
zmodyfikowa , aby zobaczy jakiekolwiek wyniki renderingu. To samo powinnimy zrobi
w przypadku pozostaych trzech przycisków. Wprowad odpowiednie wartoci w polach zwiza-
nych z pooeniem i rozmiarami, pamitajc o tym, e moesz uywa klawisza Tab do spraw-
nego przemieszczania si midzy kolejnymi pozycjami.
330
Rozdzia 9. • Projektowanie menu
Na powyszym rysunku zdefiniowalimy zmienn Menu Area, odpowiadajc grupie GUI, która
znajduje si w odlegoci 100 pikseli od lewej krawdzi ekranu oraz 300 pikseli od jego góry.
Obszar ma szeroko 200 pikseli i wysoko 150 pikseli. Wynika std, e parametry elemen-
tów interfejsu uytkownika s wyznaczane wzgldem lewego górnego naronika ekranu. Taka
zaleno jest równie prawdziwa w przypadku przycisków mieszczcych si w grupie GUI.
Ich pooenie X i Y odnosi si do lewego górnego naronika samej grupy, a nie ekranu.
Dlatego pooenie przycisku Play równe 0,0 oznacza, e znajduje si on w lewym górnym naro-
niku grupy. Poniewa przycisk Instructions jest umieszczony w odlegoci 50 pikseli od górnej
krawdzi grupy, natomiast przycisk Quit w odlegoci 100 pikseli, odstpy midzy nimi wynosz
10 pikseli. Wynika to std, e wysoko przycisków jest równa 40 pikselom.
Przed przeprowadzeniem testów zlokalizuj plik menu_beep, znajdujcy si w panelu Project
w folderze Book Assets/Sounds (zasoby ksiki/dwiki), a nastpnie przypisz go do zmiennej
publicznej Beep, zawartej w komponencie skryptu. Styl naszego menu zostanie zdefiniowany
zaraz po przetestowaniu jego dziaania. Zapamitaj scen, wybierajc opcj menu gównego
File/Save Scene (plik/zapisz scen), i kliknij przycisk Play, aby j przetestowa .
Podczas testowania upewnij si, e w widoku Game (gra) zostaa wybrana opcja Maximize on Play
(maksymalizuj podczas gry), a rozdzielczo ekranu jest równa Standalone (1024x768) (aplika-
cja samodzielna, 1024×768). Powiniene zobaczy menu wywietlone przy uyciu domylnej
kompozycji graficznej rodowiska Unity.
Upewnij si, e po klikniciu kadego przycisku syszysz dwik klipu audio przypisanego do
menu. Jeli tak, wszystko dziaa zgodnie z oczekiwaniami! W razie wystpienia jakiegokolwiek
problemu dokadnie sprawd zawarto skryptu i przyjrzyj si informacjom wywietlanym
w oknie konsoli.
331
Projektowanie gier w rodowisku Unity 3.x
Zapewne zgadzasz si, e nasze menu nie wyglda zbyt interesujco: tekstury przycisków nie
odpowiadaj stylowi naszej gry, a czcionka jest zbyt prosta i maa. Poprawmy je wic przy uyciu
waciwej kompozycji graficznej!
Zmie nazw nowo utworzonego zasobu na Main Menu, a póniej wybierz go w panelu Project,
aby wywietli jego waciwoci w panelu Inspector. Moesz zauway szereg elementów GUI,
które moesz utworzy za pomoc kodu klasy GUI, a nastpnie dopasowa ich styl do biecej
kompozycji graficznej. Jeli masz jakie dowiadczenie w projektowaniu stron internetowych,
potraktuj kompozycj graficzn jako co w rodzaju arkusza stylów. Dopasowanie stylu rozpocznij
od przecignicia z panelu Project czcionki gry Sugo (lub tej, której uye) i upuszczenia jej
na waciwo Font (czcionka), znajdujc si na samej górze panelu Inspector. Moesz take
definiowa róne czcionki dla poszczególnych elementów GUI poprzez ich rozwinicie, a nastp-
nie zmodyfikowanie odpowiedniej waciwoci Font. W naszej sytuacji bdziemy jednak uywa
podstawowej czcionki dla wszystkich skadników GUI, chyba e zostanie podane, by w okre-
lonym przypadku stosowa inn.
A teraz rozwi obszar Button (przycisk), klikajc szar strzak po lewej stronie nazwy, co
spowoduje wywietlenie wszystkich waciwoci w panelu Inspector.
332
Rozdzia 9. • Projektowanie menu
Nastpnie rozwi stany Normal (normalny), Hover (aktywowany) i Active (aktywny), poniewa
gracz bdzie móg ich uywa w menu. Stan aktywny jest wywietlany, gdy przycisk jest wcinity.
Moe on trwa krótko, lecz powinnimy si upewni , e uwzgldniamy go w naszym projekcie.
Tekstura przycisku GUI zostaje odpowiednio rozcignita, aby dopasowa si do jego prosto-
ktnych rozmiarów. Nasze ta zostay wic zaprojektowane z zaokrglonymi naronikami —
bd one odpowiednio przeskalowane i uzyskaj inn szeroko .
Jeli chcesz zaprojektowa wasne ta przycisków, moesz korzysta z ich docelowych rozmiarów
lub zastosowa styl uywanych zasobów, tworzc zaokrglone ksztaty graficzne odpowiadajce
rónym szerokociom obiektów.
Ponownie wybierz kompozycj graficzn Main Menu w panelu Project, a nastpnie przecignij
tekstury guiBtnNormal, guiBtnHover i guiBtnActive odpowiednio na waciwoci Button/Normal/
Background (przycisk/stan normalny/to), Button/Hover/Background (przycisk/stan aktywowany/
to) i Button/Active/Background (przycisk/stan aktywny/to), tak jak zaprezentowano na pierwszym
rysunku na nastpnej stronie
Wreszcie zmie wartoci Text Color (kolor tekstu), by odpowiaday teksturom ta. Dla stanu
normalnego wybierz kolor biay, dla stanu aktywowanego — ciemnoniebieski, a dla aktywne-
go — odcie czerwieni.
333
Projektowanie gier w rodowisku Unity 3.x
334
Rozdzia 9. • Projektowanie menu
Jednake w przypadku, gdy gra jest samodzieln aplikacj, gracz bdzie mia moliwo wybrania
innej rozdzielczoci, co oznacza, e menu znajdujce si w bezwzgldnym pooeniu (100, 300)
pikseli moe nie by zsynchronizowane z elementem tytuu, którego wspórzdne s wzgldne.
Na przykad w rozdzielczoci 1680×1050 otrzymamy rezultat jak na poniszym rysunku.
Zwró uwag na to, e pooenie ekranowe tekstury tytuu równe 0,2 dla osi X powoduje, i
znajduje si ona we waciwym miejscu, dopasowanym do biecego rozmiaru okna. Powinnimy
wic zdefiniowa takie wspórzdne menu, by nie pasoway jedynie do rozdzielczoci 1024×768,
lecz pozwalay na okrelenie pooenia wzgldnego.
Z tego powodu stworzymy dodatkow zmienn prywatn typu Rect, która pozwoli na przypi-
sywanie wartoci w zakresie od 0 do 1 parametrom X i Y, nalecym do publicznej zmiennej
Menu Area, dostpnej w panelu Inspector. Dziki temu obszar menu bdzie wywietlany
w pooeniu zalenym od biecego rozmiaru ekranu, podobnie jak ma to miejsce przy ren-
derowaniu tytuu typu GUITexture.
335
Projektowanie gier w rodowisku Unity 3.x
Jzyk C#:
Rect menuAreaNormalized;
Jzyk JavaScript:
private var menuAreaNormalized : Rect;
Powyszy kod powoduje utworzenie zmiennej typu Rect, której moemy uywa podczas defi-
niowania grupy elementów GUI w podanej wczeniej funkcji BeginGroup(). Aby nasza praca
nie posza na marne, wczeniej musimy przeksztaci wartoci zawarte w istniejcej zmiennej
menuArea, a nastpnie przypisa je zmiennej menuAreaNormalized. T operacj wykonamy
w funkcji Start(), dziki czemu zostanie ona przeprowadzona podczas wczytywania sceny.
Wykrywanie rozdzielczoci ekranu i przypisywanie grupie GUI odpowiedniego pooenia
powinno by realizowane wanie w tym miejscu, a nie w funkcji OnGUI(), poniewa jest to
operacja jednorazowa.
Jzyk C#:
void Start(){
}
Jzyk JavaScript:
function Start(){
}
336
Rozdzia 9. • Projektowanie menu
Teraz dodamy wiersz kodu, który przeksztaci pooenie w osi X i Y dla zmiennej menuArea typu
Rect na wartoci znormalizowane. Wektor znormalizowany charakteryzuje si kierunkiem oraz
dugoci, odpowiednio przeskalowan do wartoci 1. Jest on przydatny na przykad do przypi-
sywania prdkociom parametrów pocztkowych, gdy moe przechowywa kierunek, a jego
warto moe by atwo mnoona.
Jzyk C#:
menuAreaNormalized = new Rect(menuArea.x * Screen.width -
´(menuArea.width * 0.5f), menuArea.y * Screen.height -
´(menuArea.height * 0.5f), menuArea.width, menuArea.height);
Jzyk JavaScript:
menuAreaNormalized = Rect(menuArea.x * Screen.width -
´(menuArea.width * 0.5), menuArea.y * Screen.height -
´(menuArea.height * 0.5), menuArea.width, menuArea.height);
Powyszy wiersz kodu na pierwszy rzut oka wyglda do skomplikowanie, dlatego postaramy si
przeanalizowa jego skadniki. Poniewa przeprowadzamy te same obliczenia dla obu osi X i Y,
przyjrzyjmy si po prostu, w jaki sposób przypisujemy pooenie X zmiennej typu Rect.
Parametr Screen.width jest równy szerokoci ekranu wyraonej w pikselach, dlatego gdy go
pomnoymy przez 0,2, otrzymamy to samo pooenie co w przypadku wprowadzenia wartoci 0,2
dla osi X w komponencie Transform, nalecym do obiektu menu_mainTitle typu GUITexture.
Mnoc biec rozdzielczo (1024 piksele) przez 0,2, uzyskujemy wynik 204,8 piksela. Caa
operacja, zmierzajca do odtworzenia poprzedniej metody, nie jest jednak jeszcze kompletna,
gdy wczeniej pooenie w osi X byo oddalone o 100 pikseli od lewej krawdzi ekranu.
Dzieje si tak, poniewa musimy wzi pod uwag fakt, e obiekt GUITexture podczas umiesz-
czania go na ekranie jest renderowany z jego rodka, przy uwzgldnieniu wartoci parametru
Pixel Inset X (wstawka pikselowa X) minus poowa szerokoci tekstury. Na przykad jeli
pomnoylibymy pooenie przez 0,5 i spróbowalibymy umieci grup GUI w rodku ekranu,
uzyskalibymy taki wynik:
337
Projektowanie gier w rodowisku Unity 3.x
Mimo e nie tworzymy menu, które ma si znajdowa w centrum ekranu, równie powinnimy
odj poow szerokoci zdefiniowanej w zmiennej menuArea, czyli wykona operacj menuArea.
´width*0.5. Mnoymy przez 0,5, poniewa ta czynno jest mniej wymagajca dla procesora
ni dzielenie przez 2. Dlatego te uzyskujemy nastpujce równanie:
menuArea.x * Screen.width – (menuArea.width * 0.5)
Dziki temu otrzymujemy warto 103,8 dla osi X w zmiennej menuAreaNormalized typu Rect.
Chocia nie uzyskalimy dokadnej wartoci 100 pikseli, której uywalimy wczeniej, rendering
przebiega praktycznie tak samo, a nasze rozwizanie pozwala dodatkowo na odpowiednie prze-
skalowanie w przypadku innych rozdzielczoci ekranu, co byo naszym gównym celem. Podobn
operacj wykonujemy dla pooenia w osi Y:
menuArea.y * Screen.height - (menuArea.height * 0.5)
Aby uy nowo utworzonej zmiennej, odszukaj nastpujcy wiersz w funkcji OnGUI():
GUI.BeginGroup (menuArea);
338
Rozdzia 9. • Projektowanie menu
Jzyk C# i JavaScript:
GUI.BeginGroup (menuAreaNormalized);
Oznacza to, e grupa GUI bdzie renderowana przy uyciu znormalizowanych równowaników
wartoci zmiennej publicznej Menu Area typu Rect. Zapisz skrypt i wró do rodowiska Unity.
Nastpnie wybierz obiekt Menu2, aby wywietli jego komponent Main Menu GUI (Script).
Nie wida adnych zmian, poniewa zmienna, któr wanie dodalimy, jest prywatna i wyko-
nuje swoje zadanie, dziaajc w tle.
Jednake wiedzc, e znormalizowany typ Rect jest oparty na wartociach zmiennej Menu Area
z panelu Inspector, musimy je poprawi , aby uzyska zakres od 0 do 1. Przypisz wic parame-
trowi X warto 0,2, a Y — warto 0,45, po czym kliknij przycisk Play, aby przetestowa dziaanie
menu. Powinno ono zosta wywietlone tak jak na pierwotnym rysunku, prezentujcym rozdziel-
czo 1024×768 pikseli.
Nasz kod pozwala ju na skalowanie pooenia menu dla rónych rozdzielczoci graficznych.
Wró my zatem do samego menu i zaimplementujmy jego faktyczn funkcjonalno . Zapisz
scen w rodowisku Unity, a nastpnie wró do edycji skryptu MainMenuGUI.
Jzyk C#:
IEnumerator ButtonAction(string levelName){
audio.PlayOneShot(beep);
yield return new WaitForSeconds(0.35f);
if(levelName != "quit"){
Application.LoadLevel(levelName);
}else{
Application.Quit();
Debug.Log("Have Quit");
}
}
339
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
function ButtonAction(levelName : String){
audio.PlayOneShot(beep);
yield new WaitForSeconds(0.35);
if(levelName != "quit"){
Application.LoadLevel(levelName);
}else{
Application.Quit();
Debug.Log("Have Quit");
}
}
Zwró uwag na to, e w jzyku C# uylimy typu zwrotnego IEnumerator, aby wskaza , e
definiujemy wspóprogram, a nie zwyk funkcj, poniewa wykorzystujemy w nim polecenie
yield, które pozwala na uzyskanie przerwy w dziaaniu procedury, tak jak widzielimy to ju
w naszym pierwszym rozwizaniu.
Funkcja uywa pojedynczego argumentu levelName o typie acucha znakowego. Dziki niemu
moemy przekaza informacj odczytan z panelu Project, która scena powinna zosta wczy-
tana. W celu uycia przycisku Quit (wyjcie) sprawdzamy wystpienie sowa „quit”, by wyko-
na polecenie Quit().
A teraz wywoajmy nasz funkcj wewntrz polece if w funkcji OnGUI(). Umie kursor
w instrukcji if dla przycisku Play, a nastpnie usu istniejcy wiersz audio.PlayOneShot(beep);,
poniewa nowo utworzona funkcja obsuguje ju t opcj.
Jzyk C#:
Poniewa w jzyku C# uylimy wspóprogramu, musimy zastosowa polecenie StartCoroutine():
StartCoroutine("ButtonAction", "Island");
340
Rozdzia 9. • Projektowanie menu
W powyszym wierszu kodu nazw funkcji, któr naley wywoa , podajemy w postaci acu-
cha tekstowego. Nastpnie znajduje si przecinek, a po nim argument tej funkcji przekazany
równie jako acuch tekstowy. W podobny sposób w poleceniu SendMessage() wywoywalimy
funkcj z argumentem, gdy wywietlalimy wskazówk na ekranie przy uyciu skryptu
TriggerZone.
Jzyk JavaScript:
ButtonAction("Island");
Jzyk C#:
StartCoroutine("ButtonAction", "quit");
Jzyk JavaScript:
ButtonAction("quit");
Jak zapewne zgadujesz, powyszy kod jeszcze raz wywouje nasz funkcj ButtonAction(), lecz
tym razem przekazujc sowo quit do jej argumentu levelName, który jest nastpnie wykrywany
w instrukcji if i powoduje wykonanie polecenia Application.Quit() koczcego dziaanie gry.
Zapamitaj skrypt i wró do rodowiska Unity. Kliknij przycisk Play, aby przetestowa dziaa-
nie gry. Nacinij przycisk Quit w menu, by sprawdzi , czy polecenie Debug.Log() spowoduje
wywietlenie komunikatu Have Quit (nacinito klawisz wyjcia z gry) w konsoli (patrz dolny
wiersz interfejsu Unity). Nastpnie kliknij przycisk Play w menu. W wyniku tego powinno
nastpi odtworzenie klipu dwikowego oraz wczytanie sceny Island. Peen sukces!
Aby sprawdzi , czy zawarto Twojego skryptu jest poprawna, porównaj go z poniszym
listingiem:
Jzyk C#:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(AudioSource))]
341
Projektowanie gier w rodowisku Unity 3.x
Rect menuAreaNormalized;
void Start(){
menuAreaNormalized = new Rect(menuArea.x * Screen.width -
´(menuArea.width * 0.5f), menuArea.y * Screen.height -
´(menuArea.height * 0.5f), menuArea.width, menuArea.height);
}
void OnGUI(){
GUI.skin = menuSkin;
GUI.BeginGroup (menuAreaNormalized);
if(levelName != "quit"){
Application.LoadLevel(levelName);
}else{
Application.Quit();
Debug.Log("Have Quit");
}
}
}
Jzyk JavaScript:
var beep : AudioClip;
var menuSkin : GUISkin;
var menuArea : Rect;
private var menuAreaNormalized : Rect;
var playButton : Rect;
var instructionsButton : Rect;
342
Rozdzia 9. • Projektowanie menu
function Start(){
menuAreaNormalized = Rect(menuArea.x * Screen.width -
´(menuArea.width * 0.5f), menuArea.y * Screen.height -
´(menuArea.height * 0.5f), menuArea.width, menuArea.height);
}
function OnGUI(){
GUI.skin = menuSkin;
GUI.BeginGroup (menuAreaNormalized);
if(GUI.Button(Rect(playButton), "Play")){
ButtonAction("Island");
}
if(GUI.Button(Rect(instructionsButton), "Instructions")){
audio.PlayOneShot(beep);
}
if(GUI.Button(Rect(quitButton), "Quit")){
ButtonAction("quit");
}
GUI.EndGroup();
}
if(levelName != "quit"){
Application.LoadLevel(levelName);
}else{
Application.Quit();
Debug.Log("Have Quit");
}
}
Dokoczmy tworzenie naszego menu poprzez umieszczenie strony zawierajcej instrukcje dla
gracza.
Nasza strona Instructions (instrukcje) powinna odzwierciedla styl pozostaych skadników menu,
dlatego odpowiednio zmodyfikujemy skrypt GUI w scenie Menu. Dziki temu to graficzne
okna bdzie pozostawa niezmienione podczas nawigowania po menu.
343
Projektowanie gier w rodowisku Unity 3.x
Uyjemy tego przycisku, by przecza widok midzy tym, co nazywamy gówn stron menu
(czyli istniejcym ekranem, prezentujcym przyciski Play, Instructions i Quit), a now stron,
która informuje gracza o celu gry oraz zawiera przycisk Back (powrót), pozwalajcy na powrót
do gównego menu.
Aby to osign , stworzymy zmienn menuPage typu acuchowego, która bdzie przechowy-
wa biec stron menu. Nastpnie w kodzie GUI umiecimy dodatkow struktur if else,
która bdzie sprawdza stan tej zmiennej i na tej podstawie renderowa róne przyciski lub
elementy interfejsu uytkownika. Uywamy typu acuchowego, by zapewni przejrzysto ,
lecz nasze zadanie mogoby take zosta rozwizane dziki wykorzystaniu zmiennej cakowitej,
na przykad jeli przypiszemy warto 0 do gównego menu, a 1 do strony z instrukcjami.
Rozpocznijmy od zadeklarowania nowej zmiennej prywatnej typu string, której uyjemy do okre-
lenia, na jakiej stronie si znajdujemy, a co za tym idzie — jakie elementy graficzne maj by
renderowane w naszym menu. Zostanie to zrealizowane poprzez przypisywanie do tej zmien-
nej rónych acuchów tekstowych. Poniej deklaracji menuAreaNormalized umie nastpujc
zmienn prywatn:
Jzyk C#:
string menuPage = "main";
Jzyk JavaScript:
private var menuPage : String = "main";
Jzyk C#:
if(GUI.Button(new Rect(playButton), "Play")){
StartCoroutine("ButtonAction", "Island");
}
if(GUI.Button(new Rect(instructionsButton), "Instructions")){
audio.PlayOneShot(beep);
}
if(GUI.Button(new Rect(quitButton), "Quit")){
StartCoroutine("ButtonAction", "quit");
}
Jzyk JavaScript:
if(GUI.Button(Rect(playButton), "Play")){
ButtonAction("Island");
344
Rozdzia 9. • Projektowanie menu
}
if(GUI.Button(Rect(instructionsButton), "Instructions")){
audio.PlayOneShot(beep);
}
if(GUI.Button(Rect(quitButton), "Quit")){
ButtonAction("quit");
}
Powyej tych instrukcji stwórz pusty wiersz, a nastpnie umie w nim pocztek nowego
polecenia if:
Jzyk C# i JavaScript:
if(menuPage == "main"){
Aby poprawi czytelno kodu, powiniene uy klawisza Tab do wykonania odpowiednich wci
w tekcie. W edytorze MonoDevelop moe to zosta osignite za pomoc prostego zazna-
czenia fragmentu kodu, który powinien zosta przesunity w prawo, a nastpnie nacinicia
klawisza Tab na klawiaturze. Zgodnie z poniszym rysunkiem zaznacz wic trzy instrukcje if,
które tworz nasze menu, i nacinij klawisz Tab, co spowoduje powstanie nowego wcicia poniej
nowo dodanego nadrzdnego polecenia if (na rysunku zaprezentowano widok dla jzyka C#):
Dziki temu moesz od razu zauway , e trzy instrukcje if znajduj si wewntrz polecenia
if (menuPage == "main"){. Nastpnie przesu o jeden wiersz w dó wywoanie funkcji
audio.PlayOneShot(beep);, znajdujce si w instrukcji if (drugiej z trzech) obsugujcej klawisz
Instructions. W otrzymanym pustym wierszu umie polecenie, które pozwoli nam na przejcie
do strony z instrukcjami:
Jzyk C# i JavaScript:
menuPage="instructions";
Powyszy kod powoduje zaniechanie renderowania naszej gównej strony menu, dlatego musimy
go uzupeni o kolejn instrukcj else if, pozwalajc na obsug zmiennej menuPage równej
sowu instructions.
Umie kursor za zamykajcym nawiasem klamrowym nadrzdnego polecenia if, które spraw-
dza, czy zmienna menuPage jest równa main, a nastpnie wprowad poniszy kod:
Jzyk C#:
else if(menuPage == "instructions"){
GUI.Label(new Rect(instructions), "You awake on a mysterious island...
´Find a way to signal for help or face certain doom!");
345
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
else if(menuPage == "instructions"){
GUI.Label(Rect(instructions), "You awake on a mysterious island...
´Find a way to signal for help or face certain doom!");
if(GUI.Button(Rect(quitButton), "Back")){
audio.PlayOneShot(beep);
menuPage="main";
}
}
W powyszym kodzie sprawdzamy, czy zmienna menuPage jest równa sowu instructions. Gdy
uytkownik kliknie przycisk Instructions, zmiennej zostanie przypisana ta warto , co spowo-
duje, e GUI wywietli elementy, które znajduj si wewntrz nowo dodanej instrukcji if.
Jak moesz zauway , utworzylimy nowy element GUI — Label, który wykorzystuje niezade-
klarowan jeszcze zmienn typu Rect zwan instructions, okrelajc obszar zajmowany na
ekranie. Dodajmy j teraz, dziki czemu bdziemy mogli j wkrótce zdefiniowa w panelu
Inspector. Poniej istniejcych zmiennych publicznych typu Rect umie wiersz kodu:
346
Rozdzia 9. • Projektowanie menu
Jzyk C#:
public Rect instructions;
Jzyk JavaScript:
var instructions : Rect;
Element Label jest etykiet tekstow i zawiera tekst, w prosty sposób wyjaniajcy graczowi,
co powinien zrobi , by wygra gr. W kolejnym wierszu wystpuje instrukcja if, w której two-
rzymy kolejny przycisk, wykorzystujc wielko obszaru zapamitan w zmiennej quitButton.
Dziki temu uzyskamy kontrolk, której rozmiar i pooenie bd takie same jak w przypadku
przycisku Quit. Oznacza to, e gdy uytkownik wybierze ten element menu, przycisk Quit
zostanie natychmiast podmieniony przez przycisk Back. Instrukcja if, obsugujca przycisk
Back, zawiera dwa polecenia: przypisuje zmiennej menuPage pocztkow warto main, co powo-
duje, e kod GUI bdzie wywietla gówn stron menu, a take odtwarza klip audio beep,
podobnie jak ma to miejsce w przypadku innych przycisków.
Wybierz obiekt Menu2 w panelu Hierarchy, aby wywietli komponent Main Menu GUI (Script)
w panelu Inspector. Moesz zauway , e pojawia si w nim nowa zmienna publiczna
Instructions typu Rect. Poniewa powinna ona zosta zainicjalizowana, kliknij szar strzak
przy jej nazwie, aby rozwin waciwoci, a nastpnie wprowad odpowiednie wartoci: pozo-
staw parametry X i Y równe 0, natomiast w polu Width (szeroko ) podaj 200, a w Height
(wysoko ) — 150.
Kliknij przycisk Play, a nastpnie Instructions w menu gry. Zostanie wywietlona nowa strona,
lecz jednoczenie pojawi si problem — domylnie tekst etykiety jest wywietlany w kolorze
jasnoszarym, przez co nie wyglda zbyt wyranie na tle chmur!
Moemy to jednak szybko naprawi poprzez przypisanie naszego istniejcego stylu do kontrolki
etykiety. Upewnij si, e zakoczye tryb testowania, a nastpnie wybierz zasób kompozycji
graficznej Main Menu, znajdujcy si w panelu Project. Moesz go od razu znale , klikajc
jego nazw przy zmiennej Menu Skin w komponencie Main Menu GUI (Script). rodowisko Unity
podwietli pozycj zasobu w panelu Project, dziki czemu bdziesz go móg atwo wybra .
347
Projektowanie gier w rodowisku Unity 3.x
Zapisz swoj scen menu w rodowisku Unity, by zapamita stan projektu. Poniewa nasza
kompozycja graficzna GUI zostaa ju przypisana, nie musimy wykonywa innych czynnoci —
po prostu kliknij przycisk Play i sprawd dziaanie nowego fragmentu menu.
Twój ekran z instrukcjami powinien wyglda tak jak na poniszym rysunku. Jeli nie, wró do
edycji parametrów kompozycji graficznej GUI i upewnij si, e prawidowo wprowadzie wszyst-
kie parametry, które przed chwil omawialimy.
Gratulacje! Twoje menu jest gotowe. Powiniene mie teraz moliwo przeczania si midzy
stron gówn i stron z instrukcjami. Poniewa zdefiniowalimy zmienn, która okrela bie-
cy element menu, moesz równie dodawa inne jego elementy. Kod modyfikujcy dziaa-
nie jakiego skadnika staraj si zawsze tworzy w sposób, który pozwoli na jego rozbudow
w przyszoci.
348
Rozdzia 9. • Projektowanie menu
Obsug tej technologii omówimy w rozdziale 12. Wczytywanie i strumieniowanie gównej czci
gry podczas wywietlania mniej zoonej sceny jest czsto spotykanym rozwizaniem i umo-
liwia graczowi wykonywanie pewnych czynnoci (na przykad przeczytanie instrukcji).
Podsumowanie
W tym rozdziale zapoznalimy si z dwoma gównymi metodami tworzenia elementów inter-
fejsu uytkownika w rodowisku Unity: wykorzystalimy obiekty GUITexture i zastosowalimy
skrypty GUI. Teraz posiadasz wystarczajc wiedz, by tworzy interfejsy przy uyciu obu opi-
sanych sposobów. Mimo e skrypty GUI umoliwiaj rozwizywanie wielu rónych zagadnie,
metody budowania skadników interfejsu s bardzo wane, poniewa bdziesz je zawsze wyko-
rzystywa podczas tworzenia kodu GUI. Przyjrzelimy si take sposobowi pozwalajcemu za
pomoc skryptu GUI decydowa , jakie skadniki interfejsu powinny by renderowane. Jest to
bardzo znaczcy element tworzenia obsugi menu w grach napisanych w rodowisku Unity.
349
Projektowanie gier w rodowisku Unity 3.x
350
10
Podstawy animacji
W tym rozdziale ulepszymy gr poprzez dodanie do niej animowanej sekwencji, zwizanej
z wygraniem gry. Gdy gracz ukoczy wszystkie zadania, które s niezbdne do wygrania gry,
zaprezentujemy mu sekwencj gratulacyjnych komunikatów. W bardziej zoonej grze byby
to na przykad krótki film, prezentujcy kolejn cz gry. Poniewa jednak jestemy na etapie
uczenia si, poznamy podstawy animacji: wykorzystamy w tym celu skrypty z interpolacj liniow
oraz narzdzie animacyjne, dostpne w rodowisku Unity.
Po pierwsze na ekranie pojawi si animowany tekst, informujcy gracza, e rozpalenie ogniska
spowodowao wygranie przez niego gry.
Informacje bd animowane za pomoc techniki skryptowej zwanej interpolacj liniow, czyli
metody zmiany w okrelonym czasie jednej wartoci na drug. Interpolacja liniowa jest przy-
datna w wielu zadaniach skryptowych, dlatego naley si jej nauczy .
Projektowanie gier w rodowisku Unity 3.x
Korzystajc z okna Animation, stworzymy drug cz sekwencji animacji, w której ekran bdzie
powoli przyciemniany, a nastpnie pojawi si na nim animowany tekst, przed wywietleniem
gównego menu informujcy gracza, e gra jest wczytywana (patrz poniszy rysunek).
Wygaszanie ekranu i tekst informujcy o wczytywaniu gry dodamy za pomoc obiektów GUI
´Texture. Stworzymy skrypt, który dopasuje obszar wygaszania do biecej rozdzielczoci
ekranu. Nastpnie uyjemy okna Animation, aby zaprojektowa animacje dla metody wygaszania.
Zmiana poziomu przezroczystoci (lub wartoci kanau alfa) spowoduje powstanie efektu przy-
ciemniania ekranu. W przypadku tekstu informujcego o wczytywaniu gry postaramy si zmo-
dyfikowa jego pooenie, dziki czemu bdzie si on przemieszcza z dou ekranu.
Q Posta gracza (First Person Controller), gdy ma pudeko zapaek, zderza si
z obiektem ogniska.
Q Skrypt Inventory, przypisany do postaci gracza, wysya komunikat do obiektu
obsugujcego sekwencj zwycistwa w celu wywoania funkcji GameOver().
352
Rozdzia 10. • Podstawy animacji
Poniewa znamy ju kolejno wykonywanych operacji, moemy rozpocz tworzenie koco-
wej sekwencji i poznawanie zasad dziaania animacji.
Upewnij si, e nie uywasz ju sceny Menu — wczytaj scen Island poprzez dwukrotne
kliknicie jej ikony w panelu Project (projekt).
353
Projektowanie gier w rodowisku Unity 3.x
Odszukaj i wczytaj do edytora skrypt Inventory, znajdujcy si w folderze Scripts (skrypty) panelu
Project. Musimy umieci w nim referencj do obiektu, który bdzie obsugiwa tworzenie
sekwencji wygrania gry.
Jzyk C#:
public GameObject winObj;
Jzyk JavaScript:
var winObj : GameObject;
Teraz uyjmy referencji winObj, wywoujc z niej polecenie SendMessage(), które z kolei wykona
funkcj zawart w zewntrznym obiekcie gry. Gdy gracz rozpali ognisko, powinna si rozpocz
sekwencja wygrania gry, dlatego z poziomu obiektu winObj wywoamy odpowiedni funkcj.
Umie poniszy kod w dolnej czci funkcji LightFire(), zaraz za wierszem fireIsLit=true;:
Jzyk C# i JavaScript:
winObj.SendMessage("GameOver");
To polecenie wysya do obiektu komunikat, który zostanie wkrótce przez nas utworzony. Z tego
obiektu zostaje wywoana funkcja GameOver(), zawarta w doczonym do niego skrypcie. Zwró
uwag na to, e podawanie nazwy skryptu nie jest konieczne. Wynika to std, i polecenie
SendMessage() przeszukuje wywoujcy j obiekt bez wzgldu na skrypt, który zawiera intere-
sujc nas funkcj.
354
Rozdzia 10. • Podstawy animacji
Q win_message,
Q win_survival,
Q win_youWin.
Zostay one zaprojektowane do uycia jako obiekty GUITexture, które bd animowane na ekranie.
Po kolei wybierz kad z tych tekstur, a nastpnie w komponencie Texture Importer, znajdu-
jcym si w panelu Inspector (inspektor), przypisz parametrowi Texture Type (rodzaj tekstury)
warto GUI, pamitajc, by klikn przycisk Apply (zastosuj) w celu zapamitania wprowadzo-
nych zmian.
Wybierz opcj GameObject/Create Empty (obiekt gry/stwórz pusty) z menu gównego, a nastp-
nie zmie nazw nowo utworzonego obiektu gry na WinSequence. Zresetuj jego wartoci Position
(pooenie) poprzez kliknicie ikony kóka zbatego po prawej stronie komponentu Transform
i wybranie opcji Reset Position (resetuj pooenie) z rozwijanego menu. A teraz wybierz wszystkie
trzy obiekty, których nazwy zaczynaj si od win_, i przecignij je na obiekt WinSequence.
355
Projektowanie gier w rodowisku Unity 3.x
W skrypcie, który za chwil napiszemy, bdziemy uywa wielu znanych nam ju mechanizmów.
Jedynym nowym elementem jest interpolacja liniowa. Pamitajc o tym, uzupenijmy skrypt,
a nastpnie przyjrzyjmy si jego fragmentowi, który nas interesuje. Wprowad poniszy kod,
a póniej go przeanalizuj.
Jzyk C#:
using UnityEngine;
using System.Collections;
void Start () {
startTime = Time.time;
}
void Update () {
Vector3 pos = new Vector3(Mathf.Lerp(xStartPosition, xEndPosition,
´(Time.time-startTime)*speed),
´transform.position.y,transform.position.z);
transform.position = pos;
}
}
Jzyk JavaScript:
var xStartPosition : float = -1.0;
var xEndPosition : float = 0.5;
var speed : float = 1.0;
private var startTime : float;
function Start(){
startTime = Time.time;
}
function Update () {
356
Rozdzia 10. • Podstawy animacji
transform.position.x = Mathf.Lerp(xStartPosition,
´xEndPosition,(Time.time-startTime)*speed);
}
Zauwa, e skrypt jzyka C# róni si troch od kodu JavaScript, poniewa musielimy zmo-
dyfikowa cay parametr zwizany z pooeniem i przechowa go tymczasowo w zmiennej typu
Vector3. W skrypcie JavaScript moemy bezporednio modyfikowa wspórzdn X i przysto-
sowa j do interpolacji liniowej.
Interpolacja liniowa jest najwaniejsz czci naszego skryptu, któr teraz przeanalizujemy:
Mathf.Lerp(xStartPosition, xEndPosition,(Time.time-startTime)*speed)
Powysze polecenie zawiera trzy argumenty: warto pocztkow (w naszym przypadku jest
to pooenie, cho moe by dowoln waciwoci), warto kocow oraz czas, w cigu któ-
rego powinno dokona si przejcie lub interpolacja midzy tymi wartociami.
Uwaga
W naszym przypadku identyfikujemy interpolacj ze zmian midzy dwoma wartociami. Aby dowiedzie
si wicej o tym zagadnieniu, moesz skorzysta z Wikipedii: http://pl.wikipedia.org/wiki/Interpolacja_
%28matematyka%29.
Do operacji zwizanej z czasem uywamy parametru Time.time. Pamita on czas, który upy-
n od uruchomienia gry, lecz jest resetowany po odjciu od niego wartoci startTime. Podczas
konkretyzacji obiektu do zmiennej startTime zostaje przypisana warto Time.time. W wyniku
tego uzyskujemy licznik czasu, którego warto wzrasta od zera. Ostatecznie modyfikujemy
uzyskany wynik, mnoc go przez zmienn speed. Teraz jest ona równa 1,0, co oznacza, e nie
wpynie na rezultat. Jednake kada warto wiksza od 1 spowoduje zwikszenie prdkoci,
a mniejsza od 1 — odpowiednio jej zmniejszenie.
Przejd do opcji menu gównego File/Save (plik/zapisz) w edytorze skryptu, a nastpnie wró
do rodowiska Unity.
357
Projektowanie gier w rodowisku Unity 3.x
Dopasowywanie animacji
Nasz skrypt zawiera prost implementacj metody interpolacji liniowej, dziki czemu moemy
modyfikowa pooenie obiektów w osi X i uzyska animacj w poziomie. Istnieje jednak moli-
wo zdefiniowania kierunku, z którego bdzie si rozpoczyna nasza animacja. Do tego suy
zmienna XStart Position, dostpna w panelu Inspector (inspektor). Wybierz kady z trzech
obiektów GUITexture, a póniej zdefiniuj dla nich nastpujce wartoci w parametrze XStart
Position (pooenie pocztkowe osi X), znajdujcym si w komponencie Animator (Script) panelu
Inspector:
Q win_message: 1,
Q win_survival: 1,
Q win_youWin: -1.
Warto -1 oznacza, e tekstura bdzie si pojawia z lewej strony ekranu, natomiast 1 spo-
woduje wykonanie animacji z prawej strony okna. Wynika std, e tytu „Survival” oraz akapit
z informacj pojawi si z prawej strony, za tekstura z tekstem „You win” wyoni si z lewej
strony okna. Moesz take spowolni dziaanie animacji: wybierz obiekt win_message i wpro-
wad warto 2 dla parametru XStart Position oraz 0,5 dla parametru Speed (prdko ).
Zapamitaj scen w rodowisku Unity poprzez wybranie opcji menu gównego File/Save (plik/
zapisz), a nastpnie kliknij przycisk Play (granie), aby przyjrze si uzyskanemu rezultatowi.
358
Rozdzia 10. • Podstawy animacji
Wybierz opcj menu gównego GameObject/Create Empty (obiekt gry/stwórz pusty) i zmie
nazw nowo utworzonego obiektu na winObj. Wybierz folder Scripts (skrypty) w panelu Pro-
ject (projekt) oraz kliknij przycisk Create (stwórz). Z menu podrcznego wybierz preferowany
przez Ciebie jzyk programowania.
Zmie nazw skryptu na WinGame, a nastpnie przecignij go na pusty obiekt winObj, znaj-
dujcy si w panelu Hierarchy (hierarchia). Wczytaj skrypt do edytora poprzez dwukrotne klik-
nicie jego ikony w panelu Project.
Jzyk C#:
public GameObject winSequence;
public GUITexture fader;
public AudioClip winClip;
Jzyk JavaScript:
var winSequence: GameObject;
var fader : GUITexture;
var winClip : AudioClip;
Teraz w skrypcie WinGame utwórz now funkcj zwan GameOver(). Jej nazwa jest bardzo wana,
wykorzystujemy j bowiem podczas wywoywania polecenia SendMessage() ze skryptu Inventory.
Jzyk C#:
IEnumerator GameOver () {
}
Jzyk JavaScript:
function GameOver () {
}
Zwró uwag na to, e w jzyku C# naley uy prefiksu IEnumerator, a nie void. Dziki temu
definiujemy funkcj jako wspóprogram, co pozwoli nam na chwilowe przerwanie jej dziaa-
nia poleceniem yield.
Nastpnie umie w niej polecenie PlayClipAtPoint(), a take funkcj Instantiate() dla zmien-
nej winSequence:
359
Projektowanie gier w rodowisku Unity 3.x
Jzyk C# i JavaScript:
AudioSource.PlayClipAtPoint(winClip, transform.position);
Instantiate(winSequence);
Jzyk C#:
yield return new WaitForSeconds(8.0f);
Instantiate(fader);
Jzyk JavaScript:
yield WaitForSeconds(8.0);
Instantiate(fader);
Skrypt tworzy komunikaty informujce o wygraniu gry, odczekuje 8 sekund, a nastpnie kon-
kretyzuje inny obiekt GUITexture, który bdzie realizowa operacj wygaszania ekranu i wywie-
tlania informacji o adowaniu gry.
Zapamitaj swój skrypt i wró do rodowiska Unity. Zmiennym publicznym okrelone warto-
ci przypiszemy w komponencie Win Game (Script) pod koniec tego rozdziau, gdy tylko je
utworzymy.
W folderze Book Assets/Textures (zasoby gry/tekstury) znajduje si plik o nazwie fade. Jest to po
prostu kwadratowa tekstura o rozmiarze 2×2 piksele, która zostanie rozcignita do wymiarów
360
Rozdzia 10. • Podstawy animacji
Póniej kliknij przycisk Create (stwórz) w panelu Hierarchy (hierarchia) i z menu podrcznego
wybierz opcj GUI Texture (tekstura GUI). Poniewa nasza tekstura powinna pokrywa cay
obszar ekranu, zmie ustawienia komponentu GUITexture tak, aby odpowiaday poniszemu
rysunkowi:
Dziki temu tekstura bdzie dziaa z domylnym rozmiarem ekranu 1024×768 pikseli, prze-
znaczonym dla samodzielnej aplikacji. Za chwil wprowadzimy take moliwo przeskalowania
do biecej rozdzielczoci.
Wybierz folder Scripts w panelu Project, a nastpnie kliknij przycisk Create. Z rozwijanego
menu wybierz preferowany jzyk programowania. Zmie nazw nowo utworzonego skryptu
na Fader i dwukrotnie kliknij jego ikon, by wczyta go do edytora.
Parametr Pixel Inset ma znany nam ju typ danych — Rect. Moemy wic po prostu w funkcji
Start() stworzy now warto typu Rect, a póniej przypisa j do waciwoci pixelInset
obiektu GUITexture. Aby to zrobi , umie nastpujc funkcj w swoim skrypcie:
Jzyk C#:
void Start(){
Rect currentRes = new Rect(-Screen.width * 0.5f, -Screen.height * 0.5f,
´Screen.width, Screen.height);
guiTexture.pixelInset = currentRes;
}
361
Projektowanie gier w rodowisku Unity 3.x
Jzyk JavaScript:
function Start(){
var currentRes : Rect = Rect(-Screen.width * 0.5, -Screen.height * 0.5,
´Screen.width, Screen.height);
guiTexture.pixelInset = currentRes;
}
W powyszym kodzie tworzymy zmienn typu Rect, zwan currentRes, a nastpnie przekazu-
jemy ujemne wartoci szerokoci i wysokoci ekranu do jej waciwoci X i Y, dzielc je przez 2
(za pomoc mnoenia przez 0,5). We waciwociach szerokoci i wysokoci po prostu uywamy
wartoci Screen.width i Screen.height.
Dziki temu wygaszanie ekranu bdzie dziaa w kadej rozdzielczoci! Zapamitaj swój skrypt
i wró do rodowiska Unity. Wybierz skrypt Fade w panelu Project, a nastpnie przecignij go
na obiekt fade w panelu Hierarchy.
Teraz kliknij przycisk Play, by przetestowa dziaanie skryptu. Powiksz widok gry (umie
kursor myszy nad nim i nacinij klawisz spacji). Skrypt powinien przeskalowa obiekt wyga-
szania ekranu do dowolnego rozmiaru, jaki ma okno gry. Jeszcze raz kliknij przycisk Play, by
zakoczy testowanie.
Kliknij pole koloru Color (kolor), a nastpnie w oknie definiowania koloru przecignij suwak A
(kana alfa) do wartoci 0, by uczyni obiekt cakowicie niewidocznym. Powiniene teraz widzie
jedynie czarn lini poniej pola koloru Color, wskazujc warto kanau alfa równ 0.
Uruchom panel Animation (animacja) poprzez wybranie opcji menu gównego Window/Ani-
mation (okno/animacja).
Na poniszym rysunku zosta ju utworzony nowy klip zwany fadeOut. Podczas rozpoczynania
tworzenia animacji za pomoc okna Animation rodowisko Unity automatycznie dodaje do obiektu
komponent Animation, poniewa jest on niezbdny do uycia utworzonego klipu.
362
Rozdzia 10. • Podstawy animacji
Pojawi si okno dialogowe z pytaniem o nazw nowego klipu. Nazwij go fadeOut i zapisz
w gównym folderze Assets (zasoby), aby zapamita go na najwyszym poziomie panelu Project.
Moesz take utworzy nowy folder Animations (animacje) i zapamita go w nim.
363
Projektowanie gier w rodowisku Unity 3.x
Spowoduje to utworzenie pierwszej klatki kluczowej w pozycji 0 listwy czasu. Klatki kluczowe
su do tworzenia punktów w czasie, w których dana waciwo ma okrelon warto . Ponie-
wa gry dziaaj tak jak animacje, czyli w kolejnych klatkach realizuj rendering obrazu, spo-
dziewamy si jakich zmian. Aby uytkownik nie musia definiowa kadej klatki z osobna, opro-
gramowanie wspomaga proces animacji poprzez umoliwienie ustalania miejsc na listwie czasu,
w których dane parametry bd miay okrelon wielko . Nastpnie program wyznacza pored-
nie wartoci dla pozostaych klatek. Taki proces, zwany tweeningiem (animacj automatyczn),
jest realizowany przez rodowisko Unity.
Z tego powodu zdefiniujemy klatk kluczow na pocztku naszej animacji, dla której warto
kanau alfa obiektu GUITexture jest równa 0. Nastpnie stworzymy kolejn klatk kluczow na
kocu animacji z odpowiedni wartoci kanau alfa równ 1. Oznacza to, e pod koniec ani-
macji tekstura GUITexture bdzie cakowicie widoczna. Poniewa jest ona renderowana przed
trójwymiarowym widokiem kamery, obraz zostanie zasonity czarnym tem, co da efekt przy-
ciemniania ekranu.
364
Rozdzia 10. • Podstawy animacji
Klatki kluczowe s reprezentowane przez ikon w ksztacie rombu. Gdy wskanik odtwarzania,
widoczny jako czerwona linia, znajduje si nad klatk kluczow, mona zmieni jej warto
poprzez jej kliknicie, a nastpnie wprowadzenie odpowiedniej modyfikacji. Poniewa zdefi-
niowalimy ju pocztkow klatk kluczow, powiniene zauway , e jej warto parametru
Color.a jest równa 0. Dlatego te nasza animacja bdzie powodowa przyciemnianie tekstury,
poczynajc od wartoci kanau alfa równej 0.
A teraz przesu wskanik odtwarzania (czerwon lini): przecignij go mysz i umie w poo-
eniu listwy czasu, które jest równe 2 sekundom. Jeli nie widzisz tej pozycji, po prostu uyj
poziomego paska przewijania przy dolnej krawdzi okna. Po umieszczeniu wskanika w pozycji
2:00 kliknij przycisk Add Keyframe (dodaj klatk kluczow), a nastpnie wprowad w polu
Color.a warto 1.
Trudno bdzie zauway jakkolwiek zmian w linii animacji na wykresie, poniewa widok
domylnie nie zosta przybliony w takim stopniu, by wywietli przejcie z wartoci 0 na 1.
Niektóre animacje (na przykad zmiana pooenia) modyfikuj parametry w wikszym zakresie,
std te wynika domylny obszar widoku.
Aby rzeczywicie zobaczy zmian zachodzc midzy obiema klatkami kluczowymi, po prostu
przecignij w dó zaokrglony koniec prawego paska przewijania i przesu cay pasek w miej-
sce, w którym bdziesz móg widzie ca krzyw.
365
Projektowanie gier w rodowisku Unity 3.x
Powtórz ten krok dla drugiej klatki kluczowej. Twoja krzywa animacji powinna wyglda
nastpujco:
Zwró uwag na to, e na powyszym rysunku zaznaczono obie klatki kluczowe, by wywietli
ich uchwyty.
Nasza pierwsza animacja jest gotowa! Zamknij panel Animation lub zadokuj go w interfejsie
Unity, a póniej kliknij przycisk Play, by sprawdzi dziaanie efektu przyciemniania ekranu
dla tekstury GUITexture.
Nacinij przycisk Play ponownie, aby przerwa testowanie, albo spróbuj porusza si w ciem-
noci! Jeli w panelu Inspector wida komponent Animation naszego obiektu przyciemniania
366
Rozdzia 10. • Podstawy animacji
ekranu, wywietla on fadeOut jako biec animacj, która bdzie automatycznie odtwarzana,
poniewa odpowiednia opcja Play Automatically (odtwarzaj automatycznie) jest domylnie
wczona.
Skoro nasz obiekt przyciemniania ekranu jest ju animowany, musimy wykona jeszcze jedno
kocowe dziaanie, zanim zapamitamy go w postaci prefabrykatu — uyjemy animacji do uru-
chomienia procesu tworzenia nowego elementu GUI.
Aby poinformowa gracza, co bdzie si dzia po zakoczeniu gry, stworzymy animacj kolejnego
obiektu GUITexture, zawierajcego napis „Loading”. Obiekt ten zostanie skonkretyzowany pod-
czas dziaania animacji fadeOut.
Do utworzenia funkcji wykorzystamy skrypt Fader, który zosta ju doczony do obiektu fade.
Odszukaj go w panelu Project, a nastpnie wczytaj do edytora lub wró do niego, jeli jest ju
otwarty.
Wprowad nastpujc deklaracj zmiennej publicznej oraz funkcji, która po prostu konkre-
tyzuje obiekt typu GUITexture (utworzymy go wkrótce), sucy do wywietlenia napisu
„Loading”.
Jzyk C#:
public GUITexture loadGUI;
void LoadAnim(){
Instantiate(loadGUI);
}
Jzyk JavaScript:
var loadGUI : GUITexture;
function LoadAnim(){
Instantiate(loadGUI);
}
367
Projektowanie gier w rodowisku Unity 3.x
Zapamitaj skrypt i wró do rodowiska Unity. Poniewa skrypt jest ju gotowy i zosta wcze-
niej doczony do obiektu fade, moemy go uy w zdarzeniu animacyjnym.
Jeli obiekt fade jest wci wybrany w panelu Hierarchy, otwórz okno Animation poprzez wskaza-
nie opcji menu gównego Window/Animation (okno/animacja) lub uycie odpowiedniego skrótu
klawiszowego (PC: Ctrl+6, Mac: Command+6).
Wybierz waciwo Color.a komponentu GUITexture, znajdujcego si po lewej stronie panelu,
a nastpnie przesu wskanik odtwarzania na pozycj 1:00 na listwie czasu.
Powinno zosta utworzone zdarzenie oraz wywietlone okno dialogowe Edit Animation Event
(edycja zdarzenia animacyjnego). Mona je równie otworzy , klikajc ikon zdarzenia na listwie
czasu. W oknie moesz wywietli list funkcji dostpnych w skrypcie, który jest doczony do
animowanego obiektu. Kliknij rozwijane menu na napisie No Function Selected (nie wybrano
funkcji), a nastpnie wybierz funkcj, któr wanie napisalimy, czyli LoadAnim():
Na kocu sekwencji wygrania gry, po przyciemnieniu ekranu, powinien pojawi si napis
„Loading”. Przygotowalimy ju waciwy obiekt wraz z metod jego konkretyzacji, dlatego
368
Rozdzia 10. • Podstawy animacji
trzeba teraz po prostu go utworzy i przypisa do skryptu Fader. Element GUI z napisem
„Loading” zakoczy proces wywietlania sekwencji wygrania gry poprzez ponowne wczytanie
gównego menu po upywie okrelonego czasu.
Gdy tekstura jest wci zaznaczona, kliknij przycisk Create (stwórz) w panelu Hierarchy (hie-
rarchia) i wybierz opcj GUI Texture (tekstura GUI). Zostanie utworzony obiekt loadingGUI,
nastpnie umieszczony w panelu Hierarchy. Aby si upewni , e znajduje si on poza ekranem,
przypisz jego pooeniu Y warto -1.
Ponownie otwórz panel Animation i kliknij przycisk Add Clip (dodaj klip). Zmie nazw nowo
utworzonego klipu na showHide i zapisz go w domylnym folderze Assets (zasoby) lub Twoim
folderze Animations (animacje).
A teraz poprzez odpowiednie przemieszczanie si po listwie czasu stwórz nastpujce klatki
kluczowe i wartoci dla waciwoci Position.y:
Oznacza to jednake, e tekstura loadingGUI bdzie animowana przy uyciu krzywej o agod-
nym nachyleniu a do pooenia powyej rodka ekranu, a nastpnie opadnie tak, jakby bya
obiektem, który zosta podrzucony i spad pod wpywem dziaania siy grawitacji. Sprawd to:
kliknij przycisk Play (odtwarzanie) w oknie Animation i obserwuj widok Scene (scena) lub
Game (gra).
369
Projektowanie gier w rodowisku Unity 3.x
Aby to naprawi , po prostu kliknij prawym klawiszem myszy klatki kluczowe dla czasów 1:00
i 4:00, a póniej wybierz opcj Flat (krzywa paska) z menu podrcznego.
Kliknij przycisk Play w panelu Animation. W widoku sceny lub gry powiniene widzie tek-
stur loadingGUI, która pojawia si u dou ekranu, pozostaje przez kilka sekund na jego rodku,
a nastpnie ponownie znika na dole.
Animacja ekranu jest ju gotowa, wic nadszed czas, aby wczyta gr! Poniewa potrafimy
ju obsugiwa zdarzenia animacyjne, uyjmy jednego z nich do wczytania sceny Menu naszej gry,
co pozwoli graczowi na ponowne zagranie lub wyjcie (w przypadku samodzielnej aplikacji).
Skrypt bdzie uywany do adowania sceny zawierajcej menu gry, dlatego po prostu napisz
ponisz funkcj:
Jzyk C#:
void Reload(){
Application.LoadLevel("Menu");
}
Jzyk JavaScript:
function Reload(){
Application.LoadLevel("Menu");
}
370
Rozdzia 10. • Podstawy animacji
Zapamitaj skrypt i wró do rodowiska Unity. Wybierz obiekt loadingGUI w panelu Hierarchy,
a nastpnie uruchom okno Animation, jeli zostao zamknite.
Obiekt loadingGUI powinien zosta wybrany w panelu Hierarchy, poniewa bierze on udzia
w animacji showHide, nad któr musimy jeszcze popracowa . Pamitaj, e informacje o aktu-
alnie wybranym obiekcie i jego animacji s wywietlane w lewym górnym obszarze panelu
Animation.
Umie wskanik odtwarzania w pooeniu 6:00 na listwie czasu, czyli 1 sekund po znikniciu
animowanego tekstu „Loading” w dolnej czci ekranu. Nacinij przycisk Add Event (dodaj
zdarzenie), a nastpnie kliknij graficzny znacznik zdarzenia, aby wywietli okno dialogowe
Edit Animation Event (edycja zdarzenia animacyjnego). Z menu wybierz funkcj Reload()
i zamknij okno.
Gratulacje, nasze animacje s gotowe! Pamitaj jednak, e nie chcemy, aby obiekt loadingGUI
wystpowa domylnie w scenie Island, poniewa uywamy skryptu Fader, który go dla nas
konkretyzuje w wyniku wystpienia pierwszego zdarzenia animacyjnego.
Pamitaj, e skrypt Fader zawiera polecenie Instantiate(), które powinno zosta wykorzystane
z prefabrykatem loadingGUI. Bdzie ono wywoywane przez zdarzenie animacyjne podczas
uruchamiania funkcji LoadAnim(). Dlatego te powinnimy teraz przypisa prefabrykat do skryptu
Fader, co pozwoli na konkretyzacj obiektu loadingGUI. Wybierz obiekt fade w panelu Hie-
rarchy, aby wywietli komponent Fader (Script) w panelu Inspector. Moesz zauway zmienn
publiczn Load GUI, której powinien zosta przypisany odpowiedni obiekt GUITexture. Prze-
cignij wic na ni prefabrykat loadingGUI z folderu Prefabs.
Jak zwykle nie potrzebujemy obiektu w panelu Hierarchy podczas dziaania gry, dlatego zapa-
mitamy go jako prefabrykat. W tym celu przecignij obiekt fade z panelu Hierarchy do fol-
deru Prefabs w panelu Project, a nastpnie usu go z pierwotnego miejsca.
371
Projektowanie gier w rodowisku Unity 3.x
Wybierz obiekt winObj w panelu Hierarchy, aby wywietli komponent Win Game (Script).
Z folderu Prefabs w panelu Project przecignij prefabrykat fade na zmienn publiczn Fader.
Podobnie przecignij prefabrykat WinSequence i upu go na zmienn Win Sequence. Wreszcie
przypisz klip audio win_clip z folderu Book Assets/Sounds (zasoby ksiki/dwiki) do zmiennej
Win Clip.
Wybierz obiekt First Person Controller z panelu Hierarchy, a nastpnie przecignij obiekt
winObj z tego samego panelu na zmienn publiczn Win Obj, widoczn w komponencie Inventory
(Script), który jest wywietlony w panelu Inspector. Spowoduje to uruchomienie funkcji Game
´Object() dla obiektu winObj po rozpaleniu ogniska przez gracza.
Gdy ju przypiszesz elementy sekwencji wygrania gry, przetestuj je w dziaaniu! Kliknij przy-
cisk Play i zagraj w gr. Po rozpaleniu ogniska na ekranie powinny pojawi si komunikaty
z gratulacjami, a po upywie 8 sekund ekran powinien si przyciemni . W tym czasie w oknie
pojawi si napis „Loading”, po czym nastpi wczytanie sceny Menu.
Ale chwileczk! Przecie w grze jest bd! Komunikaty GUITexture s wci widoczne w trakcie
wygaszania ekranu i podczas wywietlania tekstu „Loading”. Dlaczego?
Dzieje si tak, poniewa podczas umieszczania tekstur GUITexture na scenie waciwo Z kom-
ponentu Transform jest uywana do okrelenia kolejnoci pojawiania si tych elementów gra-
ficznych (jest to co w rodzaju gbokoci obiektów trójwymiarowych). Wszystkie obiekty GUI
maj t sam warto Z, dlatego nie s renderowane we waciwej kolejnoci, która powinna
by nastpujca: komunikat, obiekt przyciemniania ekranu, a wreszcie napis „Loading” na samej
górze. Spróbujmy wic poprawi nasz bd.
372
Rozdzia 10. • Podstawy animacji
Poniewa komunikaty o zwycistwie powinny si znajdowa pod obiektami fade i loadingGUI,
wybierz kady z potomków prefabrykatu WinSequence w folderze Prefabs, a nastpnie w kom-
ponencie Transform w panelu Inspector i przypisz parametrowi Z warto -2.
A teraz pozostaw pooenie Z równe 0 (co oznacza, e obiekt znajduje si na samej górze; inaczej
mówic, ponad innymi elementami) w komponencie Transform obiektu loadingGUI, natomiast
dla prefabrykatu fade przypisz mu warto -1.
Wszystko gotowe! Zapisz scen i zagraj w gr, cieszc si w peni dziaajc sekwencj zwy-
cistwa. Po zakoczeniu testowania pamitaj o ponownym klikniciu przycisku Play.
373
Projektowanie gier w rodowisku Unity 3.x
Poniewa nie wpywa to na funkcjonalno naszej gry, nie bdziemy dokadnie opisywa , co
naley zrobi . Jest to dla Ciebie zadanie do rozwizania! Poniej przedstawiamy jedynie ogólne
wskazówki, co powinno zosta wykonane. Szczegóy rozwizania pozostawiamy Tobie. Uyj
wiedzy, któr zdobye w tym rozdziale.
Powodzenia!
Podsumowanie
W tym rozdziale przyjrzelimy si dwóm rónym metodom tworzenia animacji w rodowisku
Unity. Pamitaj, e interpolacja liniowa oraz panel Animation mog by uywane w celu animo-
wania praktycznie kadej waciwoci gry przy wykorzystaniu okrelonego parametru kompo-
nentu. Dziki temu uzyskujesz praktycznie cakowit kontrol nad tym, co dzieje si w Twoich
scenach gry.
374
11
Poprawa wydajnoci
i kocowe modyfikacje
W tym rozdziale zmodyfikujemy odpowiednio nasz gr, która z prostego przykadu zamieni
si w co, co bdzie mona ju udostpni uytkownikom kocowym. Podczas czytania tej ksiki
zapoznawalimy si z kolejnymi przykadami, które pozwalay nam na zdobywanie nowych umie-
jtnoci. W tym rozdziale pogbimy wiedz dotyczc poznanych ju zagadnie, a take przyj-
rzymy si dokadniej pewnym efektom, które nie maj duego wpywu na rozgrywk, lecz spra-
wiaj, e Twój produkt nabiera profesjonalnego wygldu. Dlatego te najlepiej jest wprowadzi
te zmiany dopiero pod koniec procesu projektowego.
Podczas tworzenia dowolnej gry najwaniejszym jej elementem jest mechanika. Fizycznie dzia-
ajce elementy gry musz by ju gotowe, zanim zostan w niej umieszczone dodatkowe skad-
niki graficzne i rodowiskowe. Podobnie jak w wielu innych przypadkach, równie podczas two-
rzenia gier terminy docelowe bd definiowane w ramach wasnej dyscypliny projektowej przez
Ciebie lub przez firm wydawnicz, z któr wspópracujesz. Planujc kocowe modyfikacje na
zakoczenie cyklu projektowego, upewniasz si, e powicie wikszo czasu na stworzenie
dziaajcej rozgrywki, co jest po prostu najwaniejszym zadaniem.
Aby osign cele niniejszej ksiki, zaómy, e nasza mechanika gry zostaa ju stworzona
i dziaa zgodnie z oczekiwaniami. A teraz zastanówmy si, co moglibymy jeszcze umieci
w rodowisku wyspy oraz ogólnie w grze, by przyczyni si do jej upikszenia.
Ulepszanie terenu
Teraz powrócimy do narzdzi terenu i poprawimy szczegóy wyspy. Poniewa bdziemy mody-
fikowa teren sceny Island, upewnij si, e zostaa ona wybrana w rodowisku Unity.
Umieszczanie drzew
Aby uzyska naturalny wygld drzew umieszczonych na wyspie, powiniene zastanowi si,
w jakich miejscach mog one rosn . Mówic krótko, drzewa rozrzucaj nasiona, które padaj
w przypadkowych miejscach. Po upywie lat wyrastaj z nich kolejne roliny. Oprócz tego
drzewa posadzone przez czowieka s rozmieszczone w równych rzdach, midzy którymi
zachowano okrelon przestrze. Nasza wyspa ma by dziewiczym rodowiskiem, dlatego te
powi troch czasu, by rozmieci na niej drzewa w maych grupach.
Wybierz obiekt nadrzdny Environment w panelu Hierarchy (hierarchia), a nastpnie kliknij jego
szar strzak, by go rozwin . Wybierz obiekt Terrain i przejd do panelu Inspector (inspektor).
Kliknij przycisk Place Trees (rozmieszczanie drzew) w komponencie Terrain (Script).
376
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Nastpnie rozmie drzewa w grupach, a take spróbuj utworzy rzd drzew zaraz przed kraw-
dzi wybrzea, aby uzyska odpowiednie zagszczenie rolin. Podczas wykonywania tej czyn-
noci pamitaj, e za chwil dodamy wicej wzgórz i tekstur, które sprawi, e lokalizacja drzew
bdzie wyglda bardziej naturalnie.
Podczas definiowania dodatkowych szczegóów terenu postaraj si uywa do tego celu narz-
dzia Paint Texture (nakadanie tekstur). Zachowujc niski poziom nieprzezroczystoci, umieszczaj
szczegóy w miejscach, w których zmodyfikowae poziom terenu. Pamitaj, e tam, gdzie nast-
puje zmiana krajobrazu, adnie wygldaj róne rodzaje rolin. Na przykad tereny wyynne
377
Projektowanie gier w rodowisku Unity 3.x
mog mie skay zamiast trawy oraz oddzielajcy pas z piasku. Dlaczego wic nie mona byoby
uy tekstury skay, by stworzy ciek prowadzc przez wysp i umieszczon na wzgó-
rzach pokrytych piaskiem?
Plaa
Spróbuj zastosowa narzdzia Smooth Height (wygadzanie powierzchni) oraz Paint Height
(ustalanie wysokoci), by na przykad stworzy pla poprzez zdefiniowanie paskowyu po
jednej stronie wyspy. Aby to zrobi , w narzdziu Paint Height przypisz parametrowi Height
(wysoko ) warto 9, a nastpnie uyj narzdzia Smooth Height, aby wyrówna przejcia mi-
dzy pla, morzem i ldem. Wreszcie dodaj troch drzew i zdefiniuj szczegóy tekstury, by
poprawi wygld zmieniajcego si krajobrazu.
Pamitaj, e im wicej bdziesz wiczy , tym lepiej poznasz dziaanie pdzli i staniesz si bar-
dziej kreatywny podczas tworzenia swojego rodowiska. Nie obawiaj si prób z nowymi roz-
wizaniami — zawsze masz moliwo wycofania zmian!
Uyj narzdzia Paint Height, rozpoczynajc od poziomu 12, a nastpnie powoli zwikszaj wyso-
ko w miar zbliania si do lokalizacji z budynkami. By unikn tworzenia stromych stoków
prowadzcych do cieki, zastosuj narzdzie Smooth Height, pozwalajce na definiowanie agod-
nych przej . Póniej zastosuj tekstury Rock (skaa) i Sandy (piasek), aby stworzy ciek, która
wyglda podobnie jak na poniszym rysunku:
378
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Przejd si po wyspie i kontynuuj jej edycj, dodajc do niej interesujce skadniki. Pamitaj,
aby stworzy tak ciek, która pozwoli graczowi na intuicyjne dostanie si do obszaru z bu-
dynkami.
Pod koniec cieki stwórz wzgórze otaczajce budynki, dziki czemu gracz bdzie wiedzie , e
dotar we waciwe miejsce.
379
Projektowanie gier w rodowisku Unity 3.x
si przyda widok boczny i z góry, który ustawisz za pomoc gadetu widoku w prawym gór-
nym naroniku okna Scene (scena). Ostatecznie posta gracza powinna znajdowa si w poo-
eniu zaprezentowanym na poniszym rysunku:
Poniewa nasze rodowisko wyglda ju poprawnie, postarajmy si jeszcze bardziej je dopra-
cowa !
Optymalizacja wydajnoci
W tym podrozdziale przyjrzymy si sposobom poprawiania wydajnoci gry jako produktu ko-
cowego. Proces ten, zwany take optymalizacj, staje si bardzo wany po upewnieniu si, e
gra dziaa zgodnie z oczekiwaniami, a gracz podczas grania w ni ma moliwie najlepsze wra-
enia. Za chwil zostan omówione podstawy optymalizacji, które powiniene pozna . Musisz
równie zrozumie , e zagadnienie poprawy wydajnoci jest rozlege i naley pozna je gbiej,
gdy tylko zdobdziesz wicej dowiadczenia w uytkowaniu rodowiska Unity.
380
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Ustawienie Far Clip Plane zostao ju omówione w rozdziale 4. podczas analizy obiektu First
Person Controller. Teraz zmodyfikujmy jego warto , aby poprawi wydajno dziki zmniej-
szeniu obszaru, w którym obiekty s renderowane przez kamer:
Q Rozwi grup nadrzdn First Person Controller poprzez kliknicie szarej strzaki
po lewej stronie nazwy w panelu Hierarchy (hierarchia).
Q Wybierz obiekt podrzdny Main Camera.
Q W panelu Inspector (inspektor) odszukaj komponent Camera, a nastpnie przypisz
parametrowi Far Clip Plane warto 400. Jest to niewielka odlego , wyraona
w metrach. Pomimo e takie ustawienie spowoduje ograniczenie obszaru widoku,
zostanie to ukryte, gdy wprowadzimy mg.
Zamknij okno wyboru koloru, a nastpnie w panelu Inspector wprowad warto 0,005 w polu
Fog Density (gsto mgy).
Parametrom kanau alfa oraz gstoci mgy zostay przypisane niskie wartoci, poniewa domylne
i wysze zasoniyby widok tak skutecznie, e czstki wyrzucane przez wulkan tworzyyby zbyt
duy kontrast z mg, dopóki gracz nie stanby blisko niego.
Odwzorowywanie wiata
Odwzorowywanie wiata (ang. lightmapping) jest metod wypalania czy te tworzenia mapy
wiata na powierzchni tekstury. Oznacza to, e owietlenie ma wpyw na wywietlany obiekt
trójwymiarowy. Takie dziaanie moe zosta wykonane w aplikacji modelujcej, lecz system
Unity równie pozwala na integracj wiata ze rodowiskiem, na które ono pada, zmian para-
metrów owietlenia i ponowne odwzorowanie wiata. Jest to sposób pracy, który odpowiada
eksperymentalnej naturze samego systemu Unity. Z tego powodu wielu projektantów uywa
wbudowanego w rodowisko Unity narzdzia odwzorowania wiata, a nie korzysta z zewntrz-
nych pakietów graficznych.
Dlaczego potrzebujemy mapy wiata? Po pierwsze owietlenie, które jest wykorzystywane w sce-
nach gry, powoduje, e procesor karty graficznej jest bardziej obciony. Dziki zapamitaniu
rezultatu owietlenia w teksturze (a nie przetwarzaniu róde wiata dynamicznie) uzyskujemy
wzrost wydajnoci oraz jednoczenie poprawiamy wygld elementów rodowiska gry.
381
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Naley równie przypomnie, e w darmowej wersji rodowiska Unity uycie cieni dynamicznych nie jest
wspierane, dlatego tworzenie mapy wiata na elementach rodowiska jest bardzo istotn czynnoci.
Odwzorowywanie wiata jest w zasadzie wykonywane tylko na obiektach, które nie poruszaj si
w grze. Dlatego te rodowisko Unity wykorzystuje opcj wyboru Static (statyczny), dostpn dla
kadego obiektu gry w górnej czci panelu Inspector (inspektor). Przekonaj si sam, e tak
wanie jest!
Uwaga
Pamitaj, e w rodowisku Unity Pro procedury cieniowania Self Illuminated bd powodoway owie-
tlenie otoczenia w ramach odwzorowania wiata. Taka funkcjonalno jest elementem opcji Global Illumi-
nation (globalne owietlenie), dostpnej w rodowisku Unity Pro.
382
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Placówka i generator
Zanim zmodyfikujemy instancj obiektu gry outPost, który umiecilimy ju w scenie, trzeba wy-
bra zasób modelu outPost w folderze Book Assets/Models (zasoby ksiki/modele), znajdujcym
si w panelu Project (projekt). W komponencie FBXImporter zaznacz opcj wyboru Generate
Lightmap UVs, a nastpnie kliknij przycisk Apply (zastosuj) w dolnej czci obszaru Inspector.
Pozwoli to rodowisku Unity na przygotowanie drugiego kanau UV w pliku zasobu dla modelu.
A teraz wybierz obiekt outPost w panelu Hierarchy (hierarchia) oraz przyjrzyj si jego usta-
wieniom w panelu Inspector. Moesz zauway , e opcja Static, znajdujca si u góry panelu,
jest nieaktywna — wcz j. Pojawi si okno z pytaniem, czy chcesz zastosowa to ustawienie
do potomków obiektu, czy tylko do samego rodzica. Powiniene wybra odpowied Yes, change
children (tak, zmie dla potomków), gdy model zawiera kilka obiektów podrzdnych, takich
jak stó, lampa sufitowa itd., które musz podlega procedurze odwzorowania wiata tak samo
jak ciany samej struktury.
Powtórz powysze kroki dla obiektu generator, aby upewni si, e równie on bdzie uwzgld-
niany w procedurze odwzorowywania wiata.
383
Projektowanie gier w rodowisku Unity 3.x
Kliknij obszar koloru MainColor, a póniej w oknie wyboru koloru wybierz odcie barwy
ótej.
Stwórzmy takie wanie ródo wiata, które bdzie reprezentowao lamp znajdujc si
wewntrz placówki. Kliknij przycisk Create (stwórz) w panelu Hierarchy, a nastpnie wybierz
opcj Point Light (wiato punktowe). Aby szybko umieci nowo utworzone ródo wiata Point
Light we waciwym miejscu, przecignij je i upu na obiekcie podrzdnym lamp, nalecym
do rodzica outPost, dziki czemu stanie si ono jego potomkiem. A teraz kliknij ikon kóka
zbatego, znajdujc si po prawej stronie komponentu Transform w panelu Inspector, i wybierz
opcj Reset (resetuj). Spowoduje to umieszczenie obiektu Point Light w centrum lampy, co
samo w sobie jest bardzo dobrym punktem startowym, lecz nie umoliwi owietlenia sufitu,
poniewa ródo wiata przecina si z siatk, która je definiuje.
Lampa ma ksztat obrotowy, co wynika z jej definicji, dlatego bdziemy musieli umieci obiekt
Point Light poniej jego rodzica, wykorzystujc w tym celu o Z zamiast zazwyczaj uywanej
osi Y. Jest to czsto spotykany problem w pracy z uyciem zewntrznych modeli, z którego
istnienia powiniene zdawa sobie spraw. W parametrze obiektu Point Light, reprezentuj-
cym o Z, wprowad warto -1, co spowoduje obnienie róda wiata.
384
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Teraz powiniene si upewni , e ródo Point Light jest jedynie elementem procedury odwzo-
rowywania wiata, a nie próbuje samodzielnie owietla innych obiektów. W komponencie
Light wybierz z menu Lightmapping (odwzorowywanie wiata) opcj BakedOnly (tylko do
wypalania).
385
Projektowanie gier w rodowisku Unity 3.x
Inspector. Kliknij przycisk Apply, aby zapamita wprowadzone zmiany. Poniewa obiekty celów,
umieszczone wewntrz pomieszczenia, pochodz z innego modelu, powtórz powyszy krok dla
elementu target, równie znajdujcego si w folderze Book Assets/Models.
Kliknij przycisk Create (stwórz) w panelu Hierarchy, a nastpnie wybierz opcj Point Light
(wiato punktowe) z rozwijanego menu. Uczy nowo utworzony obiekt Point Light potom-
kiem obiektu coconutShy. W tym celu przecignij go i upu na obiekt nadrzdny coconutShy,
znajdujcy si w panelu Hierarchy. Nastpnie umie ródo wiata w rodku pomieszczenia
poprzez kliknicie ikony kóka zbatego, wywietlonej w prawym górnym obszarze kompo-
nentu Transform, i wybranie opcji Reset (resetuj).
Dziki temu ródo wiata zostanie umieszczone w pierwotnym centrum obiektu, które znaj-
duje si w jego podstawie. Aby skorygowa pooenie, przypisz parametrowi osi Y warto 1,5.
Oprócz tego w polu Intensity (intensywno ) wprowad warto 2, a w polu Color (kolor) wybierz
kolor rónicy si od barwy biaej, na przykad jasnoóty, co sprawi, e ciany pomieszczenia
bd si charakteryzoway ciepym odcieniem.
386
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Ognisko
Poniewa chcielibymy, aby obiekt campfire rzuca cienie na powierzchni gruntu, a take by
owietlany ródem wiata bezporedniego w procedurze wypalania, wybierz go w panelu
Hierarchy, a nastpnie zaznacz opcj wyboru Static (statyczny), znajdujc si obok jego
nazwy w panelu Inspector. Potwierd tak jak wczeniej, e obiekty podrzdne równie maj
by statyczne.
Wskazówka
By moe bdziesz chcia zadokowa okno Lightmapping w interfejsie Unity, na przykad w pozycji panelu
Inspector. Aby to zrobi, po prostu przecignij zakadk z tytuem okna i upu j po prawej stronie tytuu
panelu Inspector. Okno dopasuje si do rozmiarów interfejsu i bdziesz móg przechodzi pomidzy nim
i panelem Inspector, klikajc odpowiedni zakadk.
Narzdzie Lightmapping
Okno Lightmapping skada si z trzech gównych zakadek: Object (obiekt), Bake (wypalanie)
i Maps (mapy):
wiato otoczenia
W opcji menu gównego Edit/Render Settings (edycja/ustawienia renderingu) moesz take
zdefiniowa dla sceny parametr Ambient Light (wiato otoczenia). W naszym przypadku ró-
dem wiata bezporedniego jest soce, dlatego wiato otoczenia pozwoli na uzyskanie ogól-
nego poziomu jasnoci, dziki czemu bdzie mona odróni noc od dnia. Spróbuj zmodyfiko-
wa ten parametr, klikajc jego obszar koloru, a nastpnie eksperymentujc z ustawieniami barwy
i przezroczystoci.
387
Projektowanie gier w rodowisku Unity 3.x
Chocia nie musimy docza wspomnianych wyej róde wiata do procesu wypalania, przy-
pisanie im atrybutu statycznoci zwikszy ogóln wydajno gry. Pamitaj, e wiata mog
by wykorzystywane jedynie w procesie odwzorowywania wiata, co uzyskuje si poprzez
wczenie opcji BakedOnly, uytej przez nas wczeniej dla obiektu Point Light.
Inna zaleta uczynienia róde wiata statycznymi polega na tym, e przypomina Ci ona, i nie
moesz ich przemieszcza .
Wybierz obiekt Directional Light w panelu Hierarchy. Powiniene pamita , e jest on potom-
kiem pustego obiektu Environment, który moesz rozwin w razie koniecznoci. Zaznacz opcj
wyboru Static w panelu Inspector, a nastpnie otwórz okno Lightmapping, jeli nie jest jesz-
cze widoczne na ekranie.
W zakadce Object okna Lightmapping wybierz z menu Baked Shadows (cienie wypalone) opcj
On (Realtime: Soft Shadows) (wczone mikkie cienie podczas dziaania gry). Inne parametry
powinny pozosta niezmienione.
388
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
z procesu wypalania. Na przykad nie moemy pozwoli , by ródo wiata punktowego w po-
mieszczeniu przeznaczonym do rzucania kokosami tworzyo cienie na wypalonej teksturze.
W przeciwnym razie cie rzucany przez animowany cel pozostaby na tylnej cianie!
Z tego powodu nie moemy równie uczyni pudeka zapaek obiektem statycznym, gdy jego
cie na stole byby widoczny nawet po zabraniu zapaek przez gracza. Rozwi obiekt nadrzdny
outPost, aby wywietli jego potomka matchbox, wybierz go, a nastpnie odznacz opcj Static,
znajdujc si w górnej czci panelu Inspector.
Wybierz obiekt podrzdny Point Light, którego rodzicem jest coconutShy, a nastpnie w panelu
Inspector wycz opcj Static. Aby upewni si, e adne cienie nie s rzucane, przejd do
panelu Lightmapping i w zakadce Object przypisz parametrowi Baked Shadows opcj Off (cienie
wyczone).
Wypalanie sceny
Skoro nasza scena jest ju przygotowana (zauwa, e obiekt Terrain jest domylnie statyczny),
moemy rozpocz wypalanie! W dolnej czci panelu Lightmapping znajdziesz trzy przyciski:
W tym momencie by moe chciaby wróci do edytora terenu, aby uzupeni wysp o dodat-
kowe szczegóy lub doda wicej drzew wokó obiektów outPost i coconutShy, dziki czemu
obszar wygldaby bardziej atrakcyjnie. Po operacji odwzorowania wiata drzewa mogyby rzu-
ca cienie, co uczyni ca sceneri bardziej naturaln.
Przejd do okna Lightmapping i wybierz zakadk Bake (wypal). Przypisz parametrowi Resolu-
tion (rozdzielczo ) warto 50. Definiuje on ogóln jako wypalania. Jeli uwaasz, e doce-
lowy materia ma zbyt nisk jako , zawsze moesz zmodyfikowa ten parametr, odpowiednio
go zwikszajc, a nastpnie ponownie wykona operacj odwzorowywania wiata.
Wypalanie mapy wiata jest czsto dugotrwaym procesem i zaley przede wszystkim od
prdkoci komputera, w którym zainstalowano rodowisko Unity. Poniewa przeprowadzanych
jest wiele operacji obliczeniowych, w zalenoci od zoonoci sceny wypalanie moe trwa od
kilku sekund do kilku godzin. W naszym przypadku nie mamy zbyt wielu obiektów do wypa-
lenia, wic procedura nie powinna trwa zbyt dugo, ale moe powiniene zaj si czym innym
podczas oczekiwania na jej zakoczenie! Du zalet narzdzia Lightmapping w rodowisku
Unity jest to, e moesz oglda swoj scen, podczas gdy wypalanie jest wykonywane w tle.
389
Projektowanie gier w rodowisku Unity 3.x
Kliknij przycisk Bake (wypal) w dolnej czci okna Lightmapping, aby rozpocz wypalanie.
Ukae si niebieski pasek postpu, pokazujcy obliczenia wykonywane dla rónych skadników
procesu odwzorowywania wiata. Bd cierpliwy! Warto poczeka na zakoczenie wypalania!
Oto kilka przykadowych wyników — jak moesz zauway , po uzupenieniu sceny dodatko-
wym owietleniem i cieniami rzeczywicie wida rónice.
390
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Aby dowiedzie si wicej o odwzorowywaniu wiata, zapoznaj si z odpowiedni doku-
mentacj rodowiska Unity: http://www.unity3d.com/support/documentation/Manual/Lightmap
pingInDepth.html.
Odszukaj ponisze obiekty podrzdne i odznacz w nich opcj wyboru Static, znajdujc si
w górnej czci panelu Inspector:
Pamitaj, e gdyby jeszcze raz chcia przeprowadzi operacj wypalania sceny, powiniene
tymczasowo wczy opcj Static w powyszych obiektach.
Kocowe upikszenia
W tym podrozdziale postaramy si uzupeni gr o dodatkowe upikszenia, dziki czemu gracz
bdzie mia wraenie, e uywa ukoczonej gry. Te dodatki nie maj wikszego wpywu na
rozgrywk, lecz pomagaj ulepszy program jako produkt kocowy.
Zajmiemy si:
Wulkan!
W rozdziale 3. przy uyciu edytora terenu zdefiniowalimy powierzchni wyspy, a na jednym
z jej wybrzey utworzylimy wulkan. Aby wyglda on bardziej realistycznie, doczymy do niego
pióropusz dymu oraz uzupenimy go o trójwymiarowy dwik gotujcej si lawy. Dziki uy-
ciu elementów wizualnych i dwikowych uzyskamy bardziej dynamiczne i realistyczne wra-
enia, co pozwoli na zachowanie odpowiedniego poziomu immersji w naszej grze.
391
Projektowanie gier w rodowisku Unity 3.x
Rozpocznijmy od stworzenia nowego systemu czstek w rodowisku Unity. W tym celu kliknij
przycisk Create (stwórz) w panelu Hierarchy (hierarchia), a nastpnie wybierz opcj Particle
System (system czstek) z rozwijanego menu. Moesz take wybra opcj menu gównego
GameObject/Create Other/Particle System (obiekt gry/stwórz inny/system czstek). Spowoduje
to utworzenie nowego obiektu gry, nazwanego Particle System. Wybierz go i zmie t nazw
na Volcano Smoke.
Jednak w tej sytuacji musimy uy gadetu View (widok), znajdujcego si w panelu Scene
(scena). Kliknij jego o Y (zielony uchwyt), aby zmieni widok z perspektywicznego na spojrzenie
z góry (lub z lotu ptaka). Jeli poprawnie wykonasz t czynno , Twój gadet View powinien
wywietla sowo Top (z góry).
Aby zlokalizowa obiekt Volcano Smoke, zaznacz go w panelu Hierarchy, a nastpnie wybierz
narzdzie Translate (skrót klawiszowy W), by wywietli jego osie w oknie sceny.
Uywajc widoku Top, moemy odpowiednio umieci system czstek na osi X i Z poprzez
przecignicie jego uchwytów w widoku Scene a do krateru wulkanu. Aby si upewni , e
widzisz zarówno osie systemu czstek, jak i sam wulkan, powiniene poszerzy sam widok. W tym
celu wybierz narzdzie Hand (skrót klawiszowy Q), a nastpnie, przytrzymujc wcinity kla-
wisz Alt, nacinij prawy przycisk myszy i przemie j w lewo, aby oddali widok. Po wyko-
naniu tej czynnoci wró do narzdzia Translate (skrót klawiszowy W), by ponownie wywietli
uchwyty osi obiektów.
Nie martw si, e strzaki zmieniaj kolor na óty podczas ich wybierania — na pewno uy-
wasz waciwego uchwytu!
392
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
A teraz kliknij uchwyt osi X w gadecie View, by uzyska boczny widok wyspy. Uyj go razem
z narzdziem Translate, aby przecign zielony uchwyt osi Y systemu czstek do centrum
wulkanu, tak jak zaprezentowano na poniszym rysunku:
Wreszcie wró do widoku perspektywicznego, klikajc biay szecian znajdujcy si w rodku
gadetu View, w prawym górnym naroniku widoku Scene.
393
Projektowanie gier w rodowisku Unity 3.x
Wymagane zasoby
W folderze Book Assets (zasoby ksiki) znajduj si nastpujce zasoby:
Zmie nazw nowo utworzonego materiau na Volcano Smoke Material, a póniej upewnij si,
e jest wybrany w panelu Project, by wywietli jego ustawienia w panelu Inspector (inspek-
tor). Z menu Shader (procedura cieniowania) wybierz opcj Particles/Alpha Blended (systemy
czstek/czenie kanau alfa). Spowoduje to zdefiniowanie stylu renderowania, który jest odpo-
wiedni dla czstek. Opcja Alpha Blended pozwoli na wywietlenie przezroczystego ta (znanego
jako kana alfa) tekstur definiujcych czstki, a take zaokrglonych krawdzi. Przecignij plik
tekstury volcanoSmoke z katalogu Book Assets/Textures i upu go na pusty obszar po prawej
stronie ustawienia Particle Texture (tekstura czstki), nie zmieniajc jednoczenie parametrów
Tiling (kafelkowanie) i Offset (przesunicie).
A teraz przecignij materia Volcano Smoke Material z folderu Materials w panelu Project, po
czym upu go na obiekcie systemu czstek Volcano Smoke w panelu Hierarchy.
Q podoba Ci si,
Q dobrze wspógra z utworzonym przez Ciebie stylem krateru wulkanu.
Pamitaj, e tylko wymienione niej parametry powinny zosta przez Ciebie zmodyfikowane;
inne zostaw niezmienione.
394
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
A teraz powi troch czasu, aby zmodyfikowa powysze parametry w celu lepszego dopa-
sowania systemu czstek do Twojego terenu.
Aby dowiedzie si wicej o systemach czstek, zapoznaj si z dokumentacj rodowiska Unity:
http://www.unity3d.com/support/documentation/Manual/Particle%20Systems.html.
Jak wczeniej wspomniano, wulkan nie jest rzeczywistym obiektem gry, dlatego równie w tym
przypadku nie moemy w prosty sposób doda do niego komponentu. Jednake teraz dyspo-
nujemy obiektem znajdujcym si w rodku wulkanu — jest nim system czstek. Oznacza to,
e moemy go uzupeni o komponent audio.
Upewnij si, e w panelu Hierarchy zosta wybrany obiekt Volcano Smoke, a nastpnie przejd do
opcji menu gównego Component/Audio/Audio Source (komponent/dwik/ródo dwiku).
395
Projektowanie gier w rodowisku Unity 3.x
Klip audio volcanoRumble, znajdujcy si w folderze Book Assets/Sounds (zasoby ksiki/dwiki),
przypisz do parametru Audio Clip (klip audio): przecignij go z panelu Project. Nastpnie
upewnij si, e zostaa wybrana opcja Play On Awake (automatyczne odtwarzanie). Dziki temu
dwik nie wymaga specjalnego wczenia, lecz bdzie automatycznie odtwarzany po wczytaniu
sceny. Rozwi ustawienia 3D Sound Settings (ustawienia dwiku trójwymiarowego) i zmody-
fikuj wycznie ponisze parametry, w innych pozostawiajc ustawienia domylne:
Q Min Distance (odlego minimalna): 50. Dziki temu dwik bdzie wyranie
syszalny na zewntrz wulkanu, a jego maksymalna amplituda wystpi w miejscu
odlegym o 50 metrów od lokalizacji systemu czstek.
Q Max Distance (odlego maksymalna): 500. Dziki temu ustawieniu dwik wulkanu
bdzie odbierany nawet na najbardziej odlegych kracach wyspy. Poniewa rozmiar
wyspy wynosi 500×500 metrów, od dwiku wrzcej lawy nie mona uciec! Wreszcie
zaznacz opcj wyboru Loop (ptla), aby upewni si, e dwik bdzie odtwarzany
przez cay czas.
Wskazówka
Pamitaj, e zmiany w panelu Inspector wprowadzone podczas testowania gry zostan od razu wycofane
po ponownym klikniciu przycisku Play w celu przerwania testów. Wykorzystaj t moliwo do prze-
prowadzenia rzeczywistych testów, a nastpnie upewnij si, e po zatrzymaniu dziaania gry odpowied-
nio zmodyfikowae waciwy komponent w panelu Inspector.
Równie we pod uwag, e powysze stwierdzenie nie dotyczy zmian wprowadzonych w obszarze zaso-
bów panelu Project (np. w folderze Materials), poniewa zmieniasz sam zasób, a nie waciwo obiektu
na scenie.
Warto przypomnie , e w celach testowych moesz zwikszy prdko poruszania si obiektu
First Person Controller, dziki czemu bdziesz móg szybciej chodzi po wyspie.
Aby to zrobi , w panelu Hierarchy wybierz obiekt First Person Controller podczas dziaania gry
testowej. Nastpnie przypisz odpowiedni warto do zmiennej publicznej Max Forward Speed,
znajdujcej si w komponencie Character Motor (Script). Pamitaj, e modyfikacja zostaa
wprowadzona wycznie w celach testowych, wic nie przejmuj si nadmiern prdkoci!
Prawidowa warto zostanie przywrócona zaraz po klikniciu przycisku Play, który przerywa
testowanie gry, co oznacza, e nie utracisz poprzednio ustawionych parametrów.
396
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Edycja prefabrykatu
Aby zaimplementowa wspomnian wyej modyfikacj, musimy wróci do prefabrykatu orzecha
kokosowego z rozdziau 7., poniewa komponent Trail Renderer musi zosta do niego przypi-
sany. Otwórz folder Prefabs (prefabrykaty) w panelu Project, a nastpnie odszukaj zasób pre-
fabrykatu Coconut.
Nowo dodany komponent po prostu wywietla krzyw wektorow w ksztacie uku, tworzc
szereg punktów za obiektem poruszajcym si w wiecie trójwymiarowym. Poprzez zdefinio-
wanie okrelonego czasu trwania efektu, rodzaju materiau oraz pocztkowych i kocowych
szerokoci krzywej moemy osign zamierzony rezultat. Aby zobaczy dziaanie komponentu
przy domylnych wartociach parametrów, kliknij przycisk Play i przyjrzyj si upadkowi orzecha
kokosowego. Za kokosem pojawi si róowy pas, niezawierajcy adnej tekstury. Nie wyglda to
zbyt ciekawie!
397
Projektowanie gier w rodowisku Unity 3.x
Rozwi parametr Materials (materiay), aby wywietli ustawienia Size (rozmiar) i Element 0
(element 0). W tym miejscu moemy zdefiniowa tekstur uywan do wywietlania ladu.
Stworzylimy ju materia ognia, a wic moemy go ponownie uy , gdy wykorzystuje on
odpowiedni rodzaj procedury cieniowania — Additive (soft) (cieniowanie addytywne mikkie).
Otwórz folder Materials w panelu Project i wyszukaj materia Flame. W dalszej kolejnoci prze-
cignij go na parametr Element 0 w miejsce, w którym w tej chwili widnieje napis None (Mate-
rial) (brak wybranego materiau).
Aby lad nie by zbyt dugi, przypisz parametrowi Time (czas) warto 0,25. Oznacza to, e lad
bdzie pozostawa w powietrzu przez 0,25 sekundy. Punkty na kocu ladu s usuwane po
upyniciu zdefiniowanego czasu.
W polu Start Width (szeroko pocztkowa) wprowad warto 0,25, a w polu End Width
(szeroko kocowa) — 0,1. Parametry te definiuj szeroko renderowanego materiau na
pocztku i kocu ladu. Ogólnie mówic, sensowne jest przypisanie wikszej wartoci dla
pocztku, by uzyska efekt zwania ladu.
Wreszcie rozwi parametr Colors (kolory) — zostanie wywietlonych pi biaych obszarów
koloru. Dziki opcji Colors moemy animowa wygld ladu poprzez zmian jego koloru
i widocznoci, wykorzystujc w tym celu ustawienia kanau alfa. Poniewa tekstura ognia jest
kolorowa, nie musimy tu modyfikowa odpowiednich barw, lecz sprawimy tylko, e lad bdzie
zanika. Kliknij po kolei kady obszar koloru i wprowad w polu A (kana alfa) odpowiednie
wartoci, poczynajc od 200 i za kadym razem zmniejszajc je o 50.
Pozostae pola mog zosta niezmienione. Parametr Min Vertex Distance (najmniejsza odlego
midzy wierzchokami) okrela, jaka powinna by minimalna odlego midzy dwoma punktami
tworzcymi lad. Wzrost liczby punktów powoduje, e lad zawiera wicej szczegóów, lecz
jednoczenie wymaga wtedy dodatkowej mocy obliczeniowej. Parametr Autodestruct (samo-
unicestwienie) nie moe zosta wczony, poniewa obiekt zawiera skrypt, który obsuguje usuwa-
nie prefabrykatów ze wiata gry (jest nim skrypt Object Tidy, stworzony przez nas w rozdziale 7.).
398
Rozdzia 11. • Poprawa wydajnoci i kocowe modyfikacje
Aktualizacja prefabrykatu
Przed chwil modyfikowalimy instancj prefabrykatu, która stracia poczenie ze swoim pier-
wotnym zasobem (std te komunikat wywietlany podczas dodawania komponentu renderera
ladu). Dlatego bdziemy musieli jeszcze wprowadzi zmiany w oryginalnym prefabrykacie,
aby kada jego nowa instancja zawieraa opcj tworzenia ladu.
Masz dwie moliwoci wykonania powyszego zadania: wybierz obiekt Coconut w panelu Hie-
rarchy, a nastpnie przejd do opcji menu gównego GameObject/Apply Changes to Prefab
(obiekt gry/wprowad zmiany w prefabrykacie) lub uyj przycisku Apply (zastosuj), znajdujcego
si na górze panelu Inspector, do naszego obiektu.
Poniewa uaktualnie oryginalny zasób prefabrykatu, nie musimy ju mie jego instancji
w scenie. Po prostu wybierz obiekt Coconut w panelu Hierarchy, a nastpnie usu go za pomoc
odpowiedniego skrótu klawiszowego (PC: Del, Mac: Command+Backspace).
Aby sprawdzi dziaanie efektu, przetestuj gr: spróbuj rzuca orzechami kokosowymi w mini-
grze, któr wczeniej stworzylimy.
399
Projektowanie gier w rodowisku Unity 3.x
Powiniene widzie ogniste lady tworzce trajektorie lotu kadego z rzucanych kokosów! Po
zakoczeniu testów nie zapomnij przerwa dziaania gry, a nastpnie wybierz opcj menu
gównego File/Save Scene (plik/zapisz scen), by zapamita stan projektu.
Podsumowanie
W tym rozdziale omawialimy zagadnienia zwizane z optymalizacj i tworzeniem efektów wizu-
alnych oraz owietlenia. S one jedynie wierzchokiem góry lodowej w porównaniu z tym, co
moesz robi w rodowisku Unity. Poniewa system pozwala na atw implementacj upik-
szajcych opcji, jest wane, aby pamita, e takie opcje powinny by brane pod uwag dopiero
wówczas, gdy gra jest ju stworzona. Kocowe ulepszenia s idealnym sposobem na zakoczenie
Twojego projektu, lecz waciwa rozgrywka powinna by zawsze na pierwszym miejscu.
Skoro ukoczylimy gr, w nastpnym rozdziale zajmiemy si jej budowaniem i testowaniem,
a take udostpnianiem uytkownikowi docelowemu. Przyjrzymy si równie metodom pozwa-
lajcym na dalsz optymalizacj gry oraz zastanowimy si, jak moe by ona traktowana z punktu
widzenia niezalenego projektanta.
400
12
Budowanie
i udostpnianie
Aby przeksztaci nasz gr z prostego przykadu w co, co moe zosta przekazane testerom,
powinnimy rozway róne platformy docelowe i zastanowi si, w jaki sposób moemy j udo-
stpni w sieci oraz wyeksportowa w postaci niezalenej aplikacji. Najlepsz metod rozwi-
jania swoich umiejtnoci projektowych jest dzielenie si swoj prac. Jednymi z najwaniej-
szych elementów kreatywnoci s zdolno akceptowania innych punktów widzenia i pozwolenie,
by wzbogaciy one Twoj twórcz osobowo projektanta. Dlatego te moliwo eksportowania
aplikacji sieciowych jest bardzo wan opcj w rodowisku Unity. Z tego rozdziau dowiemy si,
jak mona eksportowa gry na obie platformy docelowe.
Standardowa darmowa wersja Unity udostpnia moliwo budowania gier na takie platformy:
Wersja Pro oraz dodatki zwizane z urzdzeniami mobilnymi i konsol mog by uywane do
budowania gier na powysze platformy. S one jednoczenie wymagane w celu umoliwienia
tworzenia projektów do konsoli i urzdze mobilnych. Dodatki mobilne pozwalaj równie
tworzy wersje dla sprztu, który wykorzystuje systemy operacyjne iOS lub Android OS.
Projektowanie gier w rodowisku Unity 3.x
Z tego rozdziau dowiemy si, w jaki sposób mona zmodyfikowa zasoby, aby stworzy
wersj gry jako aplikacj samodzieln lub przeznaczon do internetu. Omówimy nast-
pujce zagadnienia:
Q opcje budowania,
Q opcje Build Settings (ustawienia budowania), pozwalajce na doczanie scen
i wybranie platformy,
Q panel Player Settings (ustawienia gracza), pozwalajcy na stworzenie wersji gry
bdcej aplikacj samodzieln lub przeznaczon do internetu,
Q wykrywanie platformy w celu usunicia zbdnych elementów z wersji
przeznaczonych do internetu,
Q sposoby udostpniania gier innym osobom oraz uzyskiwanie dalszej pomocy
w projektowaniu w rodowisku Unity.
Opcje budowania
rodowisko Unity oferuje moliwo dokonania wyboru midzy rónymi platformami doce-
lowymi. Rozwaajc swoj prac jako projektant Unity, powiniene wiedzie , e rodowisko
to bdzie na pewno uzupeniane o dodatkowe opcje, gdy pojawi si nowe platformy progra-
mowe lub sprztowe.
Aktualne opcje budowania s dostpne w oknie Build Settings (ustawienia budowania), które
zaprezentowano na poniszym rysunku:
Zanim zajmiemy si budowaniem docelowej wersji gry, zapoznajmy si z dostpnymi w tym
oknie opcjami.
Web Player
Podczas umieszczania w sieci dowolnych treci wykorzystujcych wtyczki naley je przesya
w postaci pakietu, który wywouje zainstalowany dodatek. W celu uycia gier udostpnionych
dla platformy sieciowej bdzie konieczne pobranie wtyczki Unity Web Player i zainstalowanie
jej w przegldarce, podobnie jak ma to miejsce w przypadku treci Adobe Flash wymagaj-
cych uycia aplikacji Flash Player. Aplikacja Web Player jest dostpna pod adresem http://www.
unity3d.com/webplayer.
Jeli jednak gracz bdzie chcia wczyta gr, a nie ma odtwarzacza Web Player, otrzyma infor-
macj zachcajc go do jego zainstalowania, dlatego te prawdopodobnie bdzie musia odwie-
dzi powysz stron internetow.
402
Rozdzia 12. • Budowanie i udostpnianie
Docelowe pliki gier przeznaczonych do internetu maj rozszerzenie .unity3d. Uywaj one
wtyczki Unity Web Player razem z towarzyszcym im plikiem HTML, zawierajcym niezbdny
kod. Osadzony plik HTML moe zosta nastpnie pobrany razem z plikiem gry i umieszczony
na stronie internetowej stworzonej przez uytkownika.
Aplikacja Web Player wykorzystuje przegldark internetow do wczytania pliku HTML, który
wywouje wtyczk Unity. Dlatego te dowolny komputer, na którym zostaa uruchomiona gra
Unity stworzona dla rodowiska sieciowego, udostpnia swoj moc przetwarzania przegldarce,
z czego pewna cz jest przeznaczona do wspierania odtwarzacza Web Player umieszczonego na
stronie internetowej.
Biorc to pod uwag, powinno si udostpnia gr w niszej rozdzielczoci dla rodowiska
sieciowego w porównaniu z wersj samodzieln. Nasz gr zaprojektowalimy dla stosunkowo
niskiej rozdzielczoci ekranu 1024×768 pikseli. Jednake podczas budowania wersji przezna-
czonej dla odtwarzacza Web Player rozmiar ekranu powinien zosta zmniejszony do przyka-
dowej rozdzielczoci 800×600 pikseli. Dziki temu obcienie procesora karty graficznej bdzie
mniej intensywne, poniewa bdzie on musia renderowa klatki o niszej rozdzielczoci, a to
pozwoli na uzyskanie wikszej wydajnoci. Z tego rozdziau dowiemy si, jakie parametry naley
zmodyfikowa , aby zbudowa gr przeznaczon dla wspomnianej wyej rozdzielczoci.
403
Projektowanie gier w rodowisku Unity 3.x
Gdy w poczeniu sieciowym pojawia si jakie opónienie, uytkownicy najczciej zaczy-
naj traci cierpliwo . Dlatego bardzo wane staje si ograniczenie czasów wczytywania
podczas tworzenia wersji gry przeznaczonej do internetu. Uycie opcji Web Player Streamed
oznacza, e moesz rozpocz granie w gr, jeszcze zanim wszystkie jej zasoby zostan zaa-
dowane. Gdy gracz jest zajty obsug pierwszej sceny, pozostae skadniki gry s wczytywane
w tle. Takie zachowanie jest porównywalne z dziaaniem stron udostpniajcych strumieniowe
przesyanie treci wideo, takich jak YouTube. Dziki temu, e dane s przekazywane w nie-
wielkich pakietach, moliwe jest rozpoczcie ogldania klipów, zanim zostan one cakowicie
wczytane do komputera.
Czynnik ten jest szczególnie wany w sytuacji, gdy umieszczasz swój program na portalach
powiconych grom komputerowym, takim jak www.kongregate.com, www.miniclip.com lub
www.indiepubgames.com. Takie strony oczekuj, e Twoja gra zostanie uruchomiona po
wczytaniu okoo 1 MB danych (dokadne parametry róni si w zalenoci od portalu). Dziki
trzymaniu si tej zasady bdziesz prawdopodobnie móg umieci swoj gr na wyej wymie-
nionych stronach i zyskasz moliwo zaprezentowania swojej pracy. Aby dowiedzie si wicej
o strumieniowaniu w sieci, przeczytaj odpowiedni fragment dokumentacji Unity: http://unity3d.
com/support/documentation/Manual/Web%20Player%20Streaming.html.
404
Rozdzia 12. • Budowanie i udostpnianie
zwyk amigówk lub gr suc po prostu do zabijania czasu, bdzie to dla Ciebie odpo-
wiedni sposób dostarczenia swoich prac kocowym uytkownikom. Jednake do gier, których
wiat jest widziany z perspektywy pierwszej osoby (czyli przykad omawiany w tej ksice),
aplikacja Dashboard nie jest zalecana.
Gry udostpniane w postaci widgetu powinny by proste, poniewa unikamy wówczas ado-
wania duej iloci danych do programu, a przez to rezerwowania odpowiedniej puli pamici.
Nie moe ona zosta zwolniona, gdy gra dostpna jako widget musi mie moliwo natychmia-
stowego uruchamiania lub zatrzymywania.
Ustawienia budowania
W rodowisku Unity wybierz opcj menu gównego File/Build Settings (plik/ustawienia budowa-
nia), a nastpnie przyjrzyj si dostpnym parametrom. Powiniene zobaczy opcje omówione
w powyszych punktach.
Kada platforma prezentowana w oknie Build Settings (ustawienia budowania) zawiera dodat-
kowe parametry, dostpne w postaci opcji wyboru i wywietlane po lewej stronie panelu. Moesz
oczywicie wyeksportowa swój projekt poprzez wybranie (podwietlenie w kolorze niebieskim)
docelowej platformy, a w dalszej kolejnoci kliknicie przycisku Build (buduj). Jednake w celu
uzyskania najlepszej konfiguracji, dopasowanej do docelowej platformy, powiniene j wybra ,
a nastpnie klikn przycisk Switch Platform (zmie platform), umieszczony w dolnej czci
okna Build Settings.
Spowoduje to, e rodowisko Unity przystosuje si do wybranej przez Ciebie platformy. Jest to
szczególnie wane, gdy chcesz udostpnia gry w rodowisku mobilnym. Wówczas rodowisko
Unity odpowiednio zmodyfikuje wykorzystywane zasoby w celu dopasowania ich do wybra-
nej platformy mobilnej, automatycznie zmieniajc dla nich ustawienia kompresji w panelu
Inspector (inspektor).
Inn wan zalet takiego wyboru jest to, i w widoku Game (gra) jest wówczas wywietlana
docelowa platforma z rozdzielczoci ekranu w postaci odpowiedniego ustawienia. Pozwala to
na przetestowanie gry przy uyciu poprawnej wielkoci ekranu, a dziki temu na wywietlenie
elementów dwuwymiarowych w rzeczywistych pooeniach.
405
Projektowanie gier w rodowisku Unity 3.x
Na samej górze okna Build Settings znajduje si lista scen dodanych do projektu. Na pierwszym
miejscu jest wywietlona scena Menu. Wane jest, aby scena, która powinna zosta najpierw
zaprezentowana graczowi, znajdowaa si na pierwszym miejscu na licie Scenes In Build
(sceny uwzgldniane w kompilacji). Jeli Twoja scena z menu gry nie jest pierwsza, moesz j
po prostu przecign i upuci we waciwym miejscu. Zauwa równie, e sceny s ponume-
rowane, czyli zawieraj indeks rozpoczynajcy si od zera, który znajduje si po prawej stronie
ich nazw. Te liczby mog by przydatne podczas wczytywania scen. W tym przypadku moesz
te odwoa si do sceny, podajc jej nazw (acucha tekstowego), tak jak zrobilimy w ksice.
Dopasujmy parametry budowania poprzez modyfikacj ustawie gracza, dziki czemu bd
one pasowa do projektu Survival Island.
Ustawienia gracza
Wyeksportowana wersja projektu jest znana w terminologii projektowania oprogramowania pod
nazw kompilacji (ang. build). Tworzc kompilacj w rodowisku Unity, w rzeczywistoci umiesz-
czasz odpowiednie treci w wewntrznej aplikacji, zwanej odtwarzaczem Unity. W grze prze-
znaczonej dla przegldarki internetowej wyeksportowany plik .unity3d wywouje odtwarzacz,
który znajduje si ju w zainstalowanej wtyczce Unity. Aplikacja samodzielna dla komputerów
PC lub Mac zawiera wbudowany odtwarzacz. Opcja Player Settings (ustawienia gracza) pozwala
na modyfikacj takich parametrów, jak rozdzielczo ekranu, ikony i ustawienia renderowania.
Powi chwil na wypenienie pól zwizanych z nazw projektu i firmy, a nastpnie odszukaj
tektur icon_large, znajdujc si w folderze Book Assets/Textures (zasoby ksiki/tekstury).
Wybierz j, a w dalszej kolejnoci przejd do komponentu Texture Importer w panelu Inspector
(inspektor) i wybierz GUI z menu Texture Type (rodzaj tekstury). Wreszcie kliknij przycisk Apply
406
Rozdzia 12. • Budowanie i udostpnianie
(zastosuj), aby zapisa wprowadzon zmian. Wró do ustawie Player Settings (Edit/Project
Settings/Player) i przecignij ikon na obszar Default Icon.
Poniewa obie wersje kompilacji, przeznaczone dla odtwarzacza Web Player i tworzce aplikacj
samodzieln, wykorzystuj powysze kategorie, przyjrzymy si im po kolei, by przeanalizowa
rónice midzy obiema platformami.
Przypisz parametrowi Default Screen Width (domylna szeroko ekranu) warto 800, a Default
Screen Height (domylna wysoko ekranu) — warto 600. W momencie pisania tej ksiki
rozdzielczo 800×600 pikseli bya najlepsz opcj dla odtwarzacza sieciowego, dostpn na
wielu portalach prezentujcych gry Unity, na przykad kongregate.com.
Obszar Web Player Template (szablon odtwarzacza sieciowego) udostpnia moliwo wybrania
sporód trzech podstawowych stylów strony HTML, która zostanie wyeksportowana w kompilacji
407
Projektowanie gier w rodowisku Unity 3.x
sieciowej. Poniewa gra, tak jak inne treci sieciowe, jest zawsze prezentowana w postaci
strony internetowej, powysza opcja pozwala na wywietlenie jednej z trzech rónych stron
HTML zawierajcych wbudowany plik .unity3d: Black Background (czarne to), Default
(domylna) i No Context Menu (bez menu kontekstowego). Ostatni typ zabezpiecza przed
wywietleniem menu podrcznego po klikniciu prawym klawiszem myszy obszaru okna
w przegldarce. Dziki temu gracz nie moe wybra opcji przejcia do trybu penoekranowego.
Moe to by przydatne dla niektórych projektantów, którzy chc, aby gracze grali w gr, uywajc
w tym celu jedynie udostpnionego okna. Powodem moe by na przykad potrzeba upew-
nienia si, by uytkownik jednoczenie widzia elementy towarzyszcej strony internetowej.
Dostpne szablony s poyteczne, gdy pozwalaj Ci przesa na serwer pliki HTML oraz
.unity3d bez koniecznoci tworzenia wasnej strony internetowej. S one równie przykadami
prezentujcymi wbudowanie pliku .unity3d w struktur HTML i zablokowanie menu kontek-
stowego.
Jeli potrafisz projektowa strony internetowe, bdziesz chcia po prostu wbudowa plik .unity3d
we wasn stron. Ponadto w przypadku przesyania gry na portal konieczne bdzie usunicie
towarzyszcej jej strony HTML. Wybierz teraz jeden z trzech dostpnych stylów.
Ustawienia Default Screen Width (domylna szeroko ekranu) i Default Screen Height (domylna
wysoko ekranu) definiuj domylne rozdzielczoci, jeli okno dialogowe nie jest wywietlane.
Wprowad wic w powyszych polach wartoci 1024 i 768, aby uzyska najnisz akceptowan
rozdzielczo , która powinna by wspierana w komputerach stacjonarnych lub laptopach.
Ikona
To ustawienie nie jest dostpne w wersji sieciowej, poniewa ikona odpowiadajca wczytanej
stronie internetowej zostaa narzucona przez portal, na którym znajduje si uruchamiana gra.
408
Rozdzia 12. • Budowanie i udostpnianie
Jak wida , istnieje take moliwo dostarczenia rónych tekstur odpowiadajcych poszczególnym
rozdzielczociom, co pozwala na zastosowanie prostszej grafiki dla mniejszych rozmiarów.
Obraz tytuowy
To ustawienie równie nie jest dostpne w wersji sieciowej, poniewa obraz tytuowy jest zwi-
zany z pierwsz scen, która znajduje si w grze, i by moe wykorzystuje animacj w celu
zaprezentowania logo producenta, co zapewne widziae w wielu aplikacjach komercyjnych.
Obraz tytuowy gry Survival Island zosta ju stworzony. Po prostu wybierz tekstur splash_image,
dostpn w folderze Book Assets/Textures (zasoby ksiki/tekstury) w panelu Project (projekt).
Nastpnie przejd do panelu Inspector i w komponencie Texture Importer zmie opcj Texture
Type (rodzaj tekstury) na GUI oraz kliknij przycisk Apply (zastosuj), by zapamita wprowadzon
409
Projektowanie gier w rodowisku Unity 3.x
Uwaga
Jeli chciaby sam zaprojektowa tekstur Config Dialog Banner, powiniene utworzy plik o rozdzielczoci
432×163 piksele, korzystajc ze swojego ulubionego programu graficznego.
Inne ustawienia
Inne ustawienia dotycz renderingu i optymalizacji, a take — w przypadku odtwarzacza Web
Player — strumieniowania.
Parametr First Streamed Level (pierwszy strumieniowany poziom) pozwala na okrelenie numeru
sceny, która powinna zosta zaadowana jako pierwsza w czasie strumieniowania gry. W polu
moesz wprowadzi dowolny indeks sceny, który znajduje si po prawej stronie listy scen w oknie
Build Settings.
410
Rozdzia 12. • Budowanie i udostpnianie
Ustawienia jakoci
Podczas eksportowania gry ze rodowiska Unity nie jeste ograniczony pojedynczym poziomem
jakoci. W obszarze Quality Settings (ustawienia jakoci), znajdujcym si w panelu Inspector
(inspektor), umieszczono szereg parametrów pozwalajcych definiowa jako produktów. Aby
go wywietli , wybierz opcj menu gównego Edit/Project Settings/Quality (edycja/ustawienia
projektu/jako ).
411
Projektowanie gier w rodowisku Unity 3.x
Jak wida , zestawy parametrów róni si znaczco, dlatego przyjrzyjmy si poszczególnym
ustawieniom:
Q Pixel Light Count (liczba wiate typu pikselowego). Liczba wiate pikselowych,
które mog zosta uyte w scenie. róda wiate w rodowisku Unity s renderowane
w postaci pikseli lub wierzchoków. wiata typu pikselowego wygldaj lepiej,
lecz s bardziej wymagajce wydajnociowo. Dziki temu parametrowi moesz
zezwoli na zdefiniowanie okrelonej liczby wiate pikselowych, a pozostae zostawi
w formie wiate wektorowych. Std te wynika warto 0 dla tego parametru
w ustawieniu Fastest.
Q Shadows (cienie). Ten parametr jest dostpny jedynie w wersji Unity Pro i pozwala
na wybranie sporód nastpujcych opcji: brak cieni dynamicznych, wycznie cienie
twarde, cienie twarde i mikkie. Jednake, jak widzielimy, w wersji darmowej Unity
cienie mog by wypalane podczas procesu odwzorowywania wiata.
Q Shadow Resolution (rozdzielczo cieni). Ta opcja równie ma zastosowanie wycznie
w wersji Unity Pro i pozwala na okrelenie jakoci generowanych cieni. Moe ona
zapewni wiksz wydajno gry podczas uywania wielu obiektów z dynamicznym
cieniowaniem. Zdefiniowanie niskiej rozdzielczoci moe oznacza zauwaaln rónic
pomidzy sytuacj, w której cienie zostan zupenie wyczone, oraz ustawieniem,
gdy bd one wczone podczas optymalizacji.
Q Shadow Cascades (kaskady cieni). Unity Pro moe wykorzystywa opcj Cascaded
Shadow Maps (kaskadowe mapy cieni), która poprawia w scenie wygld cieni wiate
kierunkowych. Jako mapy cienia zaley od jego odlegoci od kamery gracza
— im bliej si on znajduje, tym wicej zawiera szczegóów, co powoduje zwikszenie
jakoci obrazu.
Q Shadow Distance (zasig renderingu cieni). Ten parametr jest podobny
do optymalizacji zwizanej z ograniczeniem tylnej paszczyzny odcinajcej.
Moe zosta uyty w celu zdefiniowania odlegoci, powyej której cienie nie bd
renderowane.
Q Blend Weights (wagi przenikania). To ustawienie jest wykorzystywane w postaciach
ze szkieletem zbudowanym z koci. Pozwala ono na ustalenie liczby wag (poziomów)
animacji, które mog midzy sob przenika . Firma Unity Technologies zaleca uycie
dwóch koci jako dobrego kompromisu pomidzy wydajnoci i jakoci prezentacji.
Q Texture Quality (jako tekstur). Opcja ta definiuje poziom kompresji tekstur.
Q Anisotropic Textures (tekstury anizotropowe). Ten parametr moe poprawi wygld
tekstur podczas spogldania na nie z duego kta (na przykad tekstur umieszczonych
na wzgórzach). Jego wad jest to, i wpywa na wydajno gry. Pamitaj, e moesz
go równie uy w odniesieniu do pojedynczych tekstur w opcji Import Settings
(ustawienia importu), dostpnej dla zasobów.
Q Anti Aliasing (antyaliasing). To ustawienie wygadza krawdzie elementów
trójwymiarowych, sprawiajc, e gra wyglda duo lepiej. Jednake, podobnie
jak ma to miejsce w przypadku innych filtrów, wpywa na wydajno dziaania aplikacji.
412
Rozdzia 12. • Budowanie i udostpnianie
Naley uywa tych opcji, które poprawi wraenia odbioru u gracza, poniewa moe on mie
dostp do nich z okna Resolution Dialog (wybór rozdzielczoci) (patrz podrozdzia „Ustawienia
gracza”), wywietlanego dla gry uruchamianej w postaci samodzielnej aplikacji. Jednake
w wikszoci przypadków bezpieczne jest zastosowanie odpowiedniego zestawu ustawie Unity,
a nastpnie, w razie koniecznoci, zmodyfikowanie wybranych opcji. Ustawienia znajdujce
si na górze obszaru Quality Settings, które oferuj domylne konfiguracje, s równie przy-
datne, pozwalaj bowiem na zdefiniowanie jakoci w samym edytorze, co umoliwia uzyska-
nie bardziej realistycznej reprezentacji kocowego wygldu Twojej gry.
W rodowisku Unity przejd do opcji menu gównego Edit/Project Settings/Input, aby wywietli
ustawienia Input Manager (meneder wej ) w panelu Inspector (inspektor). Zostan zapre-
zentowane rodzaje sygnaów wejciowych, które moesz kontrolowa . Warto Size (rozmiar)
po prostu oznacza, ile sygnaów zdefiniowano. Poprzez zwikszenie tej wartoci moesz two-
rzy sygnay wejciowe. Aby zmodyfikowa ustawione parametry, wystarczy klikn szare strzaki,
znajdujce si po prawej stronie ich nazw. Kliknij strzak przy pozycji Fire1, by j rozwin .
Analizujc wywietlone parametry, moesz teraz zrozumie , w jaki sposób s one powizane
z kodem, który wczeniej stworzylimy. W skrypcie CoconutThrower umiecilimy nastpujc
instrukcj:
if(Input.GetButtonUp("Fire1")){
413
Projektowanie gier w rodowisku Unity 3.x
W powyszym kodzie odwoujemy si do sygnau wejciowego Fire1 po jego nazwie. Zmieniajc
parametr Name (nazwa) w ustawieniach wej , moesz zdefiniowa odpowiedni nazw, któr
nastpnie bdziesz móg wykorzysta w skryptach. Aby dowiedzie si wicej o klawiszach, któ-
rych moesz uywa w powyszych ustawieniach, zapoznaj si ze stron Input (wejcie) doku-
mentacji rodowiska Unity, dostpn pod adresem: http://unity3d.com/support/documentation/
Manual/Input.html.
Budowanie gry
Poniewa jestemy prawie gotowi do zbudowania gry, powiniene rozway róne rodzaje kompi-
lacji, które zostay wczeniej omówione, a nastpnie przystosowa projekt do dwóch docelo-
wych postaci: gry uruchamianej w przegldarce internetowej, a take samodzielnej aplikacji.
Aby rozwiza problem, uyjemy innej waciwoci klasy Application zwanej platform — pozwala
ona na wykrywanie rodzaju platformy docelowej (komputer typu desktop, przegldarka inter-
netowa, urzdzenie mobilne, konsola itd.), na której dziaa gra.
414
Rozdzia 12. • Budowanie i udostpnianie
W powyszym kodzie sprawdzamy, czy warto waciwoci platform, nalecej do klasy Appli
´cation, jest róna od OSXWebPlayer (Mac) lub WindowsWebPlayer (PC). W tym celu uywamy
zapisu !=, oznaczajcego „nie jest równy”. Jeli wic gra nie zostaa uruchomiona na kompu-
terze typu Mac lub w odtwarzaczu Web Player, naley co zrobi ! Teraz powinnimy poczy
t funkcjonalno z istniejcym poleceniem if, które wywietla klawisz Quit.
W funkcji OnGUI() odszukaj polecenie if, które tworzy klawisz Quit. Powinno ono wyglda tak:
Jzyk C#:
if(GUI.Button(new Rect(quitButton), "Quit")){
StartCoroutine("ButtonAction", "quit");
}
Jzyk JavaScript:
if(GUI.Button(Rect(quitButton), "Quit")){
ButtonAction("quit");
}
A teraz dodaj now instrukcj if, umieszczajc istniejce polecenie if wewntrz niego. Docelowy
kod powinien wyglda tak jak poniej:
Jzyk C#:
if(Application.platform != RuntimePlatform.OSXWebPlayer && Application.platform
´!= RuntimePlatform.WindowsWebPlayer){
if(GUI.Button(new Rect(quitButton), "Quit")){
StartCoroutine("ButtonAction", "quit");
}
}
Jzyk JavaScript:
if(Application.platform != RuntimePlatform.OSXWebPlayer && Application.platform
´!= RuntimePlatform.WindowsWebPlayer){
if(GUI.Button(Rect(quitButton), "Quit")){
ButtonAction("quit");
}
}
Oznacza to, e w przypadku kompilacji gry do aplikacji samodzielnej przycisk Quit bdzie
widoczny na ekranie. Jeli jednak zostanie wykryta platforma typu Mac lub PC Web Player,
wówczas przycisk nie pojawi si.
415
Projektowanie gier w rodowisku Unity 3.x
Player lub aplikacji samodzielnej bez potrzeby modyfikowania kodu. Ta technika moe by
bardzo przydatna podczas tworzenia bardziej zoonych struktur menu oraz innych elementów
i poszerza moliwoci wspierania wielu platform przez rodowisko Unity.
Przygotowanie do strumieniowania
Aby poziom Island móg by wczytywany w postaci strumieniowanego zasobu, zmodyfikujemy
kod w taki sposób, by po cakowitym zaadowaniu sceny udostpnia graczowi w menu wycznie
przycisk Play (granie). Zapobiegnie to wczytywaniu caej gry przed wywietleniem menu.
Zamiast tego moemy zaprezentowa menu zawierajce komunikat Loading... xx% Loaded
(Trwa adowanie… Wczytano xx%) podczas adowania sceny Island.
Jzyk C#:
if(GUI.Button(new Rect(playButton), "Play")){
StartCoroutine("ButtonAction", "Island");
}
416
Rozdzia 12. • Budowanie i udostpnianie
Jzyk JavaScript:
if(GUI.Button(Rect(playButton), "Play")){
ButtonAction("Island");
}
Umie go w nowej instrukcji if, by sprawdzi , czy scena Island zostaa wczytana:
Jzyk C#:
if(Application.CanStreamedLevelBeLoaded("Island")){
if(GUI.Button(new Rect(playButton), "Play")){
StartCoroutine("ButtonAction", "Island");
}
}
Jzyk JavaScript:
if(Application.CanStreamedLevelBeLoaded("Island")){
if(GUI.Button(Rect(playButton), "Play")){
ButtonAction("Island");
}
}
417
Projektowanie gier w rodowisku Unity 3.x
Powyszy kod sprawdza, czy scena Island jest gotowa do wczytania. Jeli tak, nastpuje wów-
czas rendering przycisku Play. Moemy teraz doda instrukcj else, która wywietli postp
strumieniowego wczytywania poziomu Island, jeeli nie zostao ono jeszcze ukoczone.
Jzyk C#:
else{
float percentLoaded = Application.GetStreamProgressForLevel(1) * 100;
GUI.Box(new Rect(playButton), "Loading.. " + percentLoaded.ToString("f0") +
´"% Loaded");
}
Jzyk JavaScript:
else{
var percentLoaded : float = Application.GetStreamProgressForLevel(1) * 100;
GUI.Box(new Rect(playButton), "Loading.." + percentLoaded.ToString("f0") +
´"% Loaded");
}
Otrzymana wielko jest mnoona przez 100, aby uzyska warto procentow. Nastpnie jest
wywietlana w kontrolce GUI.Box, której przekazujemy wartoci pooenia i skali, uywajc w tym
celu parametru Rect klawisza playButton. Oznacza to, e dopóki scena Island nie bdzie gotowa
do uruchomienia, informacja o jej wczytywaniu bdzie wywietlana w miejscu klawisza Play.
Rzeczywisty tekst wywietlany w kontrolce Box jest wanym elementem kodu. Powstaje on przy
uyciu nastpujcego wyraenia:
"Loading.." + percentLoaded.ToString("f0") + "% Loaded"
Pocztek i koniec powyszego kodu skadaj si ze zwykych acuchów tekstowych: Loading..
i % Loaded. Wykorzystujemy jednak znak plusa, aby umieci polecenie wywietlajce midzy
nimi zmienn percentLoaded. Jest ona formatowana za pomoc instrukcji ToString("f0"), która
usuwa cz uamkow z wartoci przechowywanej w zmiennej. W rezultacie otrzymujemy przy-
kadowy tekst: Loading.. 86% Loaded.
Uwaga
Uycie symbolu plusa w celu dodania do acucha tekstowego wartoci zmiennych i funkcji jest zwane
konkatenacj (std te czasownik „konkatenowa”). Znajomo tego terminu moe by przydatna pod-
czas analizy Twojego kodu, przeprowadzanej z udziaem innych projektantów.
418
Rozdzia 12. • Budowanie i udostpnianie
Aby nie musia przeprowadza testów na serwerze, prezentujemy rysunek ze zrzutem ekranu
z informacj o adowaniu, której nie przypisano adnego stylu:
Wyglda to niezbyt adnie, nieprawda? Poniewa tekst nie odpowiada stylowi wykorzystywa-
nemu w menu, spróbujmy poprawi wygld grafiki.
Zapisz swój skrypt i wró do rodowiska Unity, a nastpnie wybierz obiekt Menu2 w panelu
Hierarchy (hierarchia). Spowoduje to wywietlenie komponentu Main Menu GUI (Script), co
z kolei pozwoli zauway , e uywamy konfiguracji graficznej GUISkin o nazwie Main Menu.
Wybierz j w tym miejscu lub w panelu Project (projekt), aby wywietli waciwoci GUISkin
w panelu Inspector (inspektor).
Poniewa w naszym kodzie chcemy zmodyfikowa styl kontrolki GUI.Box, kliknij ikon szarej
strzaki po prawej stronie kontrolki Box (ramka) w górnej czci listy stylów, co spowoduje
wywietlenie dostpnych parametrów.
S trzy parametry, które powinnimy zmieni w celu dopasowania stylu ramki wywietlajcej
informacje o postpie wczytywania:
Q to ramki,
Q rozmiar czcionki i jej kolor,
Q pooenie tekstu wewntrz ramki.
Aby to zrobi , najpierw upewnij si, e dla kontrolki Box rozwinito waciwo Normal (nor-
malny), dziki czemu masz dostp do parametrów Background (to) oraz Text Color (kolor tekstu).
419
Projektowanie gier w rodowisku Unity 3.x
Kliknij obszar koloru Text Color i wybierz barw czarn z okna wyboru koloru, a nastpnie je zam-
knij. Przejd niej do dalszych ustawie kontrolki Box i przypisz wybran przez Ciebie czcionk
do parametru Font (czcionka). Zmie take warto pola Font Size (rozmiar czcionki) na 22.
Wreszcie odszukaj waciwo Alignment (justowanie). Okrela ona miejsce, w którym pojawi si
tre wywietlana w ramce, czyli informacja o postpie adowania. Przypisz jej warto Middle-
Center (rodek, centrum), dziki czemu nie bdziemy si zajmowa odpowiednim wyrównaniem
tekstu wewntrz ramki. Po zakoczeniu dziaa ustawienia GUISkin kontrolki Box powinny
wyglda tak:
W praktyce spowoduje to, e Twój pasek postpu bdzie mia taki wygld:
420
Rozdzia 12. • Budowanie i udostpnianie
Gdy tylko licznik osignie warto 100%, zostanie automatycznie zastpiony przyciskiem Play,
co pozwoli graczowi na rozpoczcie gry.
I to wszystko! Dysponujesz teraz fragmentem kodu GUI, który bdzie prezentowa graczowi
postp wczytywania gry. Podczas adowania poziomu pozwól mu w spokoju przeczyta instrukcj
dostpn w menu. Pamitaj, e stworzona przed chwil wersja jest dostpna jedynie dla gry
przeznaczonej do uruchamiania w przegldarce internetowej, dziki czemu bdzie moliwe
wykorzystanie funkcjonalnoci strumieniowania. Nie przetestujesz jej w edytorze Unity ani
w aplikacji samodzielnej. Zapamitaj swój projekt poprzez uycie opcji menu gównego
File/Save Project (plik/zapisz projekt).
Pierwsza kompilacja
Po dokonaniu pewnych zmian w naszym kodzie, zapewniajcych dziaanie gry w obu platfor-
mach docelowych, nadszed czas na stworzenie pierwszej kompilacji. Napicie ronie, niepraw-
da? Tak wic bez zbdnej zwoki utwórzmy wersj gry bdc samodzieln aplikacj, dziki
czemu bdziesz mia okazj przyjrze si jej spoza rodowiska Unity.
Q Menu.unity,
Q Island.unity.
Uwaga
Jeli jaka scena nie jest widoczna na licie, moesz j przecign z panelu Project i upuci w oknie
Build Settings.
421
Projektowanie gier w rodowisku Unity 3.x
Wane jest, aby scena Menu bya pierwsza na licie, poniewa ona najpierw powinna zosta
wczytana. Upewnij si wic, e jej indeks jest równy 0 i znajduje si ona na górze obszaru Scenes
In Build. Jeli tak nie jest, moesz j po prostu przecign i upuci we waciwym miejscu listy.
Logo Unity, wywietlone w obszarze Platform (platforma) okna Build Settings obok nazwy okre-
lonej platformy docelowej, informuje o wybraniu rodzaju kompilacji. Upewnij si, e zostaa
podwietlona opcja PC and Mac Standalone (PC i Mac — aplikacja samodzielna), a nastpnie
kliknij przycisk Switch Platform (zmie platform), znajdujcy si w dolnym lewym obszarze
okna.
Uwaga
Zmieniamy platform w celu zachowania zgodnoci, poniewa umoliwi nam to wywietlenie rozdziel-
czoci w licie rozmiarów okien, dostpnej w widoku Game (gra). Nie jest to jednak konieczne, jeli pra-
cujesz nad gr i regularnie przeczasz si midzy platformami. Pamitaj, e rodowisko Unity podczas
kompilacji i tak potrafi automatycznie zmieni rodzaj platformy na t, która jest aktualnie wybrana.
Logo Unity powinno si znajdowa po prawej stronie napisu PC and Mac Standalone.
A teraz po prostu wybierz odpowiedni opcj z menu Target Platform (platforma docelowa):
Q Windows,
Q Windows 64-bit,
Q Mac OS X Universal (Mac OS X, kompilacja uniwersalna),
Q Mac OS X Intel Only (Mac OS X, kompilacja tylko dla procesora Intel),
Q Mac OS X Power PC Only (Mac OS X, kompilacja tylko dla procesora Power PC),
Q Mac OS X Dashboard Widget (Mac OS X, widget aplikacji Dashboard).
Po klikniciu przycisku Build (buduj) w dolnej czci okna dialogowego pojawi si pytanie o loka-
lizacj docelowego pliku gry. Wybierz odpowiedni katalog i wprowad nazw gry w polu Save As
(zapisz jako). Nastpnie kliknij przycisk Save (zapisz), aby zapisa plik.
Czekaj cierpliwie, a Unity zakoczy proces budowania Twojej gry! W jego trakcie bd wywie-
tlane informacje o aktualnie kompresowanych zasobach oraz pasek postpu, potwierdzajcy
doczenie do kompilacji kadej ze scen. Po zakoczeniu budowania gry zostanie otwarte okno
systemu operacyjnego, pokazujce gotowy plik gry w katalogu, w którym wybrano jego lokalizacj.
Dwukrotnie kliknij plik gry, aby j uruchomi . Pamitaj, e gdy skompilujesz wersj PC
w komputerze Mac (i odwrotnie), nie bdzie ona moga zosta przetestowana w rodowisku
natywnym.
422
Rozdzia 12. • Budowanie i udostpnianie
Inne rónice, takie jak brak dynamicznych cieni w wersji darmowej, zostay zaprezentowane
na stronie internetowej: http://unity3d.com/unity/licenses.html.
Jak wspomniano wczeniej, nie ma potrzeby klikania opcji Switch Platform, poniewa rodowisko
Unity samo zmieni rodzaj platformy na t, która jest aktualnie wybrana. Biorc to pod uwag,
kliknij po prostu przycisk Build. W oparciu o ustawienia dostpne w obszarze Player Settings
rodowisko Unity przeprowadzi odpowiednie konwersje i kompresje, niezbdne do utworzenia
kompilacji, która bdzie moga dziaa w przegldarce internetowej.
Zostaniesz poproszony o wskazanie lokalizacji, w której pojawi si plik docelowy. Wybierz j,
a nastpnie kliknij przycisk Save (zapisz).
423
Projektowanie gier w rodowisku Unity 3.x
Po ukoczeniu procesu system operacyjny wywietli katalog, w którym znajduje si Twoja kom-
pilacja. Skada si ona z dwóch elementów: waciwej gry (pliku z rozszerzeniem .unity3d) oraz
pliku HTML, zawierajcego wbudowany kod oraz wstawk w jzyku JavaScript, która jest nie-
zbdna do wczytania pliku .unity3d lub gdy wtyczka Unity Web Player nie zostaa zainstalo-
wana, do wywietlenia zachty do jej pobrania.
Aby zagra w gr, otwórz plik HTML w swojej ulubionej przegldarce, co spowoduje urucho-
mienie aplikacji. Nie musisz instalowa wtyczki Web Player, poniewa zostaa ona automa-
tycznie umieszczona w Twoim komputerze podczas instalowania rodowiska Unity.
Gdyby chcia umieci kod HTML lub JavaScript na swojej stronie internetowej, powiniene
po prostu uy instrukcji zawartych pomidzy znacznikami <head> i <body>. Wynika to std, e
domylna kompilacja Unity udostpnia niezbdny kod, który pozwala na doczenie pliku .unity3d
do strony internetowej. Jeli nie jeste zainteresowany umieszczaniem odtwarzaczy sieciowych
na swoich stronach internetowych, przejd do podrozdziau „Udostpnianie swoich prac”.
Nastpnie pojawia si skrypt, który zarzdza wczytywaniem treci w sytuacji, gdy wtyczka Web
Player jest ju zainstalowana. Kod jest zapisany bezporednio na stronie HTML i wyglda tak:
<script type="text/javascript">
<!--
function GetUnity() {
if (typeofunityObject != "undefined") {
return unityObject.getObjectById("unityPlayer");
}
return null;
}
if (typeofunityObject != "undefined") {
unityObject.embedUnity("unityPlayer", "SurvivalIsland.unity3d", 800,
´600);
424
Rozdzia 12. • Budowanie i udostpnianie
}
-->
</script>
Zwró uwag na to, e skrypt wczytuje zawarto o nazwie SurvivalIsland.unity3d. Twoja funkcja
bdzie jednak uywa nazwy, któr podae w czasie zapisywania pliku w katalogu docelo-
wym. Kod wyszukuje na stronie element zwany unityPlayer, wykorzystujc w tym celu funkcj
getObjectById(). Jeli zostanie on znaleziony, przesya do niego zawarto pliku .unity3d.
Otwórz plik HTML zwizany z nasz kompilacj sieciow. W tym celu wykorzystaj domylny
edytor Unity o nazwie MonoDevelop lub swój ulubiony edytor HTML, na przykad Dream-
weaver, Coda, SciTE, TextMate lub TextWrangler1.
Zaznacz cay kod JavaScript, który znajduje si w obszarze znacznika <head> pliku HTML:
function GetUnity() {
if (typeofunityObject != "undefined") {
return unityObject.getObjectById("unityPlayer");
}
return null;
}
if (typeofunityObject != "undefined") {
unityObject.embedUnity("unityPlayer", "SurvivalIsland.unity3d", 800, 600);
}
Wklej go do nowego dokumentu JavaScript, a nastpnie zapisz pod nazw UnityLoader.js w folde-
rze, w którym znajduje si Twoja strona internetowa. Umie jego wywoanie na swojej stronie,
podajc w obszarze znacznika <head> poniszy kod:
<script type="text/javascript" src="UnityLoader.js"></script>
Proste, nieprawda? Jeli bdziesz chcia uy treci Unity, moesz po prostu doczy powyszy
wiersz oraz istniejce wywoanie, wykrywajce obecno wtyczki Unity Player:
<script type="text/javascript" src="http://webplayer.unity3d.com/
´download_webplayer-3.x/3.0/uo/UnityObject.js"></script>
<script type="text/javascript" src="UnityLoader.js"></script>
1
Moesz take uy uniwersalnego edytora tekstowego Notepad++, obsugujcego skadni HTML
i JavaScript — przyp. tum.
425
Projektowanie gier w rodowisku Unity 3.x
Pamitaj, e w kodzie zaoono, i plik .unity3d znajduje si w tym samym katalogu co plik
HMTL, który go wywouje. Jeli chciaby umieci swój plik .unity3d w innym miejscu, powi-
niene zmodyfikowa polecenie embedUnity, na przykad:
unityObject.embedUnity("unityPlayer", "http://www.twojastrona.com/
´nazwafolderu/SurvivalIsland.unity3d", 800, 600);
Jednake s dwie sprawy, o których naley pamita . Po pierwsze powiniene zawsze umieszcza
swój styl CSS w specjalnym dokumencie, zwanym arkuszem stylów. Po drugie pewne fragmenty
prezentowanego tu kodu s uywane w celu zaprojektowania strony i nie dotycz stylu osadzo-
nego obiektu Unity. Pamitajc o powyszych uwagach, zaznacz nastpujcy fragment kodu CSS:
div.missing {
margin: auto;
position: relative;
top: 50%;
426
Rozdzia 12. • Budowanie i udostpnianie
width: 193px;
}
div.missing a {
height: 63px;
position: relative;
top: -31px;
}
div.missing img {
border-width: 0px;
}
div#unityPlayer {
cursor: default;
height: 600px;
width: 800px;
}
Teraz utwórz nowy plik z rozszerzeniem .css i zapamitaj go pod przykadow nazw Unity-
Style.css. Wklej do niego powyszy kod.
Plik ten moe zosta doczony do Twojej strony poprzez umieszczenie nastpujcego wiersza
HTML w obszarze znacznika <head>:
<link href="UnityStyle.css" type="text/css" rel="stylesheet" />
Zdefiniowalimy ju trzy niezbdne elementy, które sprawi, e Twoja gra, uruchamiana na
stronie HTML, bdzie bardziej przenona! Obszar znacznika <head> strony, w której osadzisz
treci Unity, powinien wyglda tak:
<head>
<title>Survival Island</title>
<script type="text/javascript" src="http://webplayer.unity3d.com/
´download_webplayer-3.x/3.0/uo/UnityObject.js"></script>
<script type="text/javascript" src="UnityLoader.js"></script>
<link href="UnityStyle.css" type="text/css" rel="stylesheet" />
</head>
Na pocztku powyszego kodu uywamy znacznika <title>, który jest wymagany dla kadej
strony internetowej. Nastpnie pojawia si wywoanie pliku JavaScript, obsugujcego odtwa-
rzacz sieciowy i znajdujcego si na serwerze Unity. Za nim s umieszczone dwa odnoniki do
lokalnych zasobów: pliku JavaScript UnityLoader.js oraz pliku arkusza stylów UnityStyle.css.
Poprzez zdefiniowanie tych trzech elementów w obszarze znacznika <head> oraz uycie kodu
z osadzonym obiektem z obszaru <body> moesz atwo umieszcza swoje treci na dowolnych
stronach internetowych, które bdziesz tworzy .
427
Projektowanie gier w rodowisku Unity 3.x
Oprócz udostpniania swoich prac na wasnej stronie internetowej moesz skorzysta z nieza-
lenych portali powiconych grom, które równie skupiaj projektantów dzielcych si swoj
twórczoci z innymi osobami.
Oto kilka polecanych stron, które powiniene odwiedzi , gdy bdziesz ju gotowy do podzielenia
si swoj prac ze spoecznoci internetow:
Q www.kongregate.com,
Q www.facebook.com (w postaci aplikacji),
Q www.shockwave.com,
Q www.indiegames.com,
Q www.tigsource.com (forum Independend Gaming),
Q forum.unity3d.com (panel Showcase),
Q www.learnunity3d.com oraz www.unity3dstudent.com,
Q www.unitybook.net (strona powicona niniejszej ksice).
Po prostu wejd na portal, utwórz konto, a nastpnie wybierz opcj Games/Upload a Game
(gry/przelij gr) z dostpnego menu gównego. Wypenij formularz pozwalajcy na przesa-
nie treci do spoecznoci Kongregate i podziel si odnonikiem do swojej gry na Twitterze lub
Facebooku.
Udostpnianie gier w taki sposób jest wietnym sposobem na uzyskanie informacji zwrotnych.
Moesz otrzymywa komentarze i oceny, jak równie przesya nowe wersje oprogramowania
oraz rozmawia z osobami grajcymi aktualnie w Twoje gry.
428
Rozdzia 12. • Budowanie i udostpnianie
Ten rodzaj bezstronnego kontaktu z uytkownikami jest bardzo wany, pozwala bowiem na
wykrywanie bdów oraz fragmentów gry, które moe s intuicyjne dla Ciebie, ale nie dla prze-
citnego gracza.
Pamitaj równie, e niektóre portale nie maj moliwoci przechowywania Twoich gier w for-
macie .unity3d, lecz wymagaj podania odnonika do Twojego blogu, który zawiera osadzon
gr, lub do serwera, który pozwala na pobranie samodzielnej aplikacji.
Podsumowanie
Z tego rozdziau dowiedzielimy si, w jaki sposób mona eksportowa gr do rodowiska sie-
ciowego oraz do postaci samodzielnej aplikacji.
W ostatnim rozdziale zastanowimy si nad tym, czego nauczylimy si w trakcie czytania tej
ksiki, a take zaprezentujemy moliwoci zdobywania dalszej wiedzy i rozwijania umiejt-
noci. Poinformujemy równie, gdzie mona uzyska wsparcie w projektowaniu gier w ro-
dowisku Unity.
429
Projektowanie gier w rodowisku Unity 3.x
430
13
Testy i dalsze
zdobywanie wiedzy
Pamitajc o powyszych punktach, moesz zastanowi si nad dalszym poszerzaniem swojej
wiedzy. Oto najwaniejsze obszary zagadnie, które powiniene uwzgldni w tym procesie:
Q tworzenie skryptów,
Q tworzenie skryptów,
Q tworzenie skryptów.
Powysza lista jest prawidowa — to nie art. Mimo e rodowisko Unity synie z dostarczania
intuicyjnych zestawów narzdzi do projektowania wizualnego, a take udostpnia graficzny
interfejs, pozwalajcy na budowanie scen i obiektów gry, nic nie zastpi nauki klas i polece,
które wykorzystuj waciwy silnik Unity.
Projektowanie gier w rodowisku Unity 3.x
Zastanów si nad prost mechanik gry, a nastpnie postaraj si wymyli , w jaki sposób mona
j zbudowa . Wykorzystujc mechanizm ideacji, usprawniasz proces uczenia si, a take uzy-
skujesz motywacj, pomagajc w zachowaniu odpowiedniego poziomu koncentracji, ponie-
wa masz do osignicia okrelony cel, a nie poszerzasz swojej wiedzy tylko ogólnie, bez ad-
nej okrelonej zachty.
Testowanie i finalizowanie
Podczas projektowania gier powiniene by wiadomy tego, e bardzo wanym elementem jest
testowanie Twojej aplikacji przez uytkowników, którzy nie mieli z ni wczeniej do czynienia.
W trakcie pracy nad dowolnym kreatywnym projektem powiniene wiedzie , e w celu zacho-
wania twórczej obiektywnoci musisz by otwarty na sowa krytyki, które wynikaj z odpo-
wiedniego procesu testowania, bdcego równie techniczn koniecznoci. Bardzo atwo mona
si przyzwyczai do narracji lub mechaniki gry. Równie czsto nie jest moliwe obiektywne
spojrzenie na wasn gr, tak jak mógby j potraktowa zwyky gracz. Zamiast traktowa gr
wycznie z punktu widzenia jej projektanta, zawsze próbuj wciela si w rol gracza. By
moe pewne fragmenty gry s oczywiste dla Ciebie, lecz mog nie mie sensu dla uytkownika.
432
Rozdzia 13. • Testy i dalsze zdobywanie wiedzy
Po przetestowaniu gry w wersji alfa przez Ciebie i innych projektantów, powiniene przekaza
j okrelonej grupie testerów publicznych. Bdzie to tak zwany test beta. Dziki sformalizo-
waniu tego procesu moesz sprawi , by otrzymane informacje zwrotne byy jak najbardziej
przydatne. Stwórz kwestionariusz, w którym umiecisz pytania do testerów nie tylko o ich reak-
cje na gr, lecz take o nich samych. W ten sposób moesz wyciga pewne wnioski dotyczce
swojej gry, na przykad:
Gracze pomidzy 18 i 24 rokiem ycia rozumiej gr i podoba si im jej mechanika,
lecz gracze w wieku 45 lat lub wicej nie rozumiej jej bez wczeniejszego przeczytania
instrukcji.
Przypadkowi gracze uwaaj, e gra nie zawiera interesujcych elementów, które
mogyby zachci ich do grania w ni. Rozwa modyfikacj projektu poziomów.
Aby udostpnia testerom gr i uzyskiwa od nich okrelone informacje zwrotne o parametrach
technicznych, takich jak szybko klatek (liczba klatek wywietlanych przez gr na ekranie
w cigu sekundy), moesz uzupeni swoj kompilacj testow o element GUI, który bdzie
wywietla niezbdne dane.
433
Projektowanie gier w rodowisku Unity 3.x
Przyjrzyjmy si praktycznemu przykadowi, dziki czemu bdziesz móg wywietla interesu-
jce Ci dane w dowolnej scenie. Otwórz scen, w której chcesz wywietla szybko klatek —
w naszym przypadku bdzie to scena Island. Nastpnie stwórz nowy obiekt GUI Text, w którym
pojawi si informacje. W tym celu przejd do opcji menu gównego GameObject/Create Other/
GUI Text (obiekt gry/stwórz inny/GUI Text) lub kliknij przycisk Create (stwórz) w panelu Hie-
rarchy (hierarchia), a w dalszej kolejnoci wybierz opcj GUI Text. Zmie nazw nowo utwo-
rzonego obiektu na FPS display, po czym w komponencie GUI Text panelu Inspector (inspektor)
przypisz parametrowi Anchor (zakotwiczenie) warto upper center (górna krawd, na rodku),
a parametrowi Alignment (justowanie) — center (do rodka). Aby zachowa zgodno , przejd do
panelu Project (projekt) i przecignij uywan przez Ciebie czcionk na parametr Font (czcionka).
A teraz stwórz nowy skrypt w panelu Project poprzez wybranie folderu Scripts (skrypty),
a nastpnie kliknicie przycisku Create i wybranie opcji C# Script (skrypt jzyka C#) lub Java-
script (skrypt jzyka JavaScript) z menu rozwijanego. Zmie nazw nowo utworzonego skryptu
na FPSdisplay oraz dwukrotnie kliknij jego ikon, by wczyta go do edytora. Uytkownicy
jzyka C# jak zwykle powinni si upewni , e ich klasa nazywa si równie FPSdisplay.
Jzyk C#:
float frames = 0;
float fps = 0;
Jzyk JavaScript:
private var frames : float = 0;
private var fps : float = 0;
Jzyk C# i JavaScript:
frames++;
fps = Mathf.Round(frames / Time.realtimeSinceStartup);
guiText.text = "Frames Per Second: " + fps;
434
Rozdzia 13. • Testy i dalsze zdobywanie wiedzy
Poniewa chcemy uywa naszego skryptu w dowolnej grze, powinnimy si upewni , e moe
on zosta przecignity i upuszczony na obiekcie nalecym do innego projektu, a nastpnie
poprawnie dziaa . W tym celu musimy umieci w skrypcie polecenie RequireComponent, które
zapewni obecno komponentu GUI Text. Korzystalimy z niego ju wczeniej, wic prawdo-
podobnie pamitasz, jak go uy . Jeli nie, poniej prezentujemy odpowiedni instrukcj:
Jzyk C#:
Na pocztku skryptu, po wierszu using System.Collections;, umie instrukcj:
[RequireComponent (typeof (GUIText))]
Jzyk JavaScript:
Po zamykajcym nawiasie klamrowym funkcji Update() umie poniszy wiersz kodu:
@script RequireComponent(GUIText)
Przejd do opcji menu gównego File/Save (plik/zapisz) w edytorze skryptów, a nastpnie wró
do rodowiska Unity. Upewnij si, e w panelu Hierarchy zosta wybrany obiekt FPS display.
Wybierz opcj menu gównego Component/Scripts/FPSdisplay (komponent/skrypty/FPSdisplay)
lub po prostu przecignij skrypt z panelu Project na obiekt w panelu Hierarchy. A teraz przete-
stuj swoj scen. Powiniene zobaczy obiekt GUI Text, który wywietla szybko klatek gry
w górnym obszarze okna.
Twoja gra bdzie miaa inn wydajno poza edytorem Unity. Dlatego te szybko klatek
powinna by brana pod uwag jedynie w kompilacji, która jest samodzieln aplikacj lub
dziaa w przegldarce internetowej. Popro swoich testerów, aby zanotowali najnisze i naj-
wysze wartoci prdkoci klatek, dziki czemu uzyskasz okrelone zakresy danych. Jeli w grze
wystpuj szczególnie wymagajce fragmenty, na przykad zoona animacja lub system cz-
stek, naleaoby równie dla nich sprawdzi prdkoci klatek.
Poniewa gra dziaa z inn prdkoci klatek poza edytorem Unity, wywietlane wartoci bd
si róniy od tych, które s prezentowane w nakadce Stats dla widoku Game:
435
Projektowanie gier w rodowisku Unity 3.x
Optymalizacja wydajnoci
Usprawnianie wydajnoci Twojej gry w wyniku przeprowadzonych testów jest samo w sobie
oddzielnym obszarem wiedzy. Jednake aby poprawi jako przyszych projektów, powiniene
zna podstawowe metody optymalizacyjne:
436
Rozdzia 13. • Testy i dalsze zdobywanie wiedzy
Biorc powysze pod uwag, zalecamy, aby studiowa oficjaln dokumentacj produktu, gdy
tylko masz czas i moliwo . Nawet jeli masz problem z rozwizaniem okrelonego problemu
projektowego, pomoe Ci to zaj umys czym zupenie innym. Zapoznaj si z zagadnieniem
niezwizanym z Twoj aktualn prac, a nastpnie wró do niej z odwieonym umysem.
437
Projektowanie gier w rodowisku Unity 3.x
Na przykad jeli zastanawiasz si nad implementacj sztucznej inteligencji wroga czy cho by
chcesz stworzy algorytm cieki poszukiwania, warto rozejrze si za istniejcymi rozwiza-
niami, zamiast pisa wasny kod od samego pocztku.
Dla rodowiska Unity istnieje wiele wtyczek i gotowych do uycia zasobów, które mog rozwi-
za praktycznie kady problem. Dostp do nich jest moliwy poprzez opcj menu gównego
Window/Asset Store (okno/magazyn zasobów) lub róne strony internetowe.
Zalecamy, aby odwiedzi ponisze portale, zawierajce treci, które mog by przydatne pod-
czas projektowania gier komputerowych:
Pamitaj, aby przed sformuowaniem pytania zawsze przeszuka powysze strony, bo by moe
kto ju je kiedy zada. Jest due prawdopodobiestwo, e tak wanie bdzie. Jeli nie, pami-
taj, aby w swoim pytaniu zawrze w miar moliwoci ponisze punkty:
438
Rozdzia 13. • Testy i dalsze zdobywanie wiedzy
Q Co chcesz osign ?
Q Jaki jest Twój pomys na rozwizanie?
Q Co do tej pory zrobie?
Dziki przekazaniu jak najwikszej iloci informacji, nawet takiej, która wydaje Ci si niezwi-
zana z tematem, zwikszasz prawdopodobiestwo uzyskania waciwej odpowiedzi i zreali-
zowania zadania projektowego. Podczas tworzenia pyta o skrypty pamitaj o wykorzystaniu
odpowiedniej strony, pozwalajcej na wklejanie tekstu, na przykad http://www.pastebin.com,
poniewa pozwoli to na zaprezentowanie Twojego kodu bez potrzeby zajmowania duej iloci
miejsca na stronie forum.
Wielk zalet spoecznoci Unity jest to, e pozwala na uczenie si dziki wykorzystaniu przy-
kadów. Niezalena strona typu Wiki (www.unifycommunity.com/wiki) zawiera wiele rónych
przykadów, poczynajc od skryptów, a koczc na wtyczkach i podrcznikach. Znajdziesz
tam darmowe fragmenty kodów, które pozwalaj na rozwizanie przykadowych zagadnie
skryptowych, a nawet informacje o sposobie ich implementacji razem z gotowymi projektami
do pobrania.
Podsumowanie
W tym rozdziale przedstawilimy propozycje dalszego rozwoju po ukoczeniu czytania niniejszej
ksiki, a take zaproponowalimy, jak uzyska informacje od uytkowników testowych w celu
ulepszenia Twojej gry.
Pamitaj, e zdobywanie wiedzy nie koczy si na tej ksice. Moesz odwiedzi jej stron
(http://www.unitybook.net) i zada pytanie, a take sprawdzi , czy pojawiy si jakie aktuali-
zacje systemu Unity, których dziaanie jest odmienne od zaprezentowanego w tej publikacji.
439
Projektowanie gier w rodowisku Unity 3.x
440
A
Sowniczek
442
Sowniczek
443
Projektowanie gier w rodowisku Unity 3.x
444
Sowniczek
Odtwarzacz sieciowy — wtyczka stworzona dla rodowiska Unity, która pozwala na urucha-
mianie gier w przegldarce internetowej.
Odwzorowywacz wiata — narzdzie w rodowisku Unity, które realizuje operacj wypala-
nia wiata w pliku tekstury, aby poprawi wydajno i uzyska lepsze wraenia wizualne.
Odwzorowywanie wiata — zapisywanie wiata w scenie w pliku tekstury w celu optymali-
zacji wydajnoci.
OnTriggerEnter — funkcja uywana do wykrywania kolizji midzy wyzwalaczami i innymi
zderzaczami.
Osadzanie kodu — umieszczanie kodu, takiego jak HTML, wewntrz innej strony. Taka czyn-
no jest niezbdna na przykad podczas umieszczania treci wideo z portalu YouTube na
innej stronie internetowej.
Pakiet — sposób przechowywania treci projektu Unity i udostpniania ich innym osobom.
Pakietowanie — czynno czenia ze sob wielu zada obliczeniowych.
Particle Animator — komponent w rodowisku Unity, który decyduje, jak maj si zachowy-
wa czstki w trakcie swojego ycia.
Particle Emitter — komponent w rodowisku Unity, który zarzdza procesem emisji czstek.
Particle Renderer — komponent w rodowisku Unity, który okrela wizualny wygld czstek.
Perspektywa — trójwymiarowy widok sceny gry, w którym obiekty staj si coraz mniejsze
wraz ze zwikszaniem si ich odlegoci od kamery.
Ptla — sposób pozwalajcy na powtarzanie wywoywania tych samych instrukcji w skrypcie.
Równie termin oznaczajcy powtórzenie animacji.
PhysX — fizyczny silnik firmy nVidia, który zosta zastosowany w rodowisku Unity.
Piksel — pojedynczy punkt; z pikseli jest tworzony komputerowy obraz na ekranie.
Paszczyzna — paski, kwadratowy, prosty ksztat, który moe zosta utworzony w rodowisku
Unity.
Paszczyzny odcinania — dwie paszczyzny widoku, midzy którymi nastpuje rendering wiata
trójwymiarowego za pomoc kamery.
Pocztek — pooenie zerowe w wiecie trójwymiarowym, reprezentowane przez warto
(0, 0, 0) we wspórzdnych kartezjaskich.
Podmienianie tekstur — zamienianie jednej tekstury na inn w celu stworzenia efektu anima-
cji tekstur.
Pooenie zerowe — miejsce zerowe, zwane inaczej pocztkowym pooeniem w wiecie trój-
wymiarowym.
Potomek — obiekt nalecy w hierarchii do obiektu nadrzdnego.
Powielanie — patrz konkretyzacja.
Poziom szczegóowoci — liczba szczegóów renderowanych na ekranie, która moe si zmniej-
sza wraz ze wzrostem odlegoci od kamery.
445
Projektowanie gier w rodowisku Unity 3.x
446
Sowniczek
Silnik gry — oprogramowanie (takie jak na przykad Unity), które obsuguje rendering, odtwa-
rzanie dwików i inne doczone biblioteki kodów, zarzdzajce na przykad parametrami
fizycznymi; pozwala na tworzenie gier.
Sia — sposób wprawiania w ruch bryy sztywnej w rodowisku trójwymiarowym. Równie
oddziaywanie fizyczne, które nas otacza i wie, a take utrzymuje wszechwiat w caoci.
Skalowanie zderzacza — czynno zmiany ksztatu zderzacza w celu zmodyfikowania obszaru
wykrywania kolizji.
Skrypt edytora — skrypt definiujcy zachowanie edytora.
Skrypt Unity — sformuowanie uywane czsto podczas prezentacji kodu JavaScript w ro-
dowisku Unity.
Skrypty — programy napisane w jzykach C#, JavaScript lub Boo. Skrypty w rodowisku Unity
s uywane do definiowania zachowania obiektów lub modyfikowania sposobu dziaania
samego edytora Unity.
Sposób dziaania — sposób, w jaki obiekt reaguje na okrelone sytuacje. Jest on definiowany za
pomoc skryptu.
Sprajty — pliki graficzne (tekstury), uywane w grze jako elementy dwuwymiarowe.
Strafing — przemieszczanie si w bok podczas grania w gr, zazwyczaj w trakcie strzelania
z broni.
Strumieniowanie — pobieranie danych z internetu. W grze to czynno wczytywania dodat-
kowych treci w trakcie rozgrywki.
System czstek — zestaw komponentów uywanych do tworzenia efektów wizualnych, takich
jak dym, kurz, wybuchy itd. (patrz rozdzia 8.).
Szybkie prototypowanie — szybka implementacja mechaniki gry w celu przeprowadzenia
testów, bez definiowania elementów wizualnych o docelowej jakoci.
rodowisko — miejsce rozgrywki. Moe to by na przykad teren, wntrze budynku lub prze-
strze kosmiczna.
wiato — wiato w rodowisku Unity moe zosta dodane do obiektu w postaci komponentu.
Tablica — sposób przechowywania w jednej zmiennej wielu elementów podobnego typu.
Tagowanie — przypisywanie pojedynczego sowa do obiektu w polu znajdujcym si w górnej
czci panelu Inspector. Tagowanie suy do identyfikacji obiektu. Jest take czsto uywane
podczas doczania obiektu do grupy w rodowisku Unity.
Tangens — trójwymiarowy wektor, który jest równolegy do powierzchni modelu.
Tekstura — plik graficzny, renderowany w postaci fragmentu siatki trójwymiarowej lub dwu-
wymiarowego elementu GUI.
Teren — geometria rodowiska; moe zosta utworzona w systemie Unity, zwykle uywana do
modelowania gruntu i wzgórz, po których moe chodzi posta gracza.
Tumienie — ogólny termin uywany do opisania procesu zmniejszania si wartoci.
447
Projektowanie gier w rodowisku Unity 3.x
448
Sowniczek
449
Projektowanie gier w rodowisku Unity 3.x
450
Sowniczek
451