Gra typu Balance cz.2

Pora zacząć pisać skrypt obsługujący naszą scenę. Do tego celu będziemy wykorzystywać skrypty typu JavaScript. Aby utworzyć nowy skrypt kliknij zakładkę Assets>Create>JavaScript:



W widoku projektu został utworzony nowy skrypt o nazwie NewBehaviourScript (widok projektu zawiera wszystkie elementy które stworzyliśmy lub zaimportowaliśmy do programu, dzięki temu możemy je bez problemu przeciągać na widok Hierarchiczny, w celu wykorzystania w naszych obiektach).

Zmieniamy nazwę naszego skryptu na glownyskrypt:


Teraz przeciągamy go do MainCamera w widoku Hierarchicznym. Dodajemy skrypt do naszej kamery a nie na przykład do jednego z naszych kwadratów dlatego, że kiedy gra będzie w bardziej zaawansowanej fazie i będziemy mogli usuwać kwadraty po naciśnięciu na nie, wtedy kwadrat który posiadał nasz główny skrypt zniknie razem z nim i stracimy możliwość kontroli nad grą.


Teraz kiedy mamy już nasz skrypt przypisany do kamery - musimy go edytować. W tym celu zaznaczamy naszą kamerę w widoku Hierarchii i  klikamy dwukrotnie na nazwę glownyskrypt:


Pojawił się edytor skryptu. Narazie jedyną rzeczą jest jedna linijka tekstu:


Każda funkcja zaczyna się od słowa function.
Później widzimy słowo Update (zaczynające się z wielkiej litery). Wszystko co znajduje się w funkcji Update jest odświeżane z prędkością 1 klatki na sekundę. Dlatego jest  to idealne miejsce do napisania naszego skryptu służącego przechwytywaniu Tapnięć (dotknięć jak kto woli). Dzięki funkcji Update nasza gra będzie ponawiała stale sprawdzenie czy dotknęliśmy ekranu w odpowiednim miejscu...w naszym przypadku - czy dotknęliśmy naszych kwadratów.

Edytujemy funkcję aby wyglądała tak:


for (var evt : iPhoneTouch in iPhoneInput.touches)


w tej linii przypisujemy zmiennej evt obsługę tapnięć iPhona. Nie potrafię tego dokładnie wytłumaczyć, po prostu tak musi być.


if (evt.phase == iPhoneTouchPhase.Began)

tutaj pojawia się zmienna if czyli polskie słowo jeżeli. Ogólnie tłumaczenie całego zdania to: jeżeli faza dotknięcia ekranu iPhone jest fazą początkową dotyku...
zamiast Began możemy użyć innych słów takich jak: Moved - czyli kiedy zaczynamy przesuwać palec po ekranie, Stationary - kiedy palec dotyka ekranu ale się nie porusza, Ended - końcowa faza dotyku, zaraz po oderwaniu palca od ekranu, oraz Canceled - kiedy na przykład położymy więcej niż 5 palców jednocześnie albo przyłożymy ekran do ucha itd

 var ray = camera.main.ScreenPointToRay(evt.position);

tutaj dodajemy zmienną ray czyli po polsku - promień, wiązka. Przypisujemy do niej odległość od naszej kamery do miejsca naszego tapnięcia (tak to niej więcej rozumię...mogę się mylić ale nie to jest ważne...skrypt na wykrywanie dotyku znalazłem na forum unity już dość dawno i dotąd spisuje się bardzo dobrze).














if(Physics.Raycast(ray, hit, 40) && hit.collider.name == ("czerwony1"))  {
        Destroy (czerwony1);
          }

te dwie linijki służą do sprawdzania czy dotknęliśmy na ekranie odpowiedni obiekt. 
Określamy maksymalną odległość od kamery gdzie mogą się znajdować te obiekty..w naszym przypadku 40 oraz( dwa znaki &) czy dotknięto collidera czyli komponentu w naszych obiektach który odpowiada za kolizje z innymi obiektami. 
Jeżeli te 2 warunki zostały spełnione czyli dotknęliśmy obiektu o nazwie czerwony1, wtedy otwieramy następny nawias klamrowy i wpisujemy Destroy (czerwony1);
Czyli po prostu po naciśnięciu na ten obiekt - znika z ekranu.

na samym początku naszego skryptu mamy 3 zmienne:



var czerwony1 : GameObject;
var czerwony2 : GameObject;
var hit : RaycastHit;
 


określają one typ naszych obiektów użytych w funkcji. GameObject to obiekt w grze a RaycastHit to część naszej funkcji wykrywającej tapnięcia. Nie będę tłumaczył bo coś pomylę.

Teraz powinno wszystko grać. Aby testować gry bez konieczności wgrywania ich do swojego urządzenia musimy ściągnąć Unity Remote z Appstore. Później wystarczy go uruchomić i wcisnąć play w Unity. Pamiętaj że trzeba mieć połączenie wifi. 
Jeżeli chcemy testować grę na urządzeniu powinniśmy dokonać kilku zmian w opcjach unity.
Klikamy zakładkę Edit>Project Settings>Player:















Musimy wpisać odpowiednią nazwę, ustawić api na .NET 2.1, orientację ekranu na Landscape obojętnie który, ustawić sdk...chociaż i tak później muszę zmieniać w xCode bo nie chce się skompilować, no i jeszcze urządzenie docelowe...w tym przypadku iPhone.Tak wyglądają ustawienia w Inspektorze:




Później klikamy zakładkę File>Build & Run i czekamy na xCode. Kiedy już kompilacja się nie powiedzie z powodu błędu zmieniamy w zakładce target ustawienia na takie:




oraz trochę niżej:




to samo robimy w Info naszego projektu i kompilujemy jeszcze raz, tym razem nie powinno być problemów.


Mamy już kawałek naszej gry, teraz musimy jakoś ustalić kiedy nasza równoważnia zbytnio się przechyliła i spadła. Wtedy zostanie usunięta z wszystkimi elementami które pospadały i zostanie wyświetlone odpowiednie info. Aby to zrobić potrzebny jest nam nowy element (trigger). 
Kliknij w zakładkę GameObject>Create Empty:




Ustalamy pozycję i skalę naszego obiektu na taką jak na załączonym obrazku :




Teraz dodajemy do nowego obiektu Box Collider który będzie wykrywał kiedy jakiś obiekt znajdzie się w obrębie naszego wykrywacza:




Zaznaczamy opcję Is Trigger w dopiero co dodanym komponencie:




Tworzymy nowy skrypt, zmieniamy nazwę na trigger i dodajemy poniższy tekst:




Teraz tworzymy jakieś w programie graficznym okienko przegranej i drugi obrazek na który klikniemy żeby potwierdzić reset naszej gry. Obrazki powinny posiadać transparentne tło. Zapisujemy do .PNG i przeciągamy do okna projektu gdzie znajdują się już nasze skrypty:


Teraz tworzymy dwa dodatkowe box'y które będą zawierały nasze obrazki. Aby zachować proporcje ustawiamy wielkość naszych kwadratów według wielkości obrazków...dla przykładu moje obrazki mają 200x150 pikseli więc mój box ma skalę 8x6x1.Ustawiamy box'y w wybranym miejscu (dodatkowo musimy je troszeczkę przesunąć do siebie aby nie kolidowały z naszą pochylnią i innymi obiektami) i przeciągamy na nie nasze obrazki.

U mnie wygląda to tak:


Coś tu nie gra...teraz nie wygląda to zbyt dobrze. Dlaczego mamy takie białe tło? Odpowiedź znajdziemy w Inspektorze naszych box'ów w pozycji Material:


Wszystko co trzeba zrobić to zmienić Shader na Transparent Diffuse:


Teraz nasza gra wygląda znacznie lepiej:


Akurat na tych obrazkach tego nie widać ale jeżeli mamy bardziej złożone kolorystycznie to wtedy jakość wydaje się być znacznie pogorszona w stosunku do tego co widzieliśmy początkowo w naszym programie graficznym. Aby polepszyć jakość obrazków musimy zmienić ich ustawienia w widoku projektu. Zaznaczamy obrazek który chcemy zmienić i klikamy w przycisk Settings:


Ukazuje się nam okno importowania. Musimy odznaczyć opcję Generate Mip Maps i klikamy Import:


Mamy już monit o przegranej. Teraz musimy go jakoś przechować w ukryciu bo nie będzie przecież cały czas widoczny...musi pojawić się dokładnie, kiedy jakiś obiekt dotknie naszego trigger'a (tego usuwacza obiektów) który znajduje się odrobinę niżej. Tak więc najlepszym sposobem na przechowywanie obiektów poza grą jest Prefab. Jest to kontener na obiekty który będzie się znajdował w oknie Project i jeżeli chcemy na przykład stworzyć 100 kulek w losowych miejscach ekranu...wtedy Prefab jest bardzo pomocny. Zostanie stworzone 100 klonów tego obiektu i nie będzie z tym większego kombinowania. Żeby stworzyć nowy Prefab klikamy zakładkę Assets>Create>Prefab:


Tworzymy 2 prefaby czyli do każdego z naszych obiektów osobno i zmieniamy nazwy żeby się nie pogubić:


Szary kolor tych pudełek oznacza że Prefab jest pusty. Przeciągnijmy więc nasze obiekty z widoku Hierarchii do naszych Prefab'ów. Teraz kolor zmienił się na niebieski:


Możemy teraz śmiało usunąć te 2 obiekty z widoki Hierarchii gdyż zostały one uwiecznione w kontenerach Prefab. Gdy przyjdzie odpowiedni moment - zostaną one odtworzone dokładnie w tych samych miejscach.

Teraz czas edytować nasz skrypt znajdujący się w przechwytywaczu naszych spadających obiektów.
Edytujemy go następująco:
dodajemy na początku:


var przegranaprefab : GameObject;
var takprefab : GameObject;


Są to zmienne zawierające odnośniki do naszych obiektów.


Do środka funkcji przegrana dodajemy te 2 linijki (chociaż na stronie robią się z nich 4):



Instantiate(przegranaprefab, przegranaprefab.transform.position, przegranaprefab.transform.rotation);
Instantiate(takprefab, takprefab.transform.position, takprefab.transform.rotation);











Tworzą one nasze 2 obiekty z obrazkami przegranej.

Po zapisaniu funkcji pojawiają nam się w Inspektorze pod naszym skryptem  2 zmienne do których podstawiamy nasze 2 prefaby z widoku Projects .Prubujemy jak działa nasza gra:



Teraz musimy dodać poniższą linijkę do skryptu glownyskrypt znajdującego się w naszej kamerze aby można było dotknąć słowa TAK i zresetować naszą rundę:

Application.LoadLevel (0); wgrywa scenę z numerem indeksu 0...o tym za chwilę.

Końcowo skrypt wygląda tak:



Ostatnią rzeczą w tej części jest przypisanie tej scenie indeksu 0. Aby to zrobić klikamy w zakładkę File>Build Settings:


Teraz naciskamy przycisk Add Open Scene i nasza scena pojawiła się na liście wraz z indeksem 0.


Plusem metody resetowania całej sceny naraz jest to że nie ma z tym dużo roboty, ale w takich prostych grach które nie zużywają dużo zasobów warto trochę się pomęczyć i zamiast tego napisać skrypt na wstawianie naszych obiektów które spadły na poprzednie miejsce. Pozwoli to na zachowanie ścieżki dźwiękowej, mam na myśli muzyki...w nieprzerwanej formie, co wydaje się lepszym rozwiązaniem niż odtwarzanie muzyki od nowa z każdą przegraną. Dzieje się tak gdyż podczas resetu sceny wszystko co było w naszej grze jest budowane od nowa...wraz z muzyką.

Wszystko powinno śmigać. Zapraszam do części III (jeżeli tylko ją napiszę).

0 komentarze:

Prześlij komentarz