informatyka projektowanie gier w srodowisku unity 3 x will goldstone ebook

background image
background image

Tytuł oryginału: Unity 3.x Game Development Essentials

Tłumaczenie: Jacek Janusz

ISBN: 978-83-246-3984-7

Copyright © Packt Publishing 2011.
First published in the English language under the title „Unity 3.x Game Development Essentials”.

Polish edition copyright © 2012 by Helion S.A.
All rights reserved.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie
ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji
zawartych w książce.

Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/prgun3
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

Kup książkę

Poleć książkę

Oceń książkę

Księgarnia internetowa

Lubię to! » Nasza społeczność

background image

Spis tre"ci

Przedmowa

9

O autorze

11

O recenzentach

12

Wst#p

15

Rozdzia$ 1. Odkryj trzeci wymiar

21

Zapoznanie si# z podstawami grafiki 3D

21

Wspó rz!dne

22

Przestrze" modelu i przestrze" %wiata

22

Wektory

23

Kamery

24

Wielok&ty, kraw!dzie, wierzcho ki i siatki

25

Materia y, tekstury i procedury cieniowania

28

Fizyka bry$y sztywnej

29

Wykrywanie kolizji

29

Podstawowe poj#cia zwi%zane ze "rodowiskiem Unity

30

Metoda Unity — przyk ad

31

Zasoby

32

Sceny

32

Obiekty gry

32

Komponenty

33

Skrypty

33

Prefabrykaty

34

Interfejs

35

Widoki Scene i Hierarchy

36

Panel Inspector

38

Kup ksi

ąĪkĊ

Pole

ü ksiąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

4

Okno Project

39

Widok Game

40

Podsumowanie

40

Rozdzia$ 2. Podstawy tworzenia prototypów i skryptów

43

Twój pierwszy projekt w "rodowisku Unity

44

Podstawowe "rodowisko prototypowe

45

Definiowanie sceny

46

Dodawanie prostego o%wietlenia

47

Kolejna ceg a w %cianie

48

Zbuduj i zniszcz!

52

Wprowadzenie do tworzenia skryptów

53

Nowy skrypt definiuj&cy zachowanie lub klas!

53

Jak wygl&da od %rodka dzia anie skryptu w j!zyku C#?

54

Jak wygl&da od %rodka dzia anie skryptu w j!zyku JavaScript?

56

Atakowanie %ciany

57

Deklarowanie zmiennych publicznych

58

Zrozumienie zasady dzia$ania polecenia Translate

62

Implementacja funkcji Translate

63

Testujemy bie&%c% wersj# gry

64

Tworzenie pocisku

65

Przechowywanie obiektów jako prefabrykatów

67

Wystrzelenie pocisku

68

U&ycie funkcji Instantiate() do konkretyzowania obiektów

68

Przy o*enie wektora si y do bry y sztywnej

69

Podsumowanie

71

Rozdzia$ 3. Tworzenie "rodowiska

73

Projektowanie gry

73

U&ycie edytora terenu

75

Opcje menu terenu

76

Narz!dzie edycji terenu

78

Tworzenie wyspy — s o"ce, morze i piasek

83

Podsumowanie

101

Rozdzia$ 4. Postacie w grze i dalsze wykorzystanie skryptów

103

U&ycie panelu Inspector

104

Znaczniki

105

Warstwy

106

Prefabrykaty i panel Inspector

106

Anatomia postaci

107

Dekonstrukcja obiektu First Person Controller

107

Relacje mi!dzy obiektami nadrz!dnymi i podrz!dnymi

109

Obiekt First Person Controller

109

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Spis tre"ci

5

Dalsze wykorzystanie skryptów

119

Polecenia

119

Zmienne

120

Kompletny przyk$ad

123

Funkcje

123

Tworzenie w asnych funkcji

125

Deklarowanie w asnej funkcji

127

Polecenie if else

129

Warunki wielokrotne

131

Komunikacja mi#dzyskryptowa oraz sk$adnia z kropk%

133

Dost!p do innych obiektów

133

Find() i FindWithTag()

133

SendMessage()

134

GetComponent

135

Komentarze

138

Skrypt wykonuj%cy operacj# poruszania postaci%

139

Analiza skryptu

139

Deklaracje zmiennych

140

Podsumowanie

145

Rozdzia$ 5. Interakcje

147

Zewn#trzne aplikacje modeluj%ce

147

Ogólne ustawienia modeli

148

Meshes

148

Normals and Tangents

149

Materials

150

Animations

150

Animation Compression

151

Definiowanie modelu placówki

151

Dodawanie placówki

152

Ustalenie po o*enia

153

Obrót

153

Dodanie zderzaczy

154

Dodanie komponentu Rigidbody

156

Dodanie d.wi!ku

156

Wy &czenie automatycznej animacji

156

Kolizje i wyzwalacze

157

Rzucanie promieni

160

Zgubienie klatki

161

Wykrywanie zderzenia z przewidywaniem

162

Otwieranie drzwi placówki

163

Metoda 1. Wykrywanie kolizji

164

Metoda 2. Rzucanie promieni

179

Metoda 3. Wykrywanie kolizji wyzwalaj&cej

185

Podsumowanie

189

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

6

Rozdzia$ 6. Kolekcja, inwentarz i HUD

191

Tworzenie prefabrykatu ogniwa energetycznego

194

Pobieranie, importowanie i umieszczanie

194

Identyfikacja ogniwa energetycznego

195

Skalowanie i obrót zderzacza

195

Dodawanie komponentu Rigidbody

196

Tworzenie skryptu dla ogniwa energetycznego

197

Dodawanie opcji wyzwalaj&cego wykrywania kolizji

198

Zapisywanie obiektu w postaci prefabrykatu

199

Rozrzucanie ogniw energetycznych

200

Inwentarz gracza

200

Zapami!tywanie poziomu zasilania

201

Dodawanie funkcji CellPickup()

202

Ograniczenie dost#pu do placówki

204

Ograniczenie dost!pu do drzwi za pomoc& licznika ogniw

204

Wy"wietlacz HUD dla ogniwa energetycznego

205

Importowanie ustawie" tekstur GUI

206

Tworzenie obiektu GUITexture

206

Umieszczanie tekstury PowerGUI

208

Skrypt do podmiany tekstury

208

Tablice

209

Poinformowanie o otwarciu drzwi

217

Wskazówki dla gracza

221

Pisanie na ekranie za pomoc& komponentu GUIText

221

Podsumowanie

227

Rozdzia$ 7. Konkretyzowanie obiektów i bry$y sztywne

229

Wykorzystywanie konkretyzacji

230

Bry$y sztywne

231

Si y

232

Komponent Rigidbody

232

Tworzenie minigry

233

Tworzenie prefabrykatu orzecha kokosowego

234

Tworzenie obiektu Launcher

236

Skrypt obs uguj&cy rzucanie orzechami kokosowymi

238

Ko"cowe procedury sprawdzaj&ce

247

Ograniczenia konkretyzacji oraz usuwanie obiektów

248

Dodawanie pomieszczenia przeznaczonego do rzucania kokosami

251

Wygrywanie gry

266

Ko"cowe usprawnienia

271

Podsumowanie

274

Rozdzia$ 8. Systemy cz%stek

277

Co to jest system cz%stek?

277

Particle Emitter

278

Particle Animator

278

Particle Renderer

279

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Spis tre"ci

7

Definiowanie zadania

280

U*yte zasoby

280

Tworzenie sterty ga !zi

281

Tworzenie systemów cz&stek dla ogniska

283

Rozpalanie ognia

292

Testowanie i weryfikacja dzia$ania

302

A wi!c jaki mamy problem?

303

Podsumowanie

305

Rozdzia$ 9. Projektowanie menu

307

Interfejsy i menu

308

Tworzenie sceny

310

Tworzenie menu za pomoc% obiektów GUITexture i zdarze+ myszy

315

Dodawanie przycisku uruchamiania gry

315

Skrypt obs uguj&cy przycisk klasy GUITexture

315

Wczytywanie scen

318

Przypisywanie zmiennych publicznych

319

Testowanie przycisku

320

Dodawanie przycisku wy%wietlaj&cego instrukcje

321

Dodawanie przycisku zako"czenia gry

321

Testowanie skryptów przy u*yciu polece" debugowania

324

Tworzenie menu za pomoc% klasy GUI "rodowiska Unity oraz kompozycji graficznych

326

Wy &czanie obiektów gry

326

Tworzenie menu

326

Podsumowanie

349

Rozdzia$ 10. Podstawy animacji

351

Sekwencja animacji po wygraniu gry

351

Metoda tworzenia sekwencji animacji

352

Uruchamianie sekwencji wygrania gry

354

Tworzenie komunikatów informuj&cych o wygraniu gry

354

Animowanie przy u*yciu interpolacji liniowej

356

Tworzenie obiektu obs uguj&cego sekwencj! zwyci!stwa

358

Tworzenie skryptu wygaszania ekranu i u*ycie panelu Animation

360

Wczytywanie sekwencji wygrania gry

372

Umieszczanie obiektów GUITexture w warstwach

373

Wyzwanie — zmiana koloru ekranu w scenie Island

374

Podsumowanie

374

Rozdzia$ 11. Poprawa wydajno"ci i ko+cowe modyfikacje

375

Ulepszenie terenu i zdefiniowanie po$o&enia pocz%tkowego gracza

376

Ulepszanie terenu

376

Modyfikacja wzgórz i dolin oraz zastosowanie techniki przenikania tekstur

377

Zdefiniowanie w a%ciwej %cie*ki

378

Pocz%tkowa lokalizacja postaci gracza

379

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

8

Optymalizacja wydajno"ci

380

P aszczyzny odcinaj&ce i mg a

380

Odwzorowywanie %wiat a

381

Ko+cowe upi#kszenia

391

Wulkan!

391

Trajektorie lotu orzechów kokosowych

397

Podsumowanie

400

Rozdzia$ 12. Budowanie i udost#pnianie

401

Opcje budowania

402

Web Player

402

Aplikacje samodzielne dla komputerów PC i Mac

404

Widget aplikacji Dashboard dla OS X

404

Ustawienia budowania

405

Ustawienia gracza

406

Ustawienia Cross-Platform Settings

406

Ustawienia Per-Platform Settings

407

Ustawienia jako"ci

411

Ustawienia wej"- dla gracza

413

Budowanie gry

414

Przystosowanie do wersji sieciowej

414

Pierwsza kompilacja

421

Budowanie dla sieci

423

Udost#pnianie swoich prac

428

Udost!pnianie prac na portalu Kongregate.com

428

Podsumowanie

429

Rozdzia$ 13. Testy i dalsze zdobywanie wiedzy

431

Nauka poprzez dzia$anie

432

Testowanie i finalizowanie

432

Wykorzystanie u*ytkowników do testowania

433

Sposoby zdobywania wiedzy

437

Studiuj ró*ne zagadnienia

437

Nie odkrywaj ko a na nowo

438

Je%li czego% nie wiesz, pytaj!

438

Podsumowanie

439

S$owniczek

441

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

2

Podstawy tworzenia

prototypów i skryptów

Jedn! z najlepszych metod zdobywania wiedzy i do#wiadczenia podczas stawiania pierwszych
kroków w dziedzinie projektowania gier jest tworzenie prototypów w%asnych pomys%ów. &ro-
dowisko Unity przoduje w tym zagadnieniu, udost'pniaj!c wizualny edytor sceny oraz publiczne
zmienne sk%adowe, które widniej! na panelu Inspector (inspektor) w postaci odpowiednich
ustawie*. Zapoznanie si' z dzia%aniem edytora Unity rozpoczniemy od wygenerowania pro-
totypu prostej mechaniki gry, wykorzystuj!c w tym celu kszta%ty podstawowe oraz tworzenie
elementarnych skryptów.

W tym rozdziale zostan! przedstawione nast'puj!ce zagadnienia:

tworzenie nowego projektu w #rodowisku Unity,

importowanie pakietów z zasobami,

praca z obiektami gry w widokach Scene (scena) i Hierarchy (hierarchia),

dodawanie materia%ów,

tworzenie skryptów w j'zykach C Sharp (C#) oraz JavaScript,

zmienne, funkcje i polecenia,

u1ycie polecenia

Translate()

w celu przemieszczenia obiektów,

u1ycie prefabrykatów do przechowywania obiektów,

u1ycie polecenia

Instantiate()

w celu konkretyzacji obiektów.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

44

Twój pierwszy projekt w "rodowisku Unity

&rodowisko Unity jest oferowane w dwóch wersjach: standardowej (darmowej) oraz p%atnej
(licencjonowanej) dla profesjonalnych projektantów. W niniejszej ksi!1ce b'dziemy omawia2
opcje, do których maj! dost'p u1ytkownicy wersji darmowej.

Je#li uruchomisz #rodowisko Unity po raz pierwszy, zostanie do niego wczytany przyk%adowy
projekt. Zapoznawanie si' z najlepszymi wzorami, stosowanymi w najwy1szej jako#ci projektach,
jest bardzo przydatne. Jednak1e w przypadku pocz!tkuj!cych u1ytkowników przegl!danie
profesjonalnie utworzonych zasobów i skryptów mog%oby by2 deprymuj!ce, dlatego te1 pomi-
niemy projekt przyk%adowy i rozpoczniemy prace od samego pocz!tku!

W menu g%ównym #rodowiska Unity wybierz opcj' File/New Project (plik/nowy projekt), co
spowoduje wy#wietlenie okna dialogowego Project Wizard (kreator projektu — na poni1szym
rysunku przedstawiono wersj' dla komputera typu Mac). Kliknij zak%adk' Create new Project
(stwórz nowy projekt).

Uwaga

Je li chcia"by , by za ka$dym razem po uruchomieniu rodowiska Unity okno dialogowe

Project Wizard

by"o automatycznie wy wietlane, powiniene wywo"ywa& aplikacj' z naci ni'tym klawiszem

Alt

(Mac i PC).

Taki sposób dzia"ania mo$na równie$ skonfigurowa& w opcji menu

File/Preferences

(plik/ustawienia).

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

45

Kliknij przycisk Set

1

(umie#2), aby zdefiniowa2 lokalizacj' folderu dla nowego projektu Unity.

W niniejszej ksi!1ce zosta% on nazwany UGDE i umieszczony na pulpicie, by mie2 do niego
%atwy dost'p.

Kreator projektu pozwala tak1e na zaimportowanie wielu pakietów z zasobami, które s! udo-
st'pnione za darmo przez firm' Unity Technologies. Zawieraj! one z%o1one skrypty, gotowe
obiekty i inne elementy graficzne, które s! przydatne podczas rozpoczynania pracy z ró1nymi
rodzajami projektów. Te pakiety mo1esz tak1e zaimportowa2 w ka1dej chwili, wybieraj!c opcj'
menu Assets/Import Package (zasoby/import pakietu), a nast'pnie odpowiedni! pozycj' z dost'p-
nej listy. Wybieraj!c opcj' Assets/Import Package/Custom Package (zasoby/import pakietu/pakiet
u1ytkownika), móg%by# równie1 zaimportowa2 pakiet znajduj!cy si' w dowolnej lokalizacji na
Twoim dysku twardym. Taka funkcjonalno#2 pozwala wspó%dzieli2 zasoby z innymi u1ytkowni-
kami oraz umo1liwia instalacj' pakietów, które uzyska%e# poprzez wybranie opcji Window/Asset
Store
(okno/sklep z zasobami).

Z listy pakietów, które mo1na zaimportowa2, wybierz nast'puj!ce (jak zaprezentowano na
powy1szym rysunku):

Character Controller (kontroler postaci),

Skyboxes (skybox — symulacja nieba i horyzontu),

Terrain Assets (zasoby terenu),

Water (Basic) (woda — wersja podstawowa).

Po zaznaczeniu pakietów kliknij przycisk Create Project (stwórz projekt), znajduj!cy si' w dolnej
cz'#ci okna dialogowego. Spowoduje to rozpocz'cie procesu tworzenia nowego projektu,
podczas którego b'dziesz móg% obserwowa2 paski post'pu, reprezentuj!ce import poszczegól-
nych pakietów.

Podstawowe "rodowisko prototypowe

Aby stworzy2 proste #rodowisko, w którym zostanie wygenerowany prototyp okre#lonej mecha-
niki gry, dzia%ania powinni#my rozpocz!2 od zdefiniowania podstawowej listy obiektów — zosta-
nie im przypisana funkcjonalno#2 pozwalaj!ca graczowi celowa2 i strzela2 do #ciany sk%adaj!cej
si' z prostych sze#cianów.

Po zako*czeniu pracy #rodowisko prototypowe b'dzie si' sk%ada2 z powierzchni zbudowanej
z prostych sze#cianów, kamery pozwalaj!cej na obserwowanie #wiata gry w trzech wymiarach
oraz 8ród%a #wiat%a punktowego, umo1liwiaj!cego pod#wietlenie obszaru, w którym b'dzie si'
toczy2 akcja gry. Wygenerowany #wiat powinien wygl!da2 tak jak na poni1szym rysunku:

1

W wersji dla PC przycisk nazywa si' Browse (przegl!daj) — przyp. t0um.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

46

Definiowanie sceny

Poniewa1 ka1da nowa scena zawiera domy#lnie obiekt

Main Camera

(g%ówna kamera), dzia%ania

rozpoczniemy od utworzenia powierzchni dla #rodowiska prototypowego.

W panelu Hierarchy (hierarchia) kliknij przycisk Create (stwórz), a nast'pnie z rozwijanego menu
wybierz opcj' Cube (sze#cian). Elementy znajduj!ce si' na li#cie s! tak1e dost'pne w opcji
GameObject/Create Other (obiekt gry/stwórz inny) menu g%ównego aplikacji. Obecnie mo1esz
zauwa1y2 obiekt o nazwie Cube, znajduj!cy si' w panelu Hierarchy. Wybierz go, a pó8niej
naci#nij klawisz F2 (PC) lub Return (Mac) albo dwukrotnie z opó8nieniem kliknij nazw' obiektu,
1eby j! zmieni2. Wprowad8 s%owo Floor (powierzchnia), a nast'pnie naci#nij klawisz Enter (PC)
lub Return (Mac), by zatwierdzi2 wprowadzenie zmian.

Ze wzgl'du na konieczno#2 zapewnienia zgodno#ci rozpoczniemy tworzenie obiektów w punkcie
zerowym #wiata, czyli centrum trójwymiarowego #rodowiska, w którym pracujemy. Aby upewni2
si', 1e sze#cian b'd!cy powierzchni! zosta% umieszczony dok%adnie w tym miejscu, sprawd8,
czy w dalszym ci!gu jest wybrany w panelu Hierarchy. Nast'pnie zaznacz komponent Transform
na panelu Inspector (inspektor) i zwró2 uwag' na to, czy wszystkie warto#ci wspó%rz'dnych X,
Y i Z s! równe zeru. Je#li tak nie jest, wprowad8 zera w odpowiednich polach edycji lub kliknij
ikon' w kszta%cie kó%ka z'batego, a potem wybierz z menu podr'cznego opcj' Reset Position
(wyzeruj po%o1enie).

W dalszej kolejno#ci powinni#my przekszta%ci2 sze#cian na powierzchni', odpowiednio powi'k-
szaj!c go w osi X i Y. W komponencie Transform przejd8 do grupy Scale (skala), a nast'pnie
w polach edycji X i Z wprowad8 warto#ci

100

, pozostawiaj!c pole Y równe

1

.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

47

Dodawanie prostego o$wietlenia

Postaramy si' teraz o#wietli2 obszar powierzchni prototypowej poprzez dodanie 8ród%a #wiat%a
punktowego. Kliknij przycisk Create w panelu Hierarchy (lub wybierz opcj' menu g%ównego
GameObject/Create Other), a nast'pnie wybierz pozycj' Point Light (#wiat%o punktowe).
Umie#2 8ród%o #wiat%a w po%o1eniu

(0, 20, 0)

, u1ywaj!c w tym celu odpowiednich warto#ci Posi-

tion (pozycja) zawartych w komponencie Transform, dzi'ki czemu b'dzie si' ono znajdowa2 20
jednostek nad powierzchni!.

Jak zapewne zauwa1y%e#, oznacza to, 1e #wiat%o nie dociera do ca%ej powierzchni. Przeci!gnij
wi'c 1ó%ty punkt, który znajduje si' na przeci'ciu linii tworz!cych zarys #wiat%a punktowego
w widoku Scene, by uzyska2 warto#2 parametru Range (zasi'g) równ!

40

. Parametr ten jest

elementem komponentu Light (#wiat%o) dost'pnego w widoku Inspector. Wykonane przez Cie-
bie dzia%anie spowoduje, 1e na obiekcie tworz!cym powierzchni' pojawi si' lekka po#wiata.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

48

Wskazówka

Pami'taj, $e wi'kszo & komponentów jest powi-zana z odpowiednimi narz'dziami, s"u$-cymi do wizualnej
edycji i znajduj-cymi si' w widoku

Scene

. Modyfikacja warto ci takich jak

Range

w komponencie

Light

,

dost'pnym w panelu

Inspector

, spowoduje uaktualnienie wygl-du obiektu w widoku

Scene

w trakcie

wprowadzania zmian. Zostan- one zatwierdzone po naci ni'ciu klawisza

Return

(

Enter

).

Kolejna ceg&a w $cianie

Utworzymy #cian' z%o1on! z sze#cianów, która b'dzie celem dla pocisków. Najpierw utworzymy
pierwsz! ceg%', uzupe%nion! w razie konieczno#ci o komponenty, a nast'pnie powielimy j! w tylu
egzemplarzach, a1 b'dziemy dysponowali gotow! #cian!.

Tworzenie wzorcowej ceg&y

Aby uzyska2 szablon, pozwalaj!cy na wygenerowanie wszystkich cegie%, musimy utworzy2 wzor-
cowy obiekt, który b'dzie mo1na pó8niej klonowa2. Procedura jest nast'puj!ca:

1. Kliknij przycisk Create, znajduj!cy si' w górnym obszarze panelu Hierarchy, a nast'pnie

wybierz opcj' Cube. U1ywaj!c warto#ci Position w komponencie Transform, umie#2
obiekt w po%o1eniu

(0, 1, 0)

. Upewnij si', czy wci!1 jest wybrany w panelu

Hierarchy, a nast'pnie przybli1 jego widok przez przemieszczenie kursora myszy
nad okno Scene i naci#ni'cie klawisza F.

2. Uzupe%nij obiekt Cube o parametry fizyczne, wybieraj!c opcj' menu g%ównego

Component/Physics/Rigidbody (komponent/parametry fizyczne/bry%a sztywna).
Oznacza to, 1e Twój obiekt b'dzie od tej pory bry%! sztywn!, charakteryzuj!c! si'
takimi parametrami, jak masa czy ci'1ar. Mo1e tak1e oddzia%ywa2 na inne obiekty
dzi'ki wykorzystaniu silnika fizycznego w celu uzyskania realistycznych wyników
w #wiecie 3D.

3. Wreszcie stwórzmy kolor dla obiektu poprzez wygenerowanie odpowiedniego

materia%u. Materia%y s%u1! do uzupe%niania obiektów trójwymiarowych o kolor
i tekstur'. Aby utworzy2 nowy materia%, kliknij przycisk Create, znajduj!cy si'
w panelu Project, a nast'pnie z menu rozwijanego wybierz opcj' Material (materia%).
Naci#nij klawisz F2 (PC) lub Return (Mac), aby zmieni2 jego domy#ln! nazw' New
Material
(nowy materia%) na Red (czerwony).

4. Gdy materia% zostanie wybrany, jego w%a#ciwo#ci s! wy#wietlane w panelu Inspector.

Kliknij pole koloru (1), znajduj!ce si' po prawej stronie etykiety Main Color (g%ówny
kolor), aby otworzy2 okno dialogowe Color Picker (wybór koloru) (2). B'dzie ono ró1ni2
si' wygl!dem w zale1no#ci od tego, czy u1ywasz komputera typu Mac lub PC.
Po prostu wybierz jaki# odcie* koloru czerwonego, a nast'pnie zamknij okno. Pole
koloru Main Color powinno zosta2 odpowiednio zaktualizowane.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

49

5. Aby u1y2 stworzonego materia%u, przeci!gnij go z panelu Project i upu#2 na sze#cian

znajduj!cy si' w widoku Scene lub nazw' obiektu w oknie Hierarchy. Materia%
zostanie u1yty w komponencie Mesh Renderer (renderer siatki) dla danego obiektu
oraz natychmiast zaprezentowany innym jego komponentom w panelu Inspector.
Najwa1niejsze jest jednak to, 1e Twój sze#cian powinien by2 teraz czerwony!
Modyfikacja parametrów materia%u przy u1yciu opcji Preview (podgl!d), zastosowanej
do dowolnego obiektu, spowoduje wprowadzenie rzeczywistych zmian tylko
w oryginalnym elemencie, poniewa1 poprzez t' operacj' odwo%ujemy si' do w%a#ciwego
zasobu, a nie do nowo utworzonej instancji.

6. Poniewa1 sze#cian ma ju1 kolor i w%a#ciwo#ci fizyczne, wynikaj!ce z u1ycia komponentu

Rigidbody (bry%a sztywna), mo1e zosta2 sklonowany i utworzy2 #cian' z%o1on! z cegie%.
Zanim jednak tego dokonamy, przyjrzyjmy si' przez chwil' prawom fizycznym
dzia%aj!cym w przestrzeni 3D. Upewnij si', 1e sze#cian zosta% wybrany, a nast'pnie
przypisz parametrowi Y Position (po%o1enie Y) warto#2

15

, za# X Rotation (rotacja X)

warto#2

40

. Obie te w%a#ciwo#ci nale1! do komponentu Transform w widoku Inspector.

Naci#nij przycisk Play (lub skrót klawiszowy Ctrl+P dla PC albo Command+P
dla komputerów Mac), znajduj!cy si' w górnej cz'#ci interfejsu Unity. Powiniene#
zobaczy2 spadaj!cy sze#cian, który pod k!tem uderza o powierzchni' i po wykonaniu
pó%obrotu zatrzymuje si'.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

50

7. Naci#nij przycisk Play ponownie, aby zatrzyma2 symulacj'. Nie naciskaj przycisku

Pause, poniewa1 spowodowa%oby to tylko tymczasowe zatrzymanie animacji, natomiast
pó8niejsze zmiany w scenie nie zosta%yby zapami'tane.

8. Przywró2 poprzednie ustawienia dla sze#cianu: parametrowi Y Position przypisz

warto#2

1

, a X Rotation — warto#2

0

.

Sprawdzi%e#, 1e ceg%a zosta%a poprawnie zdefiniowana i dzia%a zgodnie z oczekiwaniami. Mo1esz
wi'c rozpocz!2 tworzenie rz'du cegie%, z których b'dzie si' sk%ada2 nasza #ciana.

I pstryk! Mamy rz,d

Aby u%atwi2 rozmieszczanie obiektów, #rodowisko Unity pozwala na u1ycie opcji przyci!gania.
Parametry opcji przyci!gania mog! by2 modyfikowane w opcji menu Edit/Snap Settings (edy-
cja/ustawienia opcji przyci!gania).

Aby zastosowa2 opcj' przyci!gania, przytrzymaj naci#ni'ty klawisz Control (PC) lub Command
(Mac) podczas u1ywania narz'dzia Translate (W) w celu rozmieszczenia obiektów w widoku
Scene. By rozpocz!2 budow' #ciany, przy u1yciu skrótu klawiszowego Ctrl+D (PC) lub Com-
mand+D
(Mac) skopiuj obiekt ceg%y, którym ju1 dysponujemy. Nast'pnie przeci!gnij go, chwy-
taj!c za uchwyt czerwonej osi i jednocze#nie trzymaj!c wci#ni'ty klawisz Control (PC) lub
Command (Mac). Dzi'ki temu obiekt b'dzie si' przemieszcza% skokowo po siatce przyci!gania.
Przesuwaj ceg%' w osi X, a1 znajdzie si' w bezpo#rednim s!siedztwie innej, tak jak przedsta-
wiono na poni1szym rysunku:

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

51

Powtarzaj procedur' kopiowania i rozmieszczania przy u1yciu siatki przyci!gania a1 do momentu,
gdy b'dziesz dysponowa2 rz'dem dziesi'ciu cegie%. Aby przyspieszy2 tworzenie konstrukcji,
umie#cimy go w pustym obiekcie nadrz'dnym, który nast'pnie sklonujemy.

Przyci,ganie do wierzcho&ków

Podstawowa procedura przyci-gania, której u$yli my wcze niej, dzia"a"a poprawnie, poniewa$ nasze sze-
ciany charakteryzuj- si' ogóln- skal- o wielko ci 1. Jednak$e podczas skalowania obiektów o bardziej z"o$o-
nych kszta"tach powiniene zastosowa& opcj' przyci-gania do wierzcho"ków. Aby jej u$y&, upewnij si',
$e wybra"e narz'dzie

Translate

, a nast'pnie wci nij i przytrzymaj klawisz

V

. Gdy umie cisz kursor myszy

nad punktem wybranego wierzcho"ka, przeci-gnij ca"y element do wierzcho"ka nale$-cego do innego obiektu.

Grupowanie i duplikacja przy u.yciu pustych obiektów

Stwórz pusty obiekt, wybieraj!c opcj' menu g%ównego GameObject/Create Empty (obiekt
gry/stwórz pusty). Nast'pnie umie#2 go w po%o1eniu

(4.5, 0.5, -1)

przy u1yciu komponentu

Transform z panelu Inspector. Zmie* jego nazw' na CubeHolder.

Zaznacz wszystkie sze#ciany w panelu Hierarchy: wybierz sze#cian znajduj!cy si' najwy1ej,
przytrzymaj klawisz Shift, a nast'pnie wybierz sze#cian najni1szy. W dalszej kolejno#ci prze-
ci!gnij zaznaczony zbiór sze#cianów do pustego obiektu CubeHolder, znajduj!cego si' w panelu
Hierarchy, aby uczyni2 go obiektem nadrz'dnym. Po wykonaniu tej operacji widok Hierarchy
powinien si' przedstawia2 nast'puj!co:

Mo1esz zauwa1y2, 1e obok nazwy obiektu nadrz'dnego pojawi%a si' ikona w postaci strza%ki.
Oznacza to, 1e mo1esz j! klikn!2, co spowoduje rozwini'cie i zwini'cie listy z obiektami pod-
rz'dnymi. Aby zaoszcz'dzi2 miejsce w panelu Hierarchy, kliknij strza%k', by ukry2 wszystkie
obiekty podrz'dne, a nast'pnie ponownie wybierz CubeHolder.

Gdy ca%y rz!d cegie% zosta% utworzony i przyporz!dkowany do obiektu nadrz'dnego, mo1emy go
w prosty sposób zduplikowa2 poprzez przeci!gni'cie z u1yciem opcji przyci!gania w osi
Y. Tak jak poprzednio u1yj skrótu klawiszowego s%u1!cego do klonowania (PC: Ctrl+D, Mac:

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

52

Command+D), a nast'pnie wybierz narz'dzie Translate (W) i zastosuj technik' przeci!gania
z przyci!ganiem (PC: Ctrl, Mac: Command), by przemie#ci2 rz!d cegie% w gór' o jedn! jed-
nostk' za pomoc! zielonego uchwytu osi Y.

Powtarzaj powy1sz! procedur', a1 utworzysz osiem rz'dów cegie% umieszczonych jeden nad
drugim. &ciana powinna wygl!da2 jak na poni1szym rysunku. Zwró2 uwag' na to, 1e zosta%y na
nim zaznaczone wszystkie obiekty CubeHolder znajduj!ce si' w panelu Hierarchy.

Zbuduj i zniszcz!

Gdy zbudowali#my #cian' z cegie%, nadszed% czas na stworzenie prostej mechaniki gry, w któ-
rej gracz mo1e przemieszcza2 kamer' i wystrzeliwa2 pociski w kierunku #ciany, by j! zburzy2.

Definiowanie widoku

Ustaw kamer' w taki sposób, by by%a skierowana na #cian'. W tym celu zaznacz obiekt Main
Camera
, znajduj!cy si' w panelu Hierarchy, a nast'pnie w komponencie Transform zdefiniuj
jego pozycj' równ!

(4, 3, -15)

. Upewnij si' tak1e, 1e wszystkie parametry zwi!zane z obrotem

s! równe zeru.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

53

Wprowadzenie do tworzenia skryptów

Aby rozpocz!2 nauk' programowania, przyjrzymy si' prostemu przyk%adowi, definiuj!cemu t'
sam! funkcjonalno#2 w j'zykach C Sharp (C#) oraz JavaScript, podstawowych dla projektantów
wykorzystuj!cych #rodowisko Unity. Mo1na równie1 tworzy2 skrypty oparte na j'zyku Boo, lecz
s! one rzadko u1ywane, pomijaj!c osoby, które go dobrze znaj!.

Uwaga

Kolejne &wiczenia mo$esz wykonywa&, u$ywaj-c zarówno j'zyka JavaScript, jak i C#. Jednak$e w dalszej
cz' ci ksi-$ki powiniene zdecydowa& si' na ten j'zyk, który bardziej Ci odpowiada.

Rozpocznij od klikni'cia przycisku Create (stwórz), znajduj!cego si' w panelu Project (projekt),
a nast'pnie wybrania opcji Javascript lub C# Script.

Twój skrypt zostanie umieszczony w panelu Project pod nazw! NewBehaviourScript, obok któ-
rej widnieje niewielka ikona w kszta%cie strony z napisem JS lub C#. W trakcie dokonywania
wyboru skryptu masz dost'p do podgl!du jego kodu w oknie Inspector (inspektor). Znajduje si'
tam tak1e przycisk Open (otwórz), którego klikni'cie powoduje otwarcie skryptu w domy#lnym
edytorze o nazwie Monodevelop. Mo1esz go tak1e otworzy2, klikaj!c dwukrotnie jego ikon'
w panelu Project.

Nowy skrypt definiuj,cy zachowanie lub klas1

Bez wzgl'du na to, czy zdecydujesz si' na j'zyk C#, czy JavaScript, przydatne b'dzie prze-
czytanie obu dalszych fragmentów, poniewa1 zawieraj! on ogólne informacje o tworzeniu
skryptów i mog! równie1 pomóc w podj'ciu decyzji o wyborze okre#lonego j'zyka.

W terminologii #rodowiska Unity ka1dy nowo utworzony skrypt odpowiada zdefiniowaniu nowej
klasy. Je#li jeste# pocz!tkuj!cym programist!, potraktuj klas' jako zbiór dzia%a*, w%a#ciwo#ci i
innych zapami'tanych informacji, do których mo1na mie2 dost'p poprzez jej nazw'.

Na przyk%ad klasa o nazwie

Pies

mog%aby zawiera2 takie w%a#ciwo#ci, jak

kolor

,

rasa

,

rozmiar

i

p:e;

. Oprócz nich istnia%yby takie dzia%ania, jak

biegnij

czy

przynie@ patyk

. W%a#ciwo#ci mog!

by2 opisane jako zmienne, natomiast dzia%ania mog! zosta2 zdefiniowane w postaci funkcji,
zwanych tak1e metodami.

Aby odwo%a2 si' do zmiennej

rasa

, która jest w%a#ciwo#ci! klasy

Pies

, mogliby#my poda2 nazw'

klasy, nast'pnie u1y2 znaku kropki, a wreszcie wprowadzi2 nazw' zmiennej:

Pies.rasa;

Do wywo%ania funkcji klasy

Pies

mogliby#my zastosowa2 poni1szy zapis:

Pies.przyniesPatyk();

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

54

Funkcje mo1emy równie1 wywo%ywa2 z argumentami — nie maj! one jednak nic wspólnego
z tymi, których u1ywamy codziennie podczas dyskusji z innymi osobami! Przyjmij za%o1enie,
1e argumenty pozwalaj! na modyfikowanie dzia%ania funkcji. Na przyk%ad w przypadku funkcji

przyniesPatyk

mogliby#my u1y2 argumentu, który definiuje, jak szybko pies powinien przynie#2

patyk. Jej wywo%anie mog%oby wygl!da2 tak:

Pies.przyniesPatyk(25);

Mimo 1e zaprezentowane wy1ej przyk%ady s! abstrakcyjne, cz'sto pozwalaj! odwzorowa2 kod
programu na sytuacje wzi'te z 1ycia, co sprawia, 1e nabieraj! sensu. Podczas czytania tej ksi!1ki
postaraj si' do nich wraca2. Mo1esz tak1e tworzy2 w%asne odwzorowania, co pozwoli Ci lepiej
zrozumie2 dzia%anie klas informacji oraz ich w%a#ciwo#ci.

W czasie pisania skryptu w j'zyku C# lub JavaScript tworzysz now! klas' (lub klasy) zawiera-
j!c! w%a#ciwo#ci (zmienne) oraz polecenia (funkcje), których mo1esz u1y2 w okre#lonym miejscu
w swojej grze.

Jak wygl,da od $rodka dzia&anie skryptu w j1zyku C#?

Gdy w #rodowisku Unity utworzysz nowy skrypt w j'zyku C#, od razu otrzymasz pewien kod,
którego mo1esz u1y2:

using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}

Kod rozpoczyna si' od dwóch niezb'dnych wierszy, zawieraj!cych odwo%ania do samego silnika
Unity:

using UnityEngine;
using System.Collections;

Nast'pnie jest tworzona nazwa klasy, zgodna z nazw! skryptu. W j'zyku C# musisz zdefinio-
wa2 tak! nazw' skryptu, która b'dzie odpowiada2 nazwie zadeklarowanej w nim klasy. Na
pocz!tku dokumentu widzimy zapis

public class NewBehaviourScript : MonoBehaviour {

,

poniewa1

NewBehaviourScript

jest domy#ln! nazw!, nadawan! przez #rodowisko Unity ka1demu

nowo utworzonemu skryptowi. Je#li w panelu Project zmienisz nazw' skryptu, system Unity
automatycznie zmieni tak1e nazw' zdefiniowanej w nim klasy.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

55

Kod sk&adaj,cy si1 z klas

Podczas pisania kodu wi'kszo & funkcji, zmiennych i innych sk"adników skryptu b'dzie umieszczana
wewn-trz klasy j'zyka C#.

Wewn-trz

w tym kontek cie oznacza, $e musi wyst-pi& po deklaracji klasy

i ko2czy& si' zamykaj-cym nawiasem klamrowym }, znajduj-cym si' na ko2cu skryptu. Podczas analizowania
polece2 zawartych w tej ksi-$ce mo$esz za"o$y&, $e Twój kod powinien zosta& umieszczony wewn-trz
klasy zdefiniowanej w skrypcie. Ka$dy wyj-tek od tej regu"y zostanie jawnie wskazany. Ta zasada nie
jest tak rygorystycznie przestrzegana w j'zyku JavaScript, poniewa$ ca"y skrypt jest w nim definiowany
jako oddzielna klasa. Aby zapozna& si' ze szczegó"ami, przeczytaj podrozdzia" zatytu"owany „Jak wygl-da
od rodka dzia"anie skryptu w j'zyku JavaScript?”.

Funkcje podstawowe

&rodowisko Unity zawiera wiele w%asnych funkcji, które mog! by2 u1ywane w celu uruchomienia
ró1nych opcji silnika gry. Dwie z nich s! szczególnie wa1ne podczas tworzenia nowego skryptu
w j'zyku C#.

Uwaga

Funkcje j'zyka C# (zwane równie$ metodami) najcz' ciej rozpoczynaj- si' od s"owa void. U$yta nazwa
okre la typ warto ci, która jest zwracana przez funkcj', czyli danej otrzymanej po jej wywo"aniu. Poniewa$
wi'kszo & funkcji jest tworzona wy"-cznie w celu wykonania okre lonych instrukcji, a nie zwracania jakich
informacji, na pocz-tku ich deklaracji b'dziesz cz'sto spotyka" s"owo void. Oznacza ono po prostu, $e
wywo"anie funkcji nie zwróci $adnych warto ci.

Funkcje te s! nast'puj!ce:

Start()

: Zostaje ona wywo%ana przy pierwszym uruchomieniu sceny, dlatego jest

cz'sto u1ywana (jak wynika z sugestii zawartej w kodzie) w celach inicjalizacyjnych.
Na przyk%ad móg%by# dysponowa2 zmienn! przechowuj!c! wynik, której musi zosta2
przypisana warto#2

0

podczas rozpoczynania gry. W funkcji

Start()

mog%aby tak1e

zosta2 wywo%ana procedura, która umieszcza posta2 gracza we w%a#ciwym miejscu
gry na pocz!tku danego poziomu.

Update()

: Poniewa1 stany ró1nych elementów gry mog! si' zmienia2 w trakcie jej

trwania, funkcja ta jest wywo%ywana w ka1dej iteracji podczas dzia%ania Twojego
programu i jest odpowiedzialna za ich sprawdzanie.

Zmienne w j1zyku C#

Aby zapami'ta2 informacj' w zmiennej j'zyka C#, nale1y u1y2 nast'puj!cej sk%adni:

typDanych nazwaZmiennej = warto=>;

Na przyk%ad:

int currentScore = 5;

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

56

lub:

float currentVelocity = 5.86f;

Zwró2 uwag' na to, 1e w powy1szych przyk%adach u1yto danych numerycznych:

int

oznacza

liczb2

ca3kowit6, natomiast

float

liczb2 zmiennoprzecinkow6. Ten drugi przypadek wymaga

dodatkowo w j'zyku C# umieszczenia litery

f

po warto#ci samej liczby. Ró1ni si' to w pewien

sposób od sk%adni u1ywanej w j'zyku JavaScript. Wi'cej szczegó%ów zostanie zaprezentowanych
w kolejnym punkcie „Zmienne w j'zyku JavaScript”.

Jak wygl,da od $rodka
dzia&anie skryptu w j1zyku JavaScript?

Nowo utworzony plik w j'zyku JavaScript zawiera mniej danych ni1 odpowiadaj!cy mu plik
j'zyka C#, poniewa1 ca%y skrypt jest uwa1any za definicj' klasy. Zak%ada si', 1e znajduj!ce si'
w nim tre#ci zawieraj! si' mi'dzy niewidocznymi dla u1ytkownika znacznikami otwieraj!cymi
i zamykaj!cymi klas', gdy1 sama jej deklaracja jest ukryta.

Mo1esz tak1e zauwa1y2, 1e wiersze

using UnityEngine;

i

using System.Collections;

s! rów-

nie1 niewidoczne w pliku j'zyka JavaScript, dlatego nowo utworzony skrypt zawiera tylko
funkcj'

Update()

:

function Update() {
}

Deklaracja funkcji w j'zyku JavaScript wygl!da inaczej i wymaga u1ycia s%owa kluczowego

function

przed jej nazw!. Deklaracje zmiennych i innych elementów skryptu s! tak1e zapisy-

wane w odmienny sposób — w kolejnych punktach zapoznamy si' z odpowiednimi przyk%adami.

Zmienne w j1zyku JavaScript

Sk%adnia s%u1!ca do deklarowania zmiennych w j'zyku JavaScript wygl!da nast'puj!co:

var nazwaZmiennej : TypDanych = warto!";

Jak wida2, deklaracja jest zawsze poprzedzona s%owem kluczowym

var

. Na przyk%ad:

var currentScore : int = 0;

lub:

var currentVelocity : float = 5.86;

Jak zapewne zauwa1y%e#, typ

float

, inaczej ni1 w j'zyku C#, nie wymaga podania litery

f

wyst'puj!cej za warto#ci!. Podczas analizy kolejnych skryptów napisanych w dwóch ró1nych

j'zykach b'dziesz tak1e móg% stwierdzi2, 1e j'zyk C# ma cz'sto bardziej rygorystyczne regu%y,
okre#laj!ce sposób tworzenia programów, szczególnie w przypadku niejawnie deklarowanych
typów danych, które maj! by2 u1ywane.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

57

Komentarze

Zarówno w j'zyku C#, jak i w JavaScript mo1esz tworzy2 komentarze za pomoc! nast'puj!cych
konstrukcji:

// dwa uko=niki oznaczaj? pojedynczy wiersz komentarza

lub:

/* uko=nik i gwiazdka rozpoczynaj? komentarz zawieraj?cy siA w wielu wierszach.
Jego zakoBczeniem s? gwiazdka i uko=nik */

Podczas czytania tej ksi!1ki komentarze mog! pomóc Ci przypomnie2 sobie zasad' dzia%ania
tworzonych przez Ciebie fragmentów kodu. Pami'taj, 1e komentarze nie wykonuj! si', dlatego
mo1esz w nich umieszcza2 dowolne teksty, w%!czaj!c w to równie1 wiersze kodu. Dopóki b'd!
si' one zawiera2 w komentarzu, nie zostan! potraktowane jako dzia%aj!cy kod.

Atakowanie $ciany

A teraz zastosujmy zdobyt! wiedz' w praktyce i zamie*my istniej!c! scen' w prototyp inte-
rakcyjnej fabu%y. W panelu Project zmie* nazw' nowo utworzonego skryptu poprzez jego
wybranie, naci#ni'cie klawisza F2 (PC) lub Return (Mac), a nast'pnie wprowadzenie tekstu
skryptu Shooter.

Je#li wykorzystujesz j'zyk C#, pami'taj o upewnieniu si', 1e Twoja deklaracja klasy znajduj!ca
si' wewn!trz skryptu odpowiada jego nazwie:

public class Shooter : MonoBehaviour {

Jak wcze#niej wspomniano, u1ytkownicy wykorzystuj!cy j'zyk JavaScript nie b'd! musieli sto-
sowa2 si' do powy1szej regu%y. By zastosowa2 w praktyce wiedz' o korzystaniu ze skryptów
w #rodowisku Unity, napiszemy skrypt steruj!cy kamer! i pozwalaj!cy na strzelanie pociskami
w kierunku postawionej przez nas #ciany.

Na pocz!tku utworzymy trzy zmienne:

bullet

: ta zmienna jest typu

Rigidbody

, poniewa1 przechowuje odwo%anie do obiektu

o w%a#ciwo#ciach fizycznych, który zostanie przez nas utworzony;

power

: jest to zmienna o typie zmiennoprzecinkowym, któr! wykorzystamy w celu

ustalenia si%y strza%u;

moveSpeed

: kolejna zmienna o typie zmiennoprzecinkowym, której u1yjemy,

by zdefiniowa2 pr'dko#2 poruszania kamer! za pomoc! klawiszy strza%ek.

Powy1sze zmienne musz! by2 sk3adowymi z dost2pem publicznym, co pozwoli je wy#wietli2
w panelu Inspector w postaci modyfikowanych ustawie*. Za chwil' zobaczysz, jak to dzia%a!

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

58

Deklarowanie zmiennych publicznych

Wa1ne jest, by zrozumie2 dzia%anie zmiennych o dost'pie publicznym, poniewa1 pozwala on na
odwo%ywanie si' do nich z innych skryptów. Ma to znaczenie podczas projektowania gier,
gdy1 umo1liwia definiowanie prostszej komunikacji mi'dzyobiektowej. Zmienne publiczne s!
tak1e przydatne z tego wzgl'du, 1e wyst'puj! w postaci ustawie*, które mo1na wizualnie mody-
fikowa2 w panelu Inspector, gdy tylko skrypt zostanie przypisany do obiektu. Zmienne pry-
watne zachowuj! si' przeciwnie — zosta%y zaprojektowane, by by2 dost'pne tylko z poziomu
skryptu, klasy lub funkcji, w których s! zdefiniowane. Nie pojawiaj! si' równie1 w postaci
ustawie* w panelu Inspector.

J2zyk C#:

Zanim rozpoczniemy dzia%ania, usuniemy funkcj'

Start()

ze skryptu, poniewa1 nie b'dziemy jej

u1ywa2. W tym celu po prostu skasuj tekst

void Start { }

. Aby stworzy2 wymagane zmienne,

umie#2 poni1szy fragment kodu w swoim skrypcie poni1ej wiersza otwieraj!cego klas':

using UnityEngine;
using System.Collections;
public class Shooter : MonoBehaviour {
public Rigidbody bullet;
public float power = 1500f;
public float moveSpeed = 2f;
void Update () {
}
}

Zwró2 uwag' na to, 1e w powy1szym przyk%adzie usun'li#my domy#lne komentarze, by zaosz-
cz'dzi2 miejsce.

J2zyk JavaScript:

Aby stworzy2 zmienne o dost'pie publicznym w j'zyku JavaScript, musisz si' upewni2, 1e zostan!
one zadeklarowane poza istniej!cymi funkcjami. Nale1y je po prostu umie#ci2 na samej górze
skryptu. Zadeklaruj wi'c trzy wymagane zmienne, wstawiaj!c poni1szy kod na pocz!tku skryptu
Shooter:

var bullet : Rigidbody;
var power : float = 1500;
var moveSpeed : float = 5;
function Update () {
}

Przypisywanie skryptów do obiektów

Aby skrypt móg% zosta2 u1yty w grze, musi by2 przypisany jako komponent do jednego z obiek-
tów gry znajduj!cych si' w istniej!cej scenie.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

59

Zapisz skrypt, wybieraj!c z g%ównego menu edytora opcj' File/Save (plik/zapisz), a nast'pnie wró2
do #rodowiska Unity. Oferuje ono kilka sposobów przypisywania skryptu do obiektu:

1. Przeci!gnij go z panelu Project i upu#2 na nazwie obiektu w panelu Hierarchy.

2. Przeci!gnij go z panelu Project i upu#2 na wizualn! reprezentacj' obiektu w panelu

Scene.

3. Wybierz obiekt, dla którego chcesz przypisa2 skrypt. Nast'pnie przeci!gnij i upu#2

skrypt w niezaj'tym obszarze w widoku Inspector tego obiektu.

4. Wybierz obiekt, do którego chcesz przypisa2 skrypt. Wybierz opcj' menu g%ównego

Component/Scripts (komponent/skrypty), a nast'pnie nazw' swojego skryptu.

Najcz'#ciej jest stosowana pierwsza metoda. W naszym przypadku b'dzie to rzeczywi#cie
najlepszy wybór, poniewa1 przeci!ganie skryptu do kamery w widoku Scene mog%oby by2 uci!1-
liwe z tego powodu, 1e nie zawiera ona wyra8nego obszaru, na którym mo1na by go upu#ci2.

Przeci!gnij wi'c nowy skrypt Shooter z panelu Project i upu#2 go na nazwie Main Camera,
znajduj!cej si' w panelu Hierarchy, co spowoduje jego przypisanie. B'dziesz móg% zauwa1y2,
1e skrypt zostanie wy#wietlony jako nowy sk%adnik poni1ej istniej!cego komponentu

Audio

Listener

. W panelu Inspector stwierdzisz tak1e istnienie trzech zmiennych publicznych:

Bullet

,

Power

i

Move Speed

:

Jak mo1esz zauwa1y2, #rodowisko Unity zmodyfikowa%o nazwy zmiennych, rozpoczynaj!c je od
wielkiej litery. Dodatkowo, w przypadku zmiennej

moveSpeed

, wielka litera wewn!trz jej nazwy

zosta%a potraktowana jako pocz!tek nowego s%owa. Dzi'ki temu uzyskano dwa wyrazy oddzielone
spacj!, które s! widoczne w panelu Inspector jako jedna zmienna publiczna.

Mo1na równie1 stwierdzi2, 1e zmienna

Bullet

nie zosta%a jeszcze zainicjalizowana, lecz ocze-

kuje si', i1 obiekt, który zostanie do niej przypisany, b'dzie u1ywa% komponentu bry%y sztywnej
(

Rigidbody

). Cz'sto zwany jest on po prostu obiektem typu

Rigidbody

. Pomimo tego, 1e w #ro-

dowisku Unity wszystkie elementy w scenie mog! by2 traktowane jako obiekty gry, podczas
definiowania w skrypcie obiektu o typie

Rigidbody

b'dziemy mogli si' odwo%ywa2 jedynie do

w%a#ciwo#ci i funkcji klasy o tej w%a#nie nazwie. Nie stanowi to jednak problemu — po prostu
sprawia, 1e skrypt staje si' bardziej efektywny ni1 w przypadku, gdyby#my odwo%ywali si' do
ca%ej klasy

GameObject

. Aby dowiedzie2 si' wi'cej na ten temat, zapoznaj si' z dokumentacj!

zwi!zan! z oprogramowaniem skryptowym dotycz!cym wspomnianych klas:

GameObject

: http://unity3d.com/support/documentation/ScriptReference/GameObject.html,

RigidBody

: http://unity3d.com/support/documentation/ScriptReference/Rigidbody.html.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

60

Uwaga

Pami'taj, $e podczas modyfikowania zmiennych publicznych, dost'pnych w panelu

Inspector

, dowolna

ich zmiana zamiast zast-pi& warto ci, które zosta"y zapisane w skrypcie, po prostu je przes"oni.

Kontynuujmy prace zwi!zane z tworzeniem skryptu i uzupe%nijmy go o pewn! interaktywno#2.
Wró2 wi'c z powrotem do edytora, do którego zosta% on wczytany.

Poruszanie kamer,

Teraz wykorzystamy zmienn!

moveSpeed

oraz odczytamy stan klawiatury, aby porusza2 kamer!

i faktycznie stworzy2 prosty mechanizm celowania dla strza%u. B'dzie on polega2 na ustawianiu
kamery w kierunku miejsca, w które b'dziemy strzelali.

Poniewa1 chcieliby#my u1ywa2 klawiszy strza%ek na klawiaturze, musimy si' najpierw dowie-
dzie2, w jaki sposób w kodzie mo1na si' do nich odwo%ywa2. &rodowisko Unity wykorzystuje
wiele sygna%ów wej#ciowych, które mo1na obserwowa2 i modyfikowa2 przy u1yciu mened@era
wejAB

(Input Manager) — patrz menu Edit/Project Settings/Input (edycja/ustawienia pro-

jektu/wej#cie).

Jak wida2 na poni1szym rysunku, istniej! dwa domy#lne parametry typu Input (wej#cie): Hori-
zontal
(poziomy) i Vertical (pionowy). Wykorzystuj! one zasad' dzia%ania osi wspó%rz'dnych,
dzi'ki czemu naciskanie przycisku Positive Button (przycisk dodatni) generuje warto#2 równ!

1

,

natomiast naciskanie przycisku Negative Button (przycisk ujemny) tworzy warto#2

-1

. Zwolnienie

dowolnego przycisku oznacza, 1e warto#2 typu Input ponownie staje si' równa

0

, podobnie

jak mia%oby to miejsce podczas u1ywania spr'1ystego joysticka analogowego, znajduj!cego si'
w urz!dzeniu typu gamepad.

Poniewa1 typ

Input

jest równie1 nazw! klasy, a wszystkie nazwane elementy w mened1erze

wej#2 s! osiami lub przyciskami, w skrypcie mo1emy u1y2 nast'puj!cego zapisu:

Input.GetAxis("Horizontal");

Powy1szy wiersz pozwala na odczytanie bie1!cej warto#ci przycisków poziomych, zawieraj!cej
si' w zakresie od

-1

do

1

w zale1no#ci od tego, co jest naciskane przez u1ytkownika. Zastosujmy

go w naszym skrypcie, u1ywaj!c zmiennych lokalnych do reprezentowania osi.

Dzi'ki temu mo1emy pó8niej zmodyfikowa2 warto#2 zmiennej, u1ywaj!c operacji mno1enia,
dzi'ki czemu uzyskamy maksymaln! warto#2 wi'ksz! od

1

. Pozwoli nam to na przemieszczanie

kamery z pr'dko#ci! wi'ksz! ni1 jedna jednostka na iteracj'.

Dost'pu do tej zmiennej nie musimy mie2 w panelu Inspector, poniewa1 samo #rodowisko Unity
b'dzie przypisywa2 jej odpowiednie warto#ci w zale1no#ci od stanu sygna%ów wej#ciowych.
Wynika st!d, 1e powinna ona zosta2 zdefiniowana jako zmienna lokalna.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

61

Zmienne lokalne, prywatne i publiczne

Zanim b'dziemy kontynuowa2 prace zwi!zane z tworzeniem skryptu, zapoznajmy si' ze zmien-
nymi lokalnymi, prywatnymi i publicznymi:

Zmienne lokalne

. S! to zmienne tworzone wewn!trz funkcji. Nie b'd! prezentowane

w panelu Inspector i s! dost'pne wy%!cznie dla funkcji, w której si' znajduj!.

Zmienne prywatne

. S! tworzone na zewn!trz funkcji i dlatego dost'p do nich maj!

wszystkie funkcje danej klasy. Nie s! one jednak widoczne w panelu Inspector.

Zmienne publiczne

. S! tworzone na zewn!trz funkcji, dost'p do nich maj! wszystkie

funkcje danej klasy, a tak1e inne skrypty. Zmienne publiczne s! widoczne w panelu
Inspector i mog! by2 tam modyfikowane.

Zmienne lokalne i odczytywanie wej$;

Tworzenie zmiennych lokalnych w j'zykach C# i JavaScript zosta%o przedstawione w poni1-
szych fragmentach kodu:

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

62

J2zyk C#:

void Update () {
float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;

J2zyk JavaScript:

function Update () {
var h : float = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
var v : float = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;

Zadeklarowane zmienne:

h

dla osi poziomej i

v

dla osi pionowej mog%yby zosta2 dowolnie

nazwane, jednak1e u1ywanie pojedynczych liter jest po prostu szybsze. Ogólnie mówi!c, zazwy-
czaj powinno si' tworzy2 standardowe nazwy, poniewa1 niektóre pojedyncze litery nie mog!
by2 u1ywane. Na przyk%ad nazwy zmiennych

x

,

y

i

z

s! u1ywane do przechowywania warto#ci

wspó%rz'dnych i dlatego te1 zarezerwowano je wy%!cznie do tych zastosowa*.

Poniewa1 warto#ci osi mog! zawiera2 si' w przedziale od

-1

do

1

, zmienne s! liczbami dziesi't-

nymi i musimy je deklarowa2 z u1yciem typu zmiennoprzecinkowego. Mno1y si' je nast'pnie
za pomoc! symbolu gwiazdki

*

przez parametr

Time.deltaTime

. Oznacza to, 1e wyznaczana

warto#2 jest dzielona przez liczb' klatek na sekund' (parametr

deltaTime

jest czasem tworzenia

kolejnych klatek lub czasem liczonym od ostatniego wywo%ania funkcji

Update()

). Wynika st!d,

i1 warto#2 osi!ga pewn! spójn! wielko#2 na sekund', niezale1nie od szybko#ci klatek.

W kolejnym kroku zwi'kszamy warto#2 wynikow!, mno1!c j! przez zmienn! publiczn!, któr!
utworzyli#my wcze#niej, czyli

moveSpeed

. Oznacza to, 1e mimo i1 warto#ci

h

i

v

s! zmiennymi

lokalnymi, mo1emy wci!1 na nie wp%ywa2 poprzez modyfikowanie zmiennej publicznej

moveSpeed

,

dost'pnej w panelu Inspector, poniewa1 jest ona sk%adnikiem u1ywanego przez nas równania.
Jest to cz'sto spotykane rozwi!zanie podczas tworzenia skryptów, gdy1 wykorzystuje ono zalet'
u1ycia publicznie dost'pnych ustawie* po%!czonych z okre#lonymi warto#ciami generowanymi
przez funkcj'.

Zrozumienie zasady dzia$ania
polecenia Translate

Aby rzeczywi#cie u1y2 stworzonych zmiennych w celu przemieszczenia obiektu, musimy zasto-
sowa2 polecenie

Translate

. Podczas implementowania dowolnego fragmentu kodu musisz by2

pewien, 1e rozumiesz jego dzia%anie.

Translate

jest poleceniem pochodz!cym z klasy

Transform

: http://unity3d.com/support/

documentation/ScriptReference/Transform.html.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

63

Jest to klasa informacji przechowuj!ca w%a#ciwo#ci po%o1enia, obrotu i skali danego obiektu.
Zawiera ona równie1 funkcje, które mog! by2 u1ywane w celu jego przemieszczania lub
obracania.

Oczekiwane u1ycie funkcji

Translate

wygl!da nast'puj!co:

Transform.Translate(Vector3);

Istnienie parametru

Vector3

oznacza, 1e funkcja

Translate

wymaga jego u1ycia w formie g%ów-

nego argumentu. Dane reprezentowane przez

Vector3

s! po prostu informacjami zawieraj!cymi

warto#ci wspó%rz'dnych X, Y i Z. W naszym konkretnym przypadku oznaczaj! koordynaty
przesuni'cia obiektu.

Implementacja funkcji Translate

Zaimplementujmy polecenie

Translate

, u1ywaj!c utworzonych przez nas warto#ci wej#ciowych

h

i

v

i umieszczaj!c je w parametrze

Vector3

.

J2zyki C# i JavaScript:

Umie#2 poni1szy wiersz kodu wewn!trz funkcji

Update()

w Twoim skrypcie, a dok%adniej pomi'-

dzy jej otwieraj!cym

{

i zamykaj!cym

}

nawiasem klamrowym. Zwró2 uwag' na to, 1e zapis

wygl!da identycznie w obu j'zykach:

transform.Translate(h, v, 0);

Mo1emy tu skorzysta2 ze s%owa

transform

, poniewa1 wiemy, 1e dowolny obiekt, któremu

udost'pnimy skrypt, b'dzie wykorzystywa2 komponent

Transform

. Przy%!czone komponenty

danego obiektu mog! by2 adresowane poprzez u1ycie ich nazw zapisanych ma%ymi literami,
natomiast dost'p do komponentów innych obiektów wymaga zastosowania polecenia

GetComponent

i odpowiedniej nazwy zaczynaj!cej si' od wielkiej litery, na przyk%ad:

GameObject.Find("NazwaInnegoObiektu").GetComponent<Transform>.Translate(h,v,0);

W naszym przypadku nie musimy wykorzystywa2 powy1szej formy zapisu. Dost'p do kompo-
nentów przy%!czonych do innych obiektów zosta% dok%adniej opisany w podrozdziale rozdzia%u 4.,
zatytu%owanym „Komunikacja mi'dzyskryptowa oraz sk%adnia z kropk!”.

W skrypcie u1yjemy bie1!cej warto#ci zmiennej

h

dla osi X oraz

v

dla osi Y, natomiast osi Z

przeka1emy po prostu warto#2

0

, poniewa1 nie chcemy si' przesuwa2 do przodu ani do ty%u.

Zapisz teraz swój skrypt, u1ywaj!c opcji menu g%ównego File/Save (plik/zapisz), a nast'pnie wró2
do #rodowiska Unity. Zapami'taj tworzon! scen' za pomoc! opcji File/Save Scene As (plik/zapisz
scen' jako) i nazwij j! Prototype.

&rodowisko Unity zaproponuje zapisanie jej w domy#lnym folderze Assets (zasoby). Powiniene#
zawsze si' upewnia2, 1e zapami'tujesz sceny w tym folderze, poniewa1 w przeciwnym razie

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

64

nie b'dziesz mia% do nich dost'pu z panelu Project (projekt). By zapewni2 idealny porz!dek,
mo1esz tak1e utworzy2 podkatalog wewn!trz folderu Assets, w którym b'dziesz przechowywa2
swoje sceny. Takie dzia%anie nie jest jednak wymagane, lecz ogólnie uwa1a si' je za dobry wzo-
rzec post'powania.

Testujemy bie&%c% wersj# gry

W #rodowisku Unity mo1esz testowa2 gr' w ka1dym momencie, przy za%o1eniu, 1e skrypty nie
zawieraj! 1adnych b%'dów. Je#li w skryptach wykryto jakie# problemy, b'dziesz musia% je roz-
wi!za2 przed u1yciem trybu grania.

Gdy b%'dy zostan! naprawione, pasek Console (konsola), znajduj!cy si' na dolnej kraw'dzi
interfejsu Unity, nie b'dzie zawiera2 1adnych informacji. Pasek Console wy#wietla najnowsze wpisy
pojawiaj!ce si' w konsoli Unity. Mo1esz j! wy#wietli2, wybieraj!c opcj' menu Window/Console
(okno/konsola) (skrót klawiszowy to Ctrl+Shift+C dla PC lub Command+Shift+C dla kompu-
terów Mac). Ka1dy b%!d zostanie wy#wietlony na czerwono. Dwukrotne jego klikni'cie umo1liwi
wy#wietlenie odpowiedniego fragmentu skryptu, który spowodowa% pojawienie si' problemu.
Wi'kszo#2 b%'dów polega na pomini'ciu jakiego# znaku lub b%'dnym zapisie, dlatego te1 zawsze
dok%adnie sprawdzaj, co napisa%e#.

Je#li Twoja gra jest wolna od b%'dów, kliknij przycisk Play (granie), znajduj!cy si' w górnej cz'#ci
okna Unity, aby przej#2 do trybu grania. B'dziesz móg% porusza2 obiektem

Main Camera

za

pomoc! klawiszy strza%ek góra, dó%, lewo i prawo lub ich odpowiedników: W, A, S i D, tak jak
zaprezentowano na poni1szym rysunku.

Gdy przetestowa%e# ju1 gr' i upewni%e# si', 1e dzia%a poprawnie, ponownie naci#nij przycisk
Play, aby opu#ci2 tryb grania.

Uwaga

Opuszczenie trybu grania przed kontynuowaniem pracy jest wa$ne, poniewa$ podczas jego wy"-czania
wszystkie zmodyfikowane ustawienia komponentów i obiektów u$ywanych w bie$-cej scenie nie zostan-
zapami'tane. Pozostawienie rodowiska Unity w trybie grania i wprowadzanie dalszych modyfikacji b'dzie
oznacza"o, $e po prostu utracisz wyniki swojej pracy.

Uko*czmy prototyp mechaniki gry poprzez uzupe%nienie go o mo1liwo#2 wystrzeliwania poci-
sków w kierunku #ciany, aby j! zburzy2.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

65

Tworzenie pocisku

Aby wystrzeli2 pocisk w kierunku #ciany, musimy w ramach bie1!cej sceny najpierw go utwo-
rzy2, a nast'pnie zapami'ta2 w postaci prefabrykatu.

Uwaga

Prefabrykat jest obiektem gry, przechowywanym w projekcie w postaci zasobu. Zasób ten mo$e by&
konkretyzowany, czyli tworzony w trakcie dzia"ania gry, a nast'pnie przetwarzany poprzez u$ycie kodu.

Tworzenie prefabrykatu pocisku

Rozpocznij od klikni'cia przycisku Create (stwórz), znajduj!cego si' na górnej kraw'dzi panelu
Hierarchy (hierarchia). Nast'pnie z podr'cznego menu wybierz opcj' Sphere (kula). Jak wcze-
#niej wspomniano, dost'p do tworzenia kszta%tów podstawowych jest równie1 mo1liwy za
pomoc! opcji menu g%ównego GameObject/Create/Other (obiekt gry/utwórz/inny).

Teraz upewnij si', 1e utworzona przez Ciebie kula zosta%a zaznaczona w panelu Hierarchy,
a pó8niej przemie#2 kursor myszy na widok Scene (scena) i naci#nij klawisz F, by skoncentrowa2
si' na wybranym obiekcie.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

66

Uwaga

Je li Twoja kula ma takie samo po"o$enie, jak który z innych obiektów, mo$esz w prosty sposób przej &
do narz'dzia translacji (

W

), a nast'pnie przeci-gn-& uchwyt odpowiedniej osi, aby odsun-& j- od zas"a-

niaj-cego elementu. Po tej operacji ponownie skoncentruj widok na kuli poprzez naci ni'cie klawisza

F

.

Spogl!daj!c na panel Inspector (inspektor), mo1esz zauwa1y2, 1e podczas dodawania nowych
obiektów o kszta%tach podstawowych #rodowisko Unity oprócz istniej!cego komponentu

Transform

automatycznie przypisuje im trzy nowe komponenty. S! to:

1.

Mesh Filter

(filtr siatki). S%u1y do modyfikowania kszta%tu.

2.

Renderer

(renderer). S%u1y do modyfikowania wygl!du.

3.

Collider

(zderzacz). S%u1y do zarz!dzania interakcjami (zwanymi kolizjami) z innymi

obiektami.

Tworzenie i przypisywanie materia&u

Wygl!d pocisku da si' zmodyfikowa2 poprzez stworzenie materia%u, który mo1emy przekaza2
do renderera. Gdy chcesz zmieni2 wygl!d obiektu, powiniene# najcz'#ciej odszuka2 odpowied-
nie ustawienia zwi!zane z jakim# komponentem typu

Renderer

. W przypadku obiektów 3D

b'dzie to

Mesh Renderer

(renderer siatki), a dla systemów cz!stek b'dzie to

Particle Renderer

(renderer cz!stek) itd.

Aby zachowa2 porz!dek, utworzymy nowy podkatalog wewn!trz folderu Assets. B'dziemy w nim
przechowywa2 wszystkie materia%y u1ywane w bie1!cym projekcie. W panelu Project kliknij
przycisk Create, a nast'pnie z podr'cznego menu wybierz opcj' Folder (katalog). Zmie* jego
nazw' na Materials poprzez naci#ni'cie klawisza F2 (PC) lub Return (Mac). Teraz umie#2 w nim
materia% czerwonej ceg%y, który zosta% wcze#niej przez Ciebie stworzony.

Uwaga

Aby w panelu

Project

utworzy& nowy zasób w istniej-cym folderze, po prostu go wybierz, a nast'pnie

rozpocznij operacj' tworzenia poprzez klikni'cie przycisku

Create

.

Teraz utworzymy potrzebny materia% i zastosujemy go w naszym obiekcie:

1. Upewnij si', 1e folder Materials jest zaznaczony, a nast'pnie kliknij przycisk Create,

znajduj!cy si' w panelu Project. Z wy#wietlonego menu podr'cznego wybierz opcj'
Material (materia%). Spowoduje to utworzenie zasobu New Material, którego nazw'
powiniene# zmieni2 na bulletColor lub podobn!, przypominaj!c! Ci, 1e powinien
on zosta2 przypisany do pocisku.

2. Maj!c zaznaczony nowo utworzony materia%, kliknij obszar koloru, aby otworzy2 okno

Color Picker. Pó8niej wybierz jaki# odcie* koloru niebieskiego i zamknij to okno.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

67

3. Po wybraniu koloru przeci!gnij materia% bulletColor z panelu Project i upu#2 go na

nazwie kuli w panelu Hierarchy. Spowoduje to przypisanie materia%u do interesuj!cego
Ci' obiektu.

Uwaga

Je li chcesz sprawdzi&, jak b'dzie wygl-da& materia" przypisany do trójwymiarowego obiektu w rodo-
wisku Unity, mo$esz go przeci-gn-& do widoku

Scene

, a nast'pnie umie ci& kursor myszy nad okre lon-

siatk-. System Unity zaprezentuje podgl-d obiektu w wybranym kolorze. Aby uniewa$ni& wybór, mo$esz
przesun-& kursor poza obszar widoku lub nacisn-& klawisz

Esc

. By zastosowa& materia", zwalniasz po

prostu przycisk myszy.

Dodawanie parametrów fizycznych za pomoc, komponentu Rigidbody

Poprzez dodanie komponentu

Rigidbody

musimy zapewni2 to, 1e silnik fizyczny b'dzie móg%

sterowa2 pociskiem Sphere. Wybierz obiekt Sphere z panelu Hierarchy, a nast'pnie opcj'
Component/Physics/Rigidbody (komponent/parametry fizyczne/bry%a sztywna) z menu g%ównego.

Komponent bry%y sztywnej zosta% dodany, a jego parametry mog! by2 modyfikowane w panelu
Inspector. Na potrzeby obecnego prototypu nie musimy jednak niczego zmienia2.

Przechowywanie obiektów
jako prefabrykatów

Poniewa1 powinni#my wystrzeliwa2 pocisk w chwili, gdy gracz naci#nie jaki# klawisz, nie
chcemy, aby znajdowa% si' on ca%y czas w scenie. Zamiast tego powinien by2 przechowywany
i konkretyzowa2 si' dopiero podczas naciskania klawisza. Z tego powodu b'dziemy zapisywa2 nasz
obiekt w postaci prefabrykatu, a nast'pnie u1ywa2 skryptu w celu jego konkretyzacji (to znaczy
tworzenia jego instancji) w momencie naciskania klawisza.

Uwaga

Prefabrykaty w rodowisku Unity pozwalaj- na przechowywanie obiektów gry, które zosta"y zdefinio-
wane w okre lony sposób. Na przyk"ad mo$esz odpowiednio skonfigurowa& obiekt wrogiego $o"nierza,
zawieraj-cy pewne skrypty i w"a ciwo ci, które definiuj- jego zachowanie. Nast'pnie mo$esz zapisa&
ten obiekt w postaci prefabrykatu i w razie konieczno ci konkretyzowa& go. Podobnie móg"by u$ywa&
innego $o"nierza, zachowuj-cego si' odmiennie, który by"by kolejnym prefabrykatem. Móg"by tak$e
utworzy& instancj' pierwszego obiektu, a pó6niej zmodyfikowa& ustawienia jego komponentów, aby po
konkretyzacji porusza" si' wolniej lub szybciej. System prefabrykatów udost'pnia szeroki zakres swobody
w tym wzgl'dzie.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

68

Kliknij przycisk Create (stwórz), znajduj!cy si' na górze panelu Project (projekt), a nast'pnie
wybierz opcj' Folder (folder). Zmie* nazw' nowo utworzonego katalogu na Prefabs. W kolejnym
kroku przeci!gnij obiekt Sphere z panelu Hierarchy (hierarchia) i upu#2 go na folder Prefabs
w panelu Project. Przeci!gni'cie obiektu gry w dowolny obszar panelu Project spowoduje, 1e
zostanie on zapami'tany jako prefabrykat. Folder Prefabs zosta% przez nas utworzony jedynie
w celu zapewnienia porz!dku i stosowania si' do dobrych wzorców post'powania. Zmie* nazw'
nowo utworzonego prefabrykatu na Projectile.

Mo1esz ju1 usun!2 oryginalny obiekt Sphere z panelu Hierarchy: wybierz go, a nast'pnie na-
ci#nij klawisz Delete (PC) lub Command+Backspace (Mac). Alternatyw! dla tego rozwi!zania
jest klikni'cie prawym klawiszem myszy obiektu w panelu Hierarchy i wybranie opcji Delete
(usu*) z menu podr'cznego.

Wystrzelenie pocisku

Wró2my do skryptu Shooter, który w%a#nie tworzymy. W tym celu kliknij dwukrotnie jego ikon',
znajduj!c! si' w panelu Project, lub wybierz go, a nast'pnie kliknij przycisk Open (otwórz),
wy#wietlany na górze okna Inspector (inspektor).

U1yjemy wcze#niej zadeklarowanej zmiennej

bullet

, b'd!cej odwo%aniem do okre#lonego

obiektu, który zamierzamy skonkretyzowa2. Gdy tylko obiekt zostanie utworzony z prefabrykatu,
zastosujemy odpowiednie dzia%anie, aby wystrzeli2 go w kierunku #ciany znajduj!cej si' w scenie.

W funkcji

Update()

po wierszu

transform.Translate(h, v, 0)

dodaj nast'puj!cy kod, niezale1-

nie od tego, jakiego j'zyka programowania u1ywasz:

if(Input.GetButtonUp("Fire1")){
}

Polecenie

if

sprawdza, czy klawisz przypisany do wej#ciowego przycisku

Fire1

zosta% zwolniony.

Domy#lnie jest on odwzorowany na lewy klawisz Ctrl lub lewy przycisk myszy. Mo1esz go jed-
nak przypisa2 do innego klawisza, wprowadzaj!c odpowiedni! modyfikacj' w mened1erze
wej#2, co mo1na zrobi2 przez wybranie opcji menu g%ównego Edit/Project Settings/Input
(edycja/ustawienia projektu/wej#cia).

U&ycie funkcji Instantiate()
do konkretyzowania obiektów

Wewn!trz polecenia

if

(to znaczy pomi'dzy otwieraj!cym i zamykaj!cym nawiasem klamrowym)

umie#2 nast'puj!cy wiersz kodu:

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

69

J2zyk C#:

Rigidbody instance = Instantiate(bullet, transform.position,
transform.rotation) as Rigidbody;

J2zyk JavaScript:

var instance: Rigidbody = Instantiate(bullet, transform.position,
transform.rotation);

Jak wida2, stworzyli#my now! zmienn! zwan!

instance

. Przechowujemy w niej referencj' do

funkcji tworz!cej nowy obiekt o typie

Rigidbody

.

Polecenie

Instantiate

wymaga podania trzech parametrów:

Instantiate(co naleay stworzy;, gdzie naleay stworzy;, wielko@; obrotu);

W naszym przypadku chcemy, aby zosta%a utworzona instancja obiektu lub prefabrykatu, który
zosta% przypisany do zmiennej publicznej

bullet

. Po%o1enie i obrót instancji pobierzemy

z komponentu

transform

, u1ywanego w obiekcie, do którego zosta% przydzielony skrypt, czyli

Main Camera

. Dlatego te1 w skryptach b'dziesz móg% cz'sto zauwa1y2 zapis

transform.position

,

odnosz!cy si' do ustawie* zwi!zanych z komponentem

transform

i dotycz!cy po%o1enia obiektu,

do którego zosta% przy%!czony dany skrypt.

Zauwa1, 1e w j'zyku C# musisz umie#ci2 s%owo

Rigidbody

za wywo%aniem funkcji

Instantiate

,

aby jawnie wskaza2 typ danych.

Przy&o.enie wektora si&y do bry&y sztywnej

Po utworzeniu obiektu musimy go natychmiast wystrzeli2, u1ywaj!c w tym celu polecenia

AddForce()

. Dzia%a ono tak:

Rigidbody.AddForce(kierunek i wielko@; wektora si:y podane jako typ Vector3);

Zanim wi'c przy%o1ymy wektor si%y, musimy stworzy2 referencj' do kierunku, w którym chcemy
strzela2. Kamera jest zwrócona w stron' #ciany z cegie%, wi'c sensowne jest, by oddawa2 strza%y
w tym w%a#nie kierunku. Poni1ej wiersza zawieraj!cego funkcj'

Instantiate()

, a jednocze#nie

wci!1 w obr'bie polecenia

if

, umie#2 nast'puj!cy kod:

J2zyk C#:

Vector3 fwd = transform.TransformDirection(Vector3.forward);

J2zyk JavaScript:

var fwd: Vector3 = transform.TransformDirection(Vector3.forward);

Utworzyli#my zmienn!

fwd

o typie

Vector3

i przypisali#my jej kierunek do przodu dla kom-

ponentu

transform

w obiekcie, do którego jest przy%!czony nasz skrypt.

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Projektowanie gier w "rodowisku Unity 3.x

70

Polecenie

TransformDirection

mo1e zosta2 u1yte w celu przekszta%cenia lokalnego kierunku —

w naszym przypadku kierunku wskazywania kamery — na kierunek #wiata. Obiekty oraz #wiat
maj! w%asne systemy wspó%rz'dnych, wi'c mo1e si' zdarzy2, 1e kierunek wskazywania do
przodu dla jakiego# obiektu nie musi koniecznie odpowiada2 w%a#ciwemu kierunkowi #wiata.
Wynika st!d, i1 w takich przypadkach konwersja jest niezb'dna. Konstrukcja

Vector3.forward

,

u1yta w powy1szym kontek#cie, jest zwyk%ym uproszczeniem zapisu

Vector3(0, 0, 1)

. Wyst'-

puje w nim warto#2 jednostkowa d%ugo#ci dla osi Z.

Wreszcie b'dziemy mogli wystrzeli2 pocisk przez odwo%anie si' do naszej zmiennej, która
reprezentuje nowo utworzony obiekt

instance

, a nast'pnie u1ycie polecenia

AddForce()

w celu

przy%o1enia si%y w kierunku zdefiniowanym w zmiennej

fwd

, mno1!c j! przez wcze#niej utworzon!

zmienn! publiczn!

power

. Dodaj poni1szy wiersz kodu bezpo#rednio pod tym, który poprzednio

umie#ci%e# w skrypcie:

J2zyki C# i JavaScript:

instance.AddForce(fwd * power);

Zapami'taj skrypt i wró2 do #rodowiska Unity.

Zanim przetestujemy dzia%anie uko*czonej mechaniki gry, musimy przypisa2 prefabrykat
Projectile do zmiennej publicznej

Bullet

. W tym celu wybierz obiekt

Main Camera

w panelu

Hierarchy, aby wy#wietli2 skrypt Shooter w postaci komponentu w panelu Inspector.

Nast'pnie przeci!gnij prefabrykat Projectile z panelu Project i upu#2 go na zmienn!

Bullet

w panelu Inspector w miejscu, w którym znajduje si' napis None (Rigidbody), jak przedstawiono
na poni1szym rysunku:

Po wykonaniu tej czynno#ci b'dziesz móg% zobaczy2 nazw' Projectile w obszarze zmiennej

Bullet

. Zapisz scen' za pomoc! opcji File/Save Scene (plik/zapisz scen'), a pó8niej przetestuj gr',

naciskaj!c przycisk Play znajduj!cy si' w górnej cz'#ci interfejsu.

Teraz b'dziesz móg% przemieszcza2 kamer' i strzela2 pociskami za pomoc! lewego klawisza
Ctrl na klawiaturze. Je#li chcesz zmieni2 si%' wystrza%u pocisku, po prostu zmodyfikuj zmienn!

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Rozdzia' 2. • Podstawy tworzenia prototypów i skryptów

71

publiczn! Power poprzez wybranie obiektu

Main Camera

, a nast'pnie wprowadzenie innej

warto#ci w miejsce liczby

1500

przypisanej do komponentu

Shooter (Script)

. Pami'taj, aby

zawsze nacisn!2 przycisk Play w celu zako*czenia testowania.

Podsumowanie

Gratulacje! W%a#nie stworzy%e# swój pierwszy prototyp w #rodowisku Unity.

W tym rozdziale pozna%e# zasady u1ywania interfejsu Unity, obiektów gry i komponentów,
a tak1e podstawy tworzenia skryptów. Miejmy nadziej', 1e wiedza ta b'dzie solidnym funda-
mentem, na którym zostanie zbudowane dalsze do#wiadczenie w tworzeniu gier komputerowych
w #rodowisku Unity.

A teraz chwila odpoczynku. Zagraj w stworzony przez siebie prototyp gry, a mo1e stwórz kolejny
w oparciu o informacje zaprezentowane w tym rozdziale. By2 mo1e jeste# jednak 1!dny wie-
dzy — je#li tak, kontynuuj czytanie ksi!1ki!

Skoro pozna%e# ju1 podstawowe operacje dost'pne w #rodowisku projektowym Unity, zajmijmy
si' w%a#ciw! gr!, która b'dzie omawiana w dalszych rozdzia%ach tej ksi!1ki.

W nast'pnym rozdziale rozpoczniemy tworzenie gry zwanej Survival Island (wyspa przetrwania).
Poznasz, w jaki sposób mo1na b'dzie wykorzysta2 narz'dzia tworzenia terenu, aby ukszta%towa2
tropikaln! wysp', która ma nawet swój wulkan! W dalszej kolejno#ci umie#cisz na niej prefa-
brykat postaci gracza i zwiedzisz nowo utworzony raj tropikalny!

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ

background image

Czytaj dalej...

Projektowanie gier w "rodowisku Unity 3.x

72

Pole

ü ksiąĪkĊ

Kup ksi

ąĪkĊ


Wyszukiwarka

Podobne podstrony:
Projektowanie gier w srodowisku Unity 3 x prgun3
Projektowanie gier w srodowisku Unity 3 x
informatyka tworzenie gier na platforme android 4 j f dimarzio ebook
Projektowanie gier przy uzyciu srodowiska Unity i jezyka C Od pomyslu do gotowej gry Wydanie II prog
informatyka grywalizacja jak zastosowac reguly gier w dzialaniach marketingowych pawel tkaczyk ebook
informatyka podrecznik projektantow logo smashing magazine gareth hardy ebook
informatyka flash i wallaby projektowanie animacji zgodnych z html5 ian l mclean ebook
informatyka android programowanie gier na tablety jeremy kerfs ebook
informatyka podrecznik projektantow www smashing magazine smashing magazine ebook
informatyka projektowanie stron internetowych przewodnik dla poczatkujacych webmasterow po x html cs
informatyka j2me praktyczne projekty wydanie ii krzysztof rychlicki kicior ebook
informatyka projektowanie systemow cms przy uzyciu php i jquery kae verens ebook
informatyka projektowanie witryn internetowych user experience smashing magazine jesmond allen ebook
informatyka rails projektowanie systemow klasy enterprise dan chak ebook
projekt 3, Inżynieria Środowiska PŚk, Semestr 2, Hydrogeologia 1, projekt, czyjeś projekty

więcej podobnych podstron