Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00213 004769 15203191 na godz. na dobę w sumie
Projektowanie gier w środowisku Unity 3.x - książka
Projektowanie gier w środowisku Unity 3.x - książka
Autor: Liczba stron: 448
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3984-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> gry >> inne
Porównaj ceny (książka, ebook, audiobook).

Stwórz w pełni funkcjonalne i profesjonalne gry 3D!

Silniki gier, takie jak Unity, są znanymi, cenionymi, a przede wszystkim potężnymi narzędziami ułatwiającymi tworzenie gier. Środowisko Unity jest jednym z najczęściej używanych oraz najbardziej cenionych pakietów, pozwalających na projektowanie gier komputerowych. Może ono być wykorzystywane przez bardzo różnych użytkowników, poczynając od hobbystów, a kończąc na dużych firmach. Pozwala tworzyć gry oraz interaktywne aplikacje dla przeglądarek internetowych, komputerów stacjonarnych, urządzeń przenośnych czy konsol. Dzięki intuicyjnemu i prostemu w obsłudze zestawowi narzędzi Unity oraz niniejszej książce także i Ty możesz stać się twórcą gier komputerowych.

Jeżeli jesteś projektantem gier lub masz dobry pomysł na grę, który chciałbyś wcielić w życie, z pomocą przyjdzie Ci ta książka. Dzięki niej błyskawicznie przygotujesz prototyp lub nawet całościowe rozwiązanie! W trakcie lektury nauczysz się projektować gry z wykorzystaniem silnika Unity 3, skryptów w języku C# oraz JavaScriptu. Niezwykle istotne jest to, że książka da Ci solidne podstawy w zakresie rozumienia kluczowych koncepcji związanych z projektowaniem gier - od fizyki świata gry aż do systemu cząstek. Ponadto dowiesz się, jak zapewnić najwyższą wydajność Twoim rozwiązaniom, budować interakcje oraz dzielić się z graczami gotowym rozwiązaniem. Żeby zacząć przygodę z tworzeniem gier, nie musisz posiadać żadnej specjalistycznej wiedzy, wystarczy Ci tylko ta książka! Brzmi kusząco? Spróbuj sam!

Sięgnij po tę książkę, a następnie:

Tylko krok dzieli Cię od własnej gry komputerowej!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Unity 3.x Game Development Essentials Tłumaczenie: Jacek Janusz ISBN: 978-83-246-3984-7 Copyright © Packt Publishing 2011. First published in the English language under the title „Unity 3.x Game Development Essentials”. Polish edition copyright © 2012 by Helion S.A. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/prgun3 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treĂci Przedmowa O autorze O recenzentach WstÚp Rozdziaï 1. Odkryj trzeci wymiar Zapoznanie siÚ z podstawami grafiki 3D WspóïrzÚdne Przestrzeñ modelu i przestrzeñ Ăwiata Wektory Kamery WielokÈty, krawÚdzie, wierzchoïki i siatki Materiaïy, tekstury i procedury cieniowania Fizyka bryïy sztywnej Wykrywanie kolizji Podstawowe pojÚcia zwiÈzane ze Ărodowiskiem Unity Metoda Unity — przykïad Zasoby Sceny Obiekty gry Komponenty Skrypty Prefabrykaty Interfejs Widoki Scene i Hierarchy Panel Inspector 9 11 12 15 21 21 22 22 23 24 25 28 29 29 30 31 32 32 32 33 33 34 35 36 38 Projektowanie gier w Ğrodowisku Unity 3.x Okno Project Widok Game Podsumowanie Rozdziaï 2. Podstawy tworzenia prototypów i skryptów Twój pierwszy projekt w Ărodowisku Unity Podstawowe Ărodowisko prototypowe Definiowanie sceny Dodawanie prostego oĂwietlenia Kolejna cegïa w Ăcianie Zbuduj i zniszcz! Wprowadzenie do tworzenia skryptów Nowy skrypt definiujÈcy zachowanie lub klasÚ Jak wyglÈda od Ărodka dziaïanie skryptu w jÚzyku C#? Jak wyglÈda od Ărodka dziaïanie skryptu w jÚzyku JavaScript? Atakowanie Ăciany Deklarowanie zmiennych publicznych Zrozumienie zasady dziaïania polecenia Translate Implementacja funkcji Translate Testujemy bieĝÈcÈ wersjÚ gry Tworzenie pocisku Przechowywanie obiektów jako prefabrykatów Wystrzelenie pocisku Uĝycie funkcji Instantiate() do konkretyzowania obiektów Przyïoĝenie wektora siïy do bryïy sztywnej Podsumowanie Rozdziaï 3. Tworzenie Ărodowiska Projektowanie gry Uĝycie edytora terenu Opcje menu terenu NarzÚdzie edycji terenu Tworzenie wyspy — sïoñce, morze i piasek Podsumowanie Rozdziaï 4. Postacie w grze i dalsze wykorzystanie skryptów Uĝycie panelu Inspector Znaczniki Warstwy Prefabrykaty i panel Inspector Anatomia postaci Dekonstrukcja obiektu First Person Controller Relacje miÚdzy obiektami nadrzÚdnymi i podrzÚdnymi Obiekt First Person Controller 4 39 40 40 43 44 45 46 47 48 52 53 53 54 56 57 58 62 63 64 65 67 68 68 69 71 73 73 75 76 78 83 101 103 104 105 106 106 107 107 109 109 Dalsze wykorzystanie skryptów Polecenia Zmienne Kompletny przykïad Funkcje Tworzenie wïasnych funkcji Deklarowanie wïasnej funkcji Polecenie if else Warunki wielokrotne Komunikacja miÚdzyskryptowa oraz skïadnia z kropkÈ DostÚp do innych obiektów Find() i FindWithTag() SendMessage() GetComponent Komentarze Skrypt wykonujÈcy operacjÚ poruszania postaciÈ Analiza skryptu Deklaracje zmiennych Podsumowanie Rozdziaï 5. Interakcje ZewnÚtrzne aplikacje modelujÈce Ogólne ustawienia modeli Meshes Normals and Tangents Materials Animations Animation Compression Definiowanie modelu placówki Dodawanie placówki Ustalenie poïoĝenia Obrót Dodanie zderzaczy Dodanie komponentu Rigidbody Dodanie děwiÚku WyïÈczenie automatycznej animacji Kolizje i wyzwalacze Rzucanie promieni Zgubienie klatki Wykrywanie zderzenia z przewidywaniem Otwieranie drzwi placówki Metoda 1. Wykrywanie kolizji Metoda 2. Rzucanie promieni Metoda 3. Wykrywanie kolizji wyzwalajÈcej Podsumowanie Spis treĞci 119 119 120 123 123 125 127 129 131 133 133 133 134 135 138 139 139 140 145 147 147 148 148 149 150 150 151 151 152 153 153 154 156 156 156 157 160 161 162 163 164 179 185 189 5 Projektowanie gier w Ğrodowisku Unity 3.x Rozdziaï 6. Kolekcja, inwentarz i HUD Tworzenie prefabrykatu ogniwa energetycznego Pobieranie, importowanie i umieszczanie Identyfikacja ogniwa energetycznego Skalowanie i obrót zderzacza Dodawanie komponentu Rigidbody Tworzenie skryptu dla ogniwa energetycznego Dodawanie opcji wyzwalajÈcego wykrywania kolizji Zapisywanie obiektu w postaci prefabrykatu Rozrzucanie ogniw energetycznych Inwentarz gracza ZapamiÚtywanie poziomu zasilania Dodawanie funkcji CellPickup() Ograniczenie dostÚpu do placówki Ograniczenie dostÚpu do drzwi za pomocÈ licznika ogniw WyĂwietlacz HUD dla ogniwa energetycznego Importowanie ustawieñ tekstur GUI Tworzenie obiektu GUITexture Umieszczanie tekstury PowerGUI Skrypt do podmiany tekstury Tablice Poinformowanie o otwarciu drzwi Wskazówki dla gracza Pisanie na ekranie za pomocÈ komponentu GUIText Podsumowanie Rozdziaï 7. Konkretyzowanie obiektów i bryïy sztywne Wykorzystywanie konkretyzacji Bryïy sztywne Siïy Komponent Rigidbody Tworzenie minigry Tworzenie prefabrykatu orzecha kokosowego Tworzenie obiektu Launcher Skrypt obsïugujÈcy rzucanie orzechami kokosowymi Koñcowe procedury sprawdzajÈce Ograniczenia konkretyzacji oraz usuwanie obiektów Dodawanie pomieszczenia przeznaczonego do rzucania kokosami Wygrywanie gry Koñcowe usprawnienia Podsumowanie Rozdziaï 8. Systemy czÈstek Co to jest system czÈstek? Particle Emitter Particle Animator Particle Renderer 6 191 194 194 195 195 196 197 198 199 200 200 201 202 204 204 205 206 206 208 208 209 217 221 221 227 229 230 231 232 232 233 234 236 238 247 248 251 266 271 274 277 277 278 278 279 Spis treĞci Definiowanie zadania Uĝyte zasoby Tworzenie sterty gaïÚzi Tworzenie systemów czÈstek dla ogniska Rozpalanie ognia Testowanie i weryfikacja dziaïania A wiÚc jaki mamy problem? Podsumowanie Rozdziaï 9. Projektowanie menu Interfejsy i menu Tworzenie sceny Tworzenie menu za pomocÈ obiektów GUITexture i zdarzeñ myszy Dodawanie przycisku uruchamiania gry Skrypt obsïugujÈcy przycisk klasy GUITexture Wczytywanie scen Przypisywanie zmiennych publicznych Testowanie przycisku Dodawanie przycisku wyĂwietlajÈcego instrukcje Dodawanie przycisku zakoñczenia gry Testowanie skryptów przy uĝyciu poleceñ debugowania Tworzenie menu za pomocÈ klasy GUI Ărodowiska Unity oraz kompozycji graficznych WyïÈczanie obiektów gry Tworzenie menu Podsumowanie Rozdziaï 10. Podstawy animacji Sekwencja animacji po wygraniu gry Metoda tworzenia sekwencji animacji Uruchamianie sekwencji wygrania gry Tworzenie komunikatów informujÈcych o wygraniu gry Animowanie przy uĝyciu interpolacji liniowej Tworzenie obiektu obsïugujÈcego sekwencjÚ zwyciÚstwa Tworzenie skryptu wygaszania ekranu i uĝycie panelu Animation Wczytywanie sekwencji wygrania gry Umieszczanie obiektów GUITexture w warstwach Wyzwanie — zmiana koloru ekranu w scenie Island Podsumowanie Rozdziaï 11. Poprawa wydajnoĂci i koñcowe modyfikacje Ulepszenie terenu i zdefiniowanie poïoĝenia poczÈtkowego gracza Ulepszanie terenu Modyfikacja wzgórz i dolin oraz zastosowanie techniki przenikania tekstur Zdefiniowanie wïaĂciwej Ăcieĝki PoczÈtkowa lokalizacja postaci gracza 280 280 281 283 292 302 303 305 307 308 310 315 315 315 318 319 320 321 321 324 326 326 326 349 351 351 352 354 354 356 358 360 372 373 374 374 375 376 376 377 378 379 7 Projektowanie gier w Ğrodowisku Unity 3.x Optymalizacja wydajnoĂci Pïaszczyzny odcinajÈce i mgïa Odwzorowywanie Ăwiatïa Koñcowe upiÚkszenia Wulkan! Trajektorie lotu orzechów kokosowych Podsumowanie Rozdziaï 12. Budowanie i udostÚpnianie Opcje budowania Web Player Aplikacje samodzielne dla komputerów PC i Mac Widget aplikacji Dashboard dla OS X Ustawienia budowania Ustawienia gracza Ustawienia Cross-Platform Settings Ustawienia Per-Platform Settings Ustawienia jakoĂci Ustawienia wejĂÊ dla gracza Budowanie gry Przystosowanie do wersji sieciowej Pierwsza kompilacja Budowanie dla sieci UdostÚpnianie swoich prac UdostÚpnianie prac na portalu Kongregate.com Podsumowanie Rozdziaï 13. Testy i dalsze zdobywanie wiedzy Nauka poprzez dziaïanie Testowanie i finalizowanie Wykorzystanie uĝytkowników do testowania Sposoby zdobywania wiedzy Studiuj róĝne zagadnienia Nie odkrywaj koïa na nowo JeĂli czegoĂ nie wiesz, pytaj! Podsumowanie Sïowniczek 8 380 380 381 391 391 397 400 401 402 402 404 404 405 406 406 407 411 413 414 414 421 423 428 428 429 431 432 432 433 437 437 438 438 439 441 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: Q tworzenie nowego projektu w Ărodowisku Unity, Q importowanie pakietów z zasobami, Q praca z obiektami gry w widokach Scene (scena) i Hierarchy (hierarchia), Q dodawanie materiaïów, Q tworzenie skryptów w jÚzykach C Sharp (C#) oraz JavaScript, Q zmienne, funkcje i polecenia, Q uĝycie polecenia Translate() w celu przemieszczenia obiektów, Q uĝycie prefabrykatów do przechowywania obiektów, Q uĝycie polecenia Instantiate() w celu konkretyzacji obiektów. Projektowanie gier w Ğrodowisku Unity 3.x 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Èĝce bÚdziemy omawiaÊ opcje, do których majÈ dostÚp uĝytkownicy wersji darmowej. JeĂli uruchomisz Ărodowisko Unity po raz pierwszy, zostanie do niego wczytany przykïadowy projekt. Zapoznawanie siÚ z najlepszymi wzorami, stosowanymi w najwyĝszej jakoĂci projektach, jest bardzo przydatne. Jednakĝe w przypadku poczÈtkujÈcych uĝytkowników przeglÈdanie profesjonalnie utworzonych zasobów i skryptów mogïoby byÊ deprymujÈce, dlatego teĝ 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 poniĝszym 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). 44 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Kliknij przycisk Set1 (umieĂÊ), aby zdefiniowaÊ lokalizacjÚ folderu dla nowego projektu Unity. W niniejszej ksiÈĝce zostaï on nazwany UGDE i umieszczony na pulpicie, by mieÊ do niego ïatwy dostÚp. Kreator projektu pozwala takĝe na zaimportowanie wielu pakietów z zasobami, które sÈ udo- stÚpnione za darmo przez firmÚ Unity Technologies. ZawierajÈ one zïoĝone skrypty, gotowe obiekty i inne elementy graficzne, które sÈ przydatne podczas rozpoczynania pracy z róĝnymi rodzajami projektów. Te pakiety moĝesz takĝe zaimportowaÊ w kaĝdej 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 uĝytkownika), mógïbyĂ równieĝ zaimportowaÊ pakiet znajdujÈcy siÚ w dowolnej lokalizacji na Twoim dysku twardym. Taka funkcjonalnoĂÊ pozwala wspóïdzieliÊ zasoby z innymi uĝytkowni- kami oraz umoĝliwia instalacjÚ pakietów, które uzyskaïeĂ poprzez wybranie opcji Window/Asset Store (okno/sklep z zasobami). Z listy pakietów, które moĝna zaimportowaÊ, wybierz nastÚpujÈce (jak zaprezentowano na powyĝszym rysunku): Q Character Controller (kontroler postaci), Q Skyboxes (skybox — symulacja nieba i horyzontu), Q Terrain Assets (zasoby terenu), Q 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ï obserwowaÊ paski postÚpu, reprezentujÈce import poszczegól- nych pakietów. Podstawowe Ărodowisko prototypowe Aby stworzyÊ proste Ărodowisko, w którym zostanie wygenerowany prototyp okreĂlonej mecha- niki gry, dziaïania powinniĂmy rozpoczÈÊ od zdefiniowania podstawowej listy obiektów — zosta- nie im przypisana funkcjonalnoĂÊ pozwalajÈca graczowi celowaÊ i strzelaÊ do Ăciany skïadajÈcej siÚ z prostych szeĂcianów. Po zakoñczeniu pracy Ărodowisko prototypowe bÚdzie siÚ skïadaÊ z powierzchni zbudowanej z prostych szeĂcianów, kamery pozwalajÈcej na obserwowanie Ăwiata gry w trzech wymiarach oraz ěródïa Ăwiatïa punktowego, umoĝliwiajÈcego podĂwietlenie obszaru, w którym bÚdzie siÚ toczyÊ akcja gry. Wygenerowany Ăwiat powinien wyglÈdaÊ tak jak na poniĝszym rysunku: 1 W wersji dla PC przycisk nazywa siÚ Browse (przeglÈdaj) — przyp. tïum. 45 Projektowanie gier w Ğrodowisku Unity 3.x Definiowanie sceny Poniewaĝ kaĝda 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È takĝe dostÚpne w opcji GameObject/Create Other (obiekt gry/stwórz inny) menu gïównego aplikacji. Obecnie moĝesz zauwaĝyÊ obiekt o nazwie Cube, znajdujÈcy siÚ w panelu Hierarchy. Wybierz go, a póěniej naciĂnij klawisz F2 (PC) lub Return (Mac) albo dwukrotnie z opóěnieniem kliknij nazwÚ obiektu, ĝeby jÈ zmieniÊ. Wprowadě sïowo Floor (powierzchnia), a nastÚpnie naciĂnij klawisz Enter (PC) lub Return (Mac), by zatwierdziÊ wprowadzenie zmian. Ze wzglÚdu na koniecznoĂÊ zapewnienia zgodnoĂci rozpoczniemy tworzenie obiektów w punkcie zerowym Ăwiata, czyli centrum trójwymiarowego Ărodowiska, w którym pracujemy. Aby upewniÊ siÚ, ĝe szeĂcian bÚdÈcy powierzchniÈ zostaï umieszczony dokïadnie w tym miejscu, sprawdě, czy w dalszym ciÈgu jest wybrany w panelu Hierarchy. NastÚpnie zaznacz komponent Transform na panelu Inspector (inspektor) i zwróÊ uwagÚ na to, czy wszystkie wartoĂci wspóïrzÚdnych X, Y i Z sÈ równe zeru. JeĂli tak nie jest, wprowadě 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ïoĝenie). W dalszej kolejnoĂci powinniĂmy przeksztaïciÊ szeĂcian na powierzchniÚ, odpowiednio powiÚk- szajÈc go w osi X i Y. W komponencie Transform przejdě do grupy Scale (skala), a nastÚpnie w polach edycji X i Z wprowadě wartoĂci 100, pozostawiajÈc pole Y równe 1. 46 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Dodawanie prostego oĂwietlenia Postaramy siÚ teraz oĂwietliÊ obszar powierzchni prototypowej poprzez dodanie ěró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ĂÊ ěródïo Ăwiatïa w poïoĝeniu (0, 20, 0), uĝywajÈc w tym celu odpowiednich wartoĂci Posi- tion (pozycja) zawartych w komponencie Transform, dziÚki czemu bÚdzie siÚ ono znajdowaÊ 20 jednostek nad powierzchniÈ. Jak zapewne zauwaĝyïeĂ, oznacza to, ĝe Ăwiatïo nie dociera do caïej powierzchni. PrzeciÈgnij wiÚc ĝóïty punkt, który znajduje siÚ na przeciÚciu linii tworzÈcych zarys Ăwiatïa punktowego w widoku Scene, by uzyskaÊ wartoĂÊ 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, ĝe na obiekcie tworzÈcym powierzchniÚ pojawi siÚ lekka poĂwiata. 47 Projektowanie gier w Ğrodowisku Unity 3.x 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ïoĝonÈ 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, aĝ bÚdziemy dysponowali gotowÈ ĂcianÈ. Tworzenie wzorcowej cegïy Aby uzyskaÊ szablon, pozwalajÈcy na wygenerowanie wszystkich cegieï, musimy utworzyÊ wzor- cowy obiekt, który bÚdzie moĝna póěniej klonowaÊ. Procedura jest nastÚpujÈca: 1. Kliknij przycisk Create, znajdujÈcy siÚ w górnym obszarze panelu Hierarchy, a nastÚpnie wybierz opcjÚ Cube. UĝywajÈc wartoĂci Position w komponencie Transform, umieĂÊ obiekt w poïoĝeniu (0, 1, 0). Upewnij siÚ, czy wciÈĝ jest wybrany w panelu Hierarchy, a nastÚpnie przybliĝ 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, ĝe Twój obiekt bÚdzie od tej pory bryïÈ sztywnÈ, charakteryzujÈcÈ siÚ takimi parametrami, jak masa czy ciÚĝar. Moĝe takĝe oddziaïywaÊ 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ïuĝÈ do uzupeïniania obiektów trójwymiarowych o kolor i teksturÚ. Aby utworzyÊ 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 zmieniÊ 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 otworzyÊ okno dialogowe Color Picker (wybór koloru) (2). BÚdzie ono róĝniÊ siÚ wyglÈdem w zaleĝnoĂci od tego, czy uĝywasz komputera typu Mac lub PC. Po prostu wybierz jakiĂ odcieñ koloru czerwonego, a nastÚpnie zamknij okno. Pole koloru Main Color powinno zostaÊ odpowiednio zaktualizowane. 48 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów 5. Aby uĝyÊ stworzonego materiaïu, przeciÈgnij go z panelu Project i upuĂÊ na szeĂcian znajdujÈcy siÚ w widoku Scene lub nazwÚ obiektu w oknie Hierarchy. Materiaï zostanie uĝyty w komponencie Mesh Renderer (renderer siatki) dla danego obiektu oraz natychmiast zaprezentowany innym jego komponentom w panelu Inspector. Najwaĝniejsze jest jednak to, ĝe Twój szeĂcian powinien byÊ teraz czerwony! Modyfikacja parametrów materiaïu przy uĝyciu opcji Preview (podglÈd), zastosowanej do dowolnego obiektu, spowoduje wprowadzenie rzeczywistych zmian tylko w oryginalnym elemencie, poniewaĝ poprzez tÚ operacjÚ odwoïujemy siÚ do wïaĂciwego zasobu, a nie do nowo utworzonej instancji. 6. Poniewaĝ szeĂcian ma juĝ kolor i wïaĂciwoĂci fizyczne, wynikajÈce z uĝycia komponentu Rigidbody (bryïa sztywna), moĝe zostaÊ sklonowany i utworzyÊ ĂcianÚ zïoĝonÈ z cegieï. Zanim jednak tego dokonamy, przyjrzyjmy siÚ przez chwilÚ prawom fizycznym dziaïajÈcym w przestrzeni 3D. Upewnij siÚ, ĝe szeĂcian zostaï wybrany, a nastÚpnie przypisz parametrowi Y Position (poïoĝenie Y) wartoĂÊ 15, zaĂ X Rotation (rotacja X) wartoĂÊ 40. Obie te wïaĂciwoĂci naleĝÈ 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Ă zobaczyÊ spadajÈcy szeĂcian, który pod kÈtem uderza o powierzchniÚ i po wykonaniu póïobrotu zatrzymuje siÚ. 49 Projektowanie gier w Ğrodowisku Unity 3.x 7. NaciĂnij przycisk Play ponownie, aby zatrzymaÊ symulacjÚ. Nie naciskaj przycisku Pause, poniewaĝ spowodowaïoby to tylko tymczasowe zatrzymanie animacji, natomiast póěniejsze zmiany w scenie nie zostaïyby zapamiÚtane. 8. PrzywróÊ poprzednie ustawienia dla szeĂcianu: parametrowi Y Position przypisz wartoĂÊ 1, a X Rotation — wartoĂÊ 0. SprawdziïeĂ, ĝe cegïa zostaïa poprawnie zdefiniowana i dziaïa zgodnie z oczekiwaniami. Moĝesz wiÚc rozpoczÈÊ tworzenie rzÚdu cegieï, z których bÚdzie siÚ skïadaÊ nasza Ăciana. I pstryk! Mamy rzÈd Aby uïatwiÊ rozmieszczanie obiektów, Ărodowisko Unity pozwala na uĝycie opcji przyciÈgania. Parametry opcji przyciÈgania mogÈ byÊ modyfikowane w opcji menu Edit/Snap Settings (edy- cja/ustawienia opcji przyciÈgania). Aby zastosowaÊ opcjÚ przyciÈgania, przytrzymaj naciĂniÚty klawisz Control (PC) lub Command (Mac) podczas uĝywania narzÚdzia Translate (W) w celu rozmieszczenia obiektów w widoku Scene. By rozpoczÈÊ budowÚ Ăciany, przy uĝyciu skrótu klawiszowego Ctrl+D (PC) lub Com- mand+D (Mac) skopiuj obiekt cegïy, którym juĝ 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, aĝ znajdzie siÚ w bezpoĂrednim sÈsiedztwie innej, tak jak przedsta- wiono na poniĝszym rysunku: 50 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Powtarzaj procedurÚ kopiowania i rozmieszczania przy uĝyciu siatki przyciÈgania aĝ do momentu, gdy bÚdziesz dysponowaÊ rzÚdem dziesiÚciu cegieï. Aby przyspieszyÊ 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ĂÊ go w poïoĝeniu (4.5, 0.5, -1) przy uĝyciu komponentu Transform z panelu Inspector. Zmieñ jego nazwÚ na CubeHolder. Zaznacz wszystkie szeĂciany w panelu Hierarchy: wybierz szeĂcian znajdujÈcy siÚ najwyĝej, przytrzymaj klawisz Shift, a nastÚpnie wybierz szeĂcian najniĝszy. W dalszej kolejnoĂci prze- ciÈgnij zaznaczony zbiór szeĂcianów do pustego obiektu CubeHolder, znajdujÈcego siÚ w panelu Hierarchy, aby uczyniÊ go obiektem nadrzÚdnym. Po wykonaniu tej operacji widok Hierarchy powinien siÚ przedstawiaÊ nastÚpujÈco: Moĝesz zauwaĝyÊ, ĝe obok nazwy obiektu nadrzÚdnego pojawiïa siÚ ikona w postaci strzaïki. Oznacza to, ĝe moĝesz jÈ kliknÈÊ, co spowoduje rozwiniÚcie i zwiniÚcie listy z obiektami pod- rzÚdnymi. Aby zaoszczÚdziÊ miejsce w panelu Hierarchy, kliknij strzaïkÚ, by ukryÊ 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, moĝemy go w prosty sposób zduplikowaÊ poprzez przeciÈgniÚcie z uĝyciem opcji przyciÈgania w osi Y. Tak jak poprzednio uĝyj skrótu klawiszowego sïuĝÈcego do klonowania (PC: Ctrl+D, Mac: 51 Projektowanie gier w Ğrodowisku Unity 3.x Command+D), a nastÚpnie wybierz narzÚdzie Translate (W) i zastosuj technikÚ przeciÈgania z przyciÈganiem (PC: Ctrl, Mac: Command), by przemieĂciÊ rzÈd cegieï w górÚ o jednÈ jed- nostkÚ za pomocÈ zielonego uchwytu osi Y. Powtarzaj powyĝszÈ procedurÚ, aĝ utworzysz osiem rzÚdów cegieï umieszczonych jeden nad drugim. ¥ciana powinna wyglÈdaÊ jak na poniĝszym rysunku. ZwróÊ uwagÚ na to, ĝe 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 moĝe przemieszczaÊ kamerÚ i wystrzeliwaÊ pociski w kierunku Ăciany, by jÈ zburzyÊ. 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Ú takĝe, ĝe wszystkie parametry zwiÈzane z obrotem sÈ równe zeru. 52 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Wprowadzenie do tworzenia skryptów Aby rozpoczÈÊ naukÚ programowania, przyjrzymy siÚ prostemu przykïadowi, definiujÈcemu tÚ samÈ funkcjonalnoĂÊ w jÚzykach C Sharp (C#) oraz JavaScript, podstawowych dla projektantów wykorzystujÈcych Ărodowisko Unity. Moĝna równieĝ tworzyÊ skrypty oparte na jÚzyku Boo, lecz sÈ one rzadko uĝywane, 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 takĝe przycisk Open (otwórz), którego klikniÚcie powoduje otwarcie skryptu w domyĂlnym edytorze o nazwie Monodevelop. Moĝesz go takĝe otworzyÊ, klikajÈc dwukrotnie jego ikonÚ w panelu Project. Nowy skrypt definiujÈcy zachowanie lub klasÚ Bez wzglÚdu na to, czy zdecydujesz siÚ na jÚzyk C#, czy JavaScript, przydatne bÚdzie prze- czytanie obu dalszych fragmentów, poniewaĝ zawierajÈ on ogólne informacje o tworzeniu skryptów i mogÈ równieĝ pomóc w podjÚciu decyzji o wyborze okreĂlonego jÚzyka. W terminologii Ărodowiska Unity kaĝdy 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 moĝna mieÊ dostÚp poprzez jej nazwÚ. Na przykïad klasa o nazwie Pies mogïaby zawieraÊ 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È byÊ opisane jako zmienne, natomiast dziaïania mogÈ zostaÊ zdefiniowane w postaci funkcji, zwanych takĝe metodami. Aby odwoïaÊ siÚ do zmiennej rasa, która jest wïaĂciwoĂciÈ klasy Pies, moglibyĂmy podaÊ nazwÚ klasy, nastÚpnie uĝyÊ znaku kropki, a wreszcie wprowadziÊ nazwÚ zmiennej: Pies.rasa; Do wywoïania funkcji klasy Pies moglibyĂmy zastosowaÊ poniĝszy zapis: Pies.przyniesPatyk(); 53 Projektowanie gier w Ğrodowisku Unity 3.x Funkcje moĝemy równieĝ wywoïywaÊ z argumentami — nie majÈ one jednak nic wspólnego z tymi, których uĝywamy codziennie podczas dyskusji z innymi osobami! Przyjmij zaïoĝenie, ĝe argumenty pozwalajÈ na modyfikowanie dziaïania funkcji. Na przykïad w przypadku funkcji przyniesPatyk moglibyĂmy uĝyÊ argumentu, który definiuje, jak szybko pies powinien przynieĂÊ patyk. Jej wywoïanie mogïoby wyglÈdaÊ tak: Pies.przyniesPatyk(25); Mimo ĝe zaprezentowane wyĝej przykïady sÈ abstrakcyjne, czÚsto pozwalajÈ odwzorowaÊ kod programu na sytuacje wziÚte z ĝycia, co sprawia, ĝe nabierajÈ sensu. Podczas czytania tej ksiÈĝki postaraj siÚ do nich wracaÊ. Moĝesz takĝe tworzyÊ wïasne odwzorowania, co pozwoli Ci lepiej zrozumieÊ 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 moĝesz uĝyÊ w okreĂlonym miejscu w swojej grze. Jak wyglÈda od Ărodka dziaïanie skryptu w jÚzyku C#? Gdy w Ărodowisku Unity utworzysz nowy skrypt w jÚzyku C#, od razu otrzymasz pewien kod, którego moĝesz uĝyÊ: 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- waÊ takÈ nazwÚ skryptu, która bÚdzie odpowiadaÊ nazwie zadeklarowanej w nim klasy. Na poczÈtku dokumentu widzimy zapis public class NewBehaviourScript : MonoBehaviour {, poniewaĝ NewBehaviourScript jest domyĂlnÈ nazwÈ, nadawanÈ przez Ărodowisko Unity kaĝdemu nowo utworzonemu skryptowi. JeĂli w panelu Project zmienisz nazwÚ skryptu, system Unity automatycznie zmieni takĝe nazwÚ zdefiniowanej w nim klasy. 54 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Kod skïadajÈcy siÚ 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 koñczyÊ siÚ zamykajÈcym nawiasem klamrowym }, znajdujÈcym siÚ na koñcu skryptu. Podczas analizowania poleceñ 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È byÊ uĝywane w celu uruchomienia róĝnych opcji silnika gry. Dwie z nich sÈ szczególnie waĝne 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: Q Start(): Zostaje ona wywoïana przy pierwszym uruchomieniu sceny, dlatego jest czÚsto uĝywana (jak wynika z sugestii zawartej w kodzie) w celach inicjalizacyjnych. Na przykïad mógïbyĂ dysponowaÊ zmiennÈ przechowujÈcÈ wynik, której musi zostaÊ przypisana wartoĂÊ 0 podczas rozpoczynania gry. W funkcji Start() mogïaby takĝe zostaÊ wywoïana procedura, która umieszcza postaÊ gracza we wïaĂciwym miejscu gry na poczÈtku danego poziomu. Q Update(): Poniewaĝ stany róĝnych elementów gry mogÈ siÚ zmieniaÊ w trakcie jej trwania, funkcja ta jest wywoïywana w kaĝdej iteracji podczas dziaïania Twojego programu i jest odpowiedzialna za ich sprawdzanie. Zmienne w jÚzyku C# Aby zapamiÚtaÊ informacjÚ w zmiennej jÚzyka C#, naleĝy uĝyÊ nastÚpujÈcej skïadni: typDanych nazwaZmiennej = wartoĂÊ; Na przykïad: int currentScore = 5; 55 Projektowanie gier w Ğrodowisku Unity 3.x lub: float currentVelocity = 5.86f; ZwróÊ uwagÚ na to, ĝe w powyĝszych przykïadach uĝyto danych numerycznych: int oznacza liczbÚ caïkowitÈ, natomiast float liczbÚ zmiennoprzecinkowÈ. Ten drugi przypadek wymaga dodatkowo w jÚzyku C# umieszczenia litery f po wartoĂci samej liczby. Róĝni siÚ to w pewien sposób od skïadni uĝywanej 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 jÚzyku JavaScript? Nowo utworzony plik w jÚzyku JavaScript zawiera mniej danych niĝ odpowiadajÈcy mu plik jÚzyka C#, poniewaĝ caïy skrypt jest uwaĝany za definicjÚ klasy. Zakïada siÚ, ĝe znajdujÈce siÚ w nim treĂci zawierajÈ siÚ miÚdzy niewidocznymi dla uĝytkownika znacznikami otwierajÈcymi i zamykajÈcymi klasÚ, gdyĝ sama jej deklaracja jest ukryta. Moĝesz takĝe zauwaĝyÊ, ĝe wiersze using UnityEngine; i using System.Collections; sÈ rów- nieĝ 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 uĝycia sïowa kluczowego function przed jej nazwÈ. Deklaracje zmiennych i innych elementów skryptu sÈ takĝe zapisy- wane w odmienny sposób — w kolejnych punktach zapoznamy siÚ z odpowiednimi przykïadami. Zmienne w jÚzyku JavaScript Skïadnia sïuĝÈca do deklarowania zmiennych w jÚzyku JavaScript wyglÈda nastÚpujÈco: var nazwaZmiennej : TypDanych = wartoĂÊ; Jak widaÊ, deklaracja jest zawsze poprzedzona sïowem kluczowym var. Na przykïad: var currentScore : int = 0; lub: var currentVelocity : float = 5.86; Jak zapewne zauwaĝyïeĂ, typ float, inaczej niĝ 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óĝnych jÚzykach bÚdziesz takĝe mógï stwierdziÊ, ĝe 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È byÊ uĝywane. 56 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Komentarze Zarówno w jÚzyku C#, jak i w JavaScript moĝesz tworzyÊ komentarze za pomocÈ nastÚpujÈcych konstrukcji: // dwa ukoĂniki oznaczajÈ pojedynczy wiersz komentarza lub: /* ukoĂnik i gwiazdka rozpoczynajÈ komentarz zawierajÈcy siÚ w wielu wierszach. Jego zakoñczeniem sÈ gwiazdka i ukoĂnik */ Podczas czytania tej ksiÈĝki komentarze mogÈ pomóc Ci przypomnieÊ sobie zasadÚ dziaïania tworzonych przez Ciebie fragmentów kodu. PamiÚtaj, ĝe komentarze nie wykonujÈ siÚ, dlatego moĝesz w nich umieszczaÊ dowolne teksty, wïÈczajÈc w to równieĝ wiersze kodu. Dopóki bÚdÈ siÚ one zawieraÊ 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Ú, ĝe Twoja deklaracja klasy znajdujÈca siÚ wewnÈtrz skryptu odpowiada jego nazwie: public class Shooter : MonoBehaviour { Jak wczeĂniej wspomniano, uĝytkownicy wykorzystujÈcy jÚzyk JavaScript nie bÚdÈ musieli sto- sowaÊ siÚ do powyĝszej reguïy. By zastosowaÊ 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: Q bullet: ta zmienna jest typu Rigidbody, poniewaĝ przechowuje odwoïanie do obiektu o wïaĂciwoĂciach fizycznych, który zostanie przez nas utworzony; Q power: jest to zmienna o typie zmiennoprzecinkowym, którÈ wykorzystamy w celu ustalenia siïy strzaïu; Q moveSpeed: kolejna zmienna o typie zmiennoprzecinkowym, której uĝyjemy, by zdefiniowaÊ prÚdkoĂÊ poruszania kamerÈ za pomocÈ klawiszy strzaïek. Powyĝsze zmienne muszÈ byÊ skïadowymi z dostÚpem publicznym, co pozwoli je wyĂwietliÊ w panelu Inspector w postaci modyfikowanych ustawieñ. Za chwilÚ zobaczysz, jak to dziaïa! 57 Projektowanie gier w Ğrodowisku Unity 3.x Deklarowanie zmiennych publicznych Waĝne jest, by zrozumieÊ dziaïanie zmiennych o dostÚpie publicznym, poniewaĝ pozwala on na odwoïywanie siÚ do nich z innych skryptów. Ma to znaczenie podczas projektowania gier, gdyĝ umoĝliwia definiowanie prostszej komunikacji miÚdzyobiektowej. Zmienne publiczne sÈ takĝe przydatne z tego wzglÚdu, ĝe wystÚpujÈ w postaci ustawieñ, które moĝna wizualnie mody- fikowaÊ w panelu Inspector, gdy tylko skrypt zostanie przypisany do obiektu. Zmienne pry- watne zachowujÈ siÚ przeciwnie — zostaïy zaprojektowane, by byÊ dostÚpne tylko z poziomu skryptu, klasy lub funkcji, w których sÈ zdefiniowane. Nie pojawiajÈ siÚ równieĝ w postaci ustawieñ w panelu Inspector. JÚzyk C#: Zanim rozpoczniemy dziaïania, usuniemy funkcjÚ Start() ze skryptu, poniewaĝ nie bÚdziemy jej uĝywaÊ. W tym celu po prostu skasuj tekst void Start { }. Aby stworzyÊ wymagane zmienne, umieĂÊ poniĝszy fragment kodu w swoim skrypcie poniĝej 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óÊ uwagÚ na to, ĝe w powyĝszym przykïadzie usunÚliĂmy domyĂlne komentarze, by zaosz- czÚdziÊ miejsce. JÚzyk JavaScript: Aby stworzyÊ zmienne o dostÚpie publicznym w jÚzyku JavaScript, musisz siÚ upewniÊ, ĝe zostanÈ one zadeklarowane poza istniejÈcymi funkcjami. Naleĝy je po prostu umieĂciÊ na samej górze skryptu. Zadeklaruj wiÚc trzy wymagane zmienne, wstawiajÈc poniĝszy 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ï zostaÊ uĝyty w grze, musi byÊ przypisany jako komponent do jednego z obiek- tów gry znajdujÈcych siÚ w istniejÈcej scenie. 58 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Zapisz skrypt, wybierajÈc z gïównego menu edytora opcjÚ File/Save (plik/zapisz), a nastÚpnie wróÊ do Ărodowiska Unity. Oferuje ono kilka sposobów przypisywania skryptu do obiektu: 1. PrzeciÈgnij go z panelu Project i upuĂÊ na nazwie obiektu w panelu Hierarchy. 2. PrzeciÈgnij go z panelu Project i upuĂÊ na wizualnÈ reprezentacjÚ obiektu w panelu Scene. 3. Wybierz obiekt, dla którego chcesz przypisaÊ skrypt. NastÚpnie przeciÈgnij i upuĂÊ skrypt w niezajÚtym obszarze w widoku Inspector tego obiektu. 4. Wybierz obiekt, do którego chcesz przypisaÊ 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, poniewaĝ przeciÈganie skryptu do kamery w widoku Scene mogïoby byÊ uciÈĝ- liwe z tego powodu, ĝe nie zawiera ona wyraěnego obszaru, na którym moĝna by go upuĂciÊ. PrzeciÈgnij wiÚc nowy skrypt Shooter z panelu Project i upuĂÊ go na nazwie Main Camera, znajdujÈcej siÚ w panelu Hierarchy, co spowoduje jego przypisanie. BÚdziesz mógï zauwaĝyÊ, ĝe skrypt zostanie wyĂwietlony jako nowy skïadnik poniĝej istniejÈcego komponentu Audio Listener. W panelu Inspector stwierdzisz takĝe istnienie trzech zmiennych publicznych: Bullet, Power i Move Speed: Jak moĝesz zauwaĝyÊ, Ă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. Moĝna równieĝ stwierdziÊ, ĝe zmienna Bullet nie zostaïa jeszcze zainicjalizowana, lecz ocze- kuje siÚ, iĝ obiekt, który zostanie do niej przypisany, bÚdzie uĝywaï komponentu bryïy sztywnej (Rigidbody). CzÚsto 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 bÚdziemy mogli siÚ odwoïywaÊ jedynie do wïaĂciwoĂci i funkcji klasy o tej wïaĂnie nazwie. Nie stanowi to jednak problemu — po prostu sprawia, ĝe skrypt staje siÚ bardziej efektywny niĝ w przypadku, gdybyĂmy odwoïywali siÚ do caïej klasy GameObject. Aby dowiedzieÊ siÚ wiÚcej na ten temat, zapoznaj siÚ z dokumentacjÈ zwiÈzanÈ z oprogramowaniem skryptowym dotyczÈcym 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 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ĂÊ. WróÊ wiÚc z powrotem do edytora, do którego zostaï on wczytany. Poruszanie kamerÈ Teraz wykorzystamy zmiennÈ moveSpeed oraz odczytamy stan klawiatury, aby poruszaÊ kamerÈ i faktycznie stworzyÊ prosty mechanizm celowania dla strzaïu. BÚdzie on polegaÊ na ustawianiu kamery w kierunku miejsca, w które bÚdziemy strzelali. Poniewaĝ chcielibyĂmy uĝywaÊ klawiszy strzaïek na klawiaturze, musimy siÚ najpierw dowie- dzieÊ, w jaki sposób w kodzie moĝna siÚ do nich odwoïywaÊ. ¥rodowisko Unity wykorzystuje wiele sygnaïów wejĂciowych, które moĝna obserwowaÊ i modyfikowaÊ przy uĝyciu menedĝera wejĂÊ (Input Manager) — patrz menu Edit/Project Settings/Input (edycja/ustawienia pro- jektu/wejĂcie). Jak widaÊ na poniĝszym 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ĂÊ 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 miaïoby to miejsce podczas uĝywania sprÚĝystego joysticka analogowego, znajdujÈcego siÚ w urzÈdzeniu typu gamepad. Poniewaĝ typ Input jest równieĝ nazwÈ klasy, a wszystkie nazwane elementy w menedĝerze wejĂÊ sÈ osiami lub przyciskami, w skrypcie moĝemy uĝyÊ nastÚpujÈcego zapisu: Input.GetAxis( Horizontal ); Powyĝszy wiersz pozwala na odczytanie bieĝÈcej wartoĂci przycisków poziomych, zawierajÈcej siÚ w zakresie od -1 do 1 w zaleĝnoĂci od tego, co jest naciskane przez uĝytkownika. Zastosujmy go w naszym skrypcie, uĝywajÈc zmiennych lokalnych do reprezentowania osi. DziÚki temu moĝemy póěniej zmodyfikowaÊ wartoĂÊ zmiennej, uĝywajÈc operacji mnoĝenia, dziÚki czemu uzyskamy maksymalnÈ wartoĂÊ wiÚkszÈ od 1. Pozwoli nam to na przemieszczanie kamery z prÚdkoĂciÈ wiÚkszÈ niĝ jedna jednostka na iteracjÚ. DostÚpu do tej zmiennej nie musimy mieÊ w panelu Inspector, poniewaĝ samo Ărodowisko Unity bÚdzie przypisywaÊ jej odpowiednie wartoĂci w zaleĝnoĂci od stanu sygnaïów wejĂciowych. Wynika stÈd, ĝe powinna ona zostaÊ zdefiniowana jako zmienna lokalna. 60 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Zmienne lokalne, prywatne i publiczne Zanim bÚdziemy kontynuowaÊ prace zwiÈzane z tworzeniem skryptu, zapoznajmy siÚ ze zmien- nymi lokalnymi, prywatnymi i publicznymi: Q 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È. Q 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. Q Zmienne publiczne. SÈ tworzone na zewnÈtrz funkcji, dostÚp do nich majÈ wszystkie funkcje danej klasy, a takĝe inne skrypty. Zmienne publiczne sÈ widoczne w panelu Inspector i mogÈ byÊ tam modyfikowane. Zmienne lokalne i odczytywanie wejĂÊ Tworzenie zmiennych lokalnych w jÚzykach C# i JavaScript zostaïo przedstawione w poniĝ- szych fragmentach kodu: 61 Projektowanie gier w Ğrodowisku Unity 3.x JÚzyk C#: void Update () { float h = Input.GetAxis( Horizontal ) * Time.deltaTime * moveSpeed; float v = Input.GetAxis( Vertical ) * Time.deltaTime * moveSpeed; JÚzyk 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 zostaÊ dowolnie nazwane, jednakĝe uĝywanie pojedynczych liter jest po prostu szybsze. Ogólnie mówiÈc, zazwy- czaj powinno siÚ tworzyÊ standardowe nazwy, poniewaĝ niektóre pojedyncze litery nie mogÈ byÊ uĝywane. Na przykïad nazwy zmiennych x, y i z sÈ uĝywane do przechowywania wartoĂci wspóïrzÚdnych i dlatego teĝ zarezerwowano je wyïÈcznie do tych zastosowañ. Poniewaĝ wartoĂci osi mogÈ zawieraÊ siÚ w przedziale od -1 do 1, zmienne sÈ liczbami dziesiÚt- nymi i musimy je deklarowaÊ z uĝyciem typu zmiennoprzecinkowego. Mnoĝy siÚ je nastÚpnie 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 wywoïania funkcji Update()). Wynika stÈd, iĝ wartoĂÊ osiÈga pewnÈ spójnÈ wielkoĂÊ na sekundÚ, niezaleĝnie od szybkoĂci klatek. W kolejnym kroku zwiÚkszamy wartoĂÊ wynikowÈ, mnoĝÈc jÈ przez zmiennÈ publicznÈ, którÈ utworzyliĂmy wczeĂniej, czyli moveSpeed. Oznacza to, ĝe mimo iĝ wartoĂci h i v sÈ zmiennymi lokalnymi, moĝemy wciÈĝ na nie wpïywaÊ poprzez modyfikowanie zmiennej publicznej moveSpeed, dostÚpnej w panelu Inspector, poniewaĝ jest ona skïadnikiem uĝywanego przez nas równania. Jest to czÚsto spotykane rozwiÈzanie podczas tworzenia skryptów, gdyĝ wykorzystuje ono zaletÚ uĝycia publicznie dostÚpnych ustawieñ poïÈczonych z okreĂlonymi wartoĂciami generowanymi przez funkcjÚ. Zrozumienie zasady dziaïania polecenia Translate Aby rzeczywiĂcie uĝyÊ stworzonych zmiennych w celu przemieszczenia obiektu, musimy zasto- sowaÊ polecenie Translate. Podczas implementowania dowolnego fragmentu kodu musisz byÊ pewien, ĝe rozumiesz jego dziaïanie. Translate jest poleceniem pochodzÈcym z klasy Transform: http://unity3d.com/support/ documentation/ScriptReference/Transform.html. 62 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Jest to klasa informacji przechowujÈca wïaĂciwoĂci poïoĝenia, obrotu i skali danego obiektu. Zawiera ona równieĝ funkcje, które mogÈ byÊ uĝywane w celu jego przemieszczania lub obracania. Oczekiwane uĝycie funkcji Translate wyglÈda nastÚpujÈco: Transform.Translate(Vector3); Istnienie parametru Vector3 oznacza, ĝe funkcja Translate wymaga jego uĝycia 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, uĝywajÈc utworzonych przez nas wartoĂci wejĂciowych h i v i umieszczajÈc je w parametrze Vector3. JÚzyki C# i JavaScript: UmieĂÊ poniĝszy wiersz kodu wewnÈtrz funkcji Update() w Twoim skrypcie, a dokïadniej pomiÚ- dzy jej otwierajÈcym { i zamykajÈcym } nawiasem klamrowym. ZwróÊ uwagÚ na to, ĝe zapis wyglÈda identycznie w obu jÚzykach: transform.Translate(h, v, 0); Moĝemy tu skorzystaÊ ze sïowa transform, poniewaĝ wiemy, ĝe dowolny obiekt, któremu udostÚpnimy skrypt, bÚdzie wykorzystywaÊ komponent Transform. PrzyïÈczone komponenty danego obiektu mogÈ byÊ adresowane poprzez uĝycie 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 wykorzystywaÊ powyĝszej 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 uĝyjemy bieĝÈcej wartoĂci zmiennej h dla osi X oraz v dla osi Y, natomiast osi Z przekaĝemy po prostu wartoĂÊ 0, poniewaĝ nie chcemy siÚ przesuwaÊ do przodu ani do tyïu. Zapisz teraz swój skrypt, uĝywajÈc opcji menu gïównego File/Save (plik/zapisz), a nastÚpnie wróÊ 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Ú upewniaÊ, ĝe zapamiÚtujesz sceny w tym folderze, poniewaĝ w przeciwnym razie 63 Projektowanie gier w Ğrodowisku Unity 3.x nie bÚdziesz miaï do nich dostÚpu z panelu Project (projekt). By zapewniÊ idealny porzÈdek, moĝesz takĝe utworzyÊ podkatalog wewnÈtrz folderu Assets, w którym bÚdziesz przechowywaÊ swoje sceny. Takie dziaïanie nie jest jednak wymagane, lecz ogólnie uwaĝa siÚ je za dobry wzo- rzec postÚpowania. Testujemy bieĝÈcÈ wersjÚ gry W Ărodowisku Unity moĝesz testowaÊ grÚ w kaĝdym momencie, przy zaïoĝeniu, ĝe skrypty nie zawierajÈ ĝadnych bïÚdów. JeĂli w skryptach wykryto jakieĂ problemy, bÚdziesz musiaï je roz- wiÈzaÊ przed uĝyciem trybu grania. Gdy bïÚdy zostanÈ naprawione, pasek Console (konsola), znajdujÈcy siÚ na dolnej krawÚdzi interfejsu Unity, nie bÚdzie zawieraÊ ĝadnych informacji. Pasek Console wyĂwietla najnowsze wpisy pojawiajÈce siÚ w konsoli Unity. Moĝesz jÈ wyĂwietliÊ, 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). Kaĝdy bïÈd zostanie wyĂwietlony na czerwono. Dwukrotne jego klikniÚcie umoĝliwi wyĂwietlenie odpowiedniego fragmentu skryptu, który spowodowaï pojawienie siÚ problemu. WiÚkszoĂÊ bïÚdów polega na pominiÚciu jakiegoĂ znaku lub bïÚdnym zapisie, dlatego teĝ 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ĂÊ do trybu grania. BÚdziesz mógï poruszaÊ 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 poniĝszym rysunku. Gdy przetestowaïeĂ juĝ grÚ i upewniïeĂ siÚ, ĝe dziaïa poprawnie, ponownie naciĂnij przycisk Play, aby opuĂciÊ 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 moĝliwoĂÊ wystrzeliwania poci- sków w kierunku Ăciany, aby jÈ zburzyÊ. 64 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów Tworzenie pocisku Aby wystrzeliÊ pocisk w kierunku Ăciany, musimy w ramach bieĝÈcej sceny najpierw go utwo- rzyÊ, a nastÚpnie zapamiÚtaÊ 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ównieĝ moĝliwy za pomocÈ opcji menu gïównego GameObject/Create/Other (obiekt gry/utwórz/inny). Teraz upewnij siÚ, ĝe utworzona przez Ciebie kula zostaïa zaznaczona w panelu Hierarchy, a póěniej przemieĂÊ kursor myszy na widok Scene (scena) i naciĂnij klawisz F, by skoncentrowaÊ siÚ na wybranym obiekcie. 65 Projektowanie gier w Ğrodowisku Unity 3.x 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), moĝesz zauwaĝyÊ, ĝe 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ïuĝy do modyfikowania ksztaïtu. 2. Renderer (renderer). Sïuĝy do modyfikowania wyglÈdu. 3. Collider (zderzacz). Sïuĝy do zarzÈdzania interakcjami (zwanymi kolizjami) z innymi obiektami. Tworzenie i przypisywanie materiaïu WyglÈd pocisku da siÚ zmodyfikowaÊ poprzez stworzenie materiaïu, który moĝemy przekazaÊ do renderera. Gdy chcesz zmieniÊ wyglÈd obiektu, powinieneĂ najczÚĂciej odszukaÊ 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 zachowaÊ porzÈdek, utworzymy nowy podkatalog wewnÈtrz folderu Assets. BÚdziemy w nim przechowywaÊ wszystkie materiaïy uĝywane w bieĝÈ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ĂÊ 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Ú, ĝe 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Ă zmieniÊ na bulletColor lub podobnÈ, przypominajÈcÈ Ci, ĝe powinien on zostaÊ przypisany do pocisku. 2. MajÈc 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 3. Po wybraniu koloru przeciÈgnij materiaï bulletColor z panelu Project i upuĂÊ 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 zapewniÊ to, ĝe silnik fizyczny bÚdzie mógï sterowaÊ 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È byÊ modyfikowane w panelu Inspector. Na potrzeby obecnego prototypu nie musimy jednak niczego zmieniaÊ. Przechowywanie obiektów jako prefabrykatów Poniewaĝ powinniĂmy wystrzeliwaÊ pocisk w chwili, gdy gracz naciĂnie jakiĂ klawisz, nie chcemy, aby znajdowaï siÚ on caïy czas w scenie. Zamiast tego powinien byÊ przechowywany i konkretyzowaÊ siÚ dopiero podczas naciskania klawisza. Z tego powodu bÚdziemy zapisywaÊ nasz obiekt w postaci prefabrykatu, a nastÚpnie uĝywaÊ 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óěniej 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. 67 Projektowanie gier w Ğrodowisku Unity 3.x 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ĂÊ go na folder Prefabs w panelu Project. PrzeciÈgniÚcie obiektu gry w dowolny obszar panelu Project spowoduje, ĝe 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. Moĝesz juĝ usunÈÊ 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óÊmy 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). Uĝyjemy wczeĂniej zadeklarowanej zmiennej bullet, bÚdÈcej odwoïaniem do okreĂlonego obiektu, który zamierzamy skonkretyzowaÊ. Gdy tylko obiekt zostanie utworzony z prefabrykatu, zastosujemy odpowiednie dziaïanie, aby wystrzeliÊ go w kierunku Ăciany znajdujÈcej siÚ w scenie. W funkcji Update() po wierszu transform.Translate(h, v, 0) dodaj nastÚpujÈcy kod, niezaleĝ- nie od tego, jakiego jÚzyka programowania uĝywasz: 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. Moĝesz go jed- nak przypisaÊ do innego klawisza, wprowadzajÈc odpowiedniÈ modyfikacjÚ w menedĝerze wejĂÊ, co moĝna zrobiÊ 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ĂÊ nastÚpujÈcy wiersz kodu: 68 Rozdziaá 2. • Podstawy tworzenia prototypów i skryptów JÚzyk C#: Rigidbody instance = Instantiate(bullet, transform.position, ´transform.rotation) as Rigidbody; JÚzyk JavaScript: var instance: Rigidbody = Instantiate(bullet, transform.position, ´transform.rotation); Jak widaÊ, 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 naleĝy stworzyÊ, gdzie naleĝy stworzyÊ, wielkoĂÊ obrotu); W naszym przypadku chcemy, aby zostaïa utworzona instancja obiektu lub prefabrykatu, który zostaï przypisany do zmiennej publicznej bullet. Poïoĝenie i obrót instancji pobierzemy z komponentu transform, uĝywanego w obiekcie, do którego zostaï przydzielony skrypt, czyli Main Camera. Dlatego teĝ w skryptach bÚdziesz mógï czÚsto zauwaĝyÊ zapis transform.position, odnoszÈcy siÚ do ustawieñ zwiÈzanych z komponentem transform i dotyczÈcy poïoĝenia obiektu, do którego zostaï przyïÈczony dany skrypt. Zauwaĝ, ĝe w jÚzyku C# musisz umieĂciÊ sïowo Rigidbody za wywoïaniem funkcji Instantiate, aby jawnie wskazaÊ typ danych. Przyïoĝenie wektora siïy do bryïy sztywnej Po utworzeniu obiektu musimy go natychmiast wystrzeliÊ, uĝywajÈ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ïoĝymy wektor siïy, musimy stworzyÊ referencjÚ do kierunku, w którym chcemy strzelaÊ. Kamera jest zwrócona w stronÚ Ăciany z cegieï, wiÚc sensowne jest, by oddawaÊ strzaïy w tym wïaĂnie kierunku. Poniĝej wiersza zawierajÈcego funkcjÚ Instantiate(), a jednoczeĂnie wciÈĝ w obrÚbie polecenia if, umieĂÊ nastÚpujÈcy kod: JÚzyk C#: Vector3 fwd = transform.TransformDirection(Vector3.forward); JÚzyk 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 transf
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Projektowanie gier w środowisku Unity 3.x
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: