Dlaczego Unity 3D ???
by kubagert on sty.22, 2011, under Programowanie gier, Unity3D
Gdy pisałem swoje pierwsze gry, budowałem je samodzielnie od podstaw, czyli – engine – przygotowanie asetów, wbudowany edytor i jednocześnie grę. Pisanie własnego silnika jest bardzo modne. W zasadzie każdy programista którego pasja oscyluje wokół tworzenia gier, takowy silnik stworzył (a przynajmniej doprowadził do jakiejś sensownej formy). I na tym kończy się przeważnie etap prac. Programista się wypala, czasem walczy z własnymi błędami projektowymi, babolami we własnych, super genialnych algorytmach, itp. Z czasem odkrywa, że chciał zrobić genialną grę, a utknął na podstawie zwanej silnikiem, lub zauważa, że tak bardzo skupił się na rozwoju silnika, że zapomniał robić grę. Gdy pracowałem nad grą Bober The Beaver, pisałem silnik wraz z edytorem, projektując tylko i wyłącznie niezbędną mi funkcjonalność do tego stopnia, że silnik ten praktycznie nie nadawałby się do robienia innych gier niż platformówki 2D. Wtedy zauważyłem silnik Unity3D. Zapoznałem się z jego podstawową funkcjonalnością, poznałem jego filozofię i mnie oświeciło. Ten silnik to nie Unreal Engine 3, ale ma wszystko co potrzeba aby zrobic to, co mam w głowie. No więc zacząłem robi proste rzeczy i postanowiłem przenieść BoberTheBeaver ze swojego FemtoEngine na silnik Unity3D. Udało mi się zrobić to w niecałe 4 tygodnie. Dlaczego tak prędko ?
A no dlatego:
- Wygodny w użyciu edytor na który składa się:
- Zakładka „Scene” – panel widoku sceny, w niej przemieszczamy obiekty, obracamy, skalujemy, „latamy” po scenie, ustawiamy kamery, światło, i co tam jeszcze potrzeba.
- Zakładka „Game” – panel widoku gry, jeśli testujemy grę to „gramy” w tej zakładce
- Zakładka „Project” – panel widoku projektu – czyli po ludzku tutaj widzimy hierarchię plików i katalogów wchodzących w skład projektu.
- Zakładka „Hierarchy” – panel widoku hierarchii obiektów na scenie.
- Zakładka „Inspector” – inspektor obiektów, tutaj ustawiamy „z palca” właściwości obiektów na scenie, pozycję, rotację, skalę, parametry skryptów, parametry fizyczne, renderingu, itp.
- Zakładka „Console” – konsola projektu, widzimy wszystkie informacje które wyrzucamy do log’a (messages), a także ostrzeżenia (warnings) oraz błędy (errors).
- Bogata pomoc
- Unity Manual – manual do silnika, z dokladnym opisem każdego okna, opisanym sposobie poruszania się po edytorze, skróty klawiszowe, itp
- Reference Manual – manual poszczególnych części edytora – do audio, fizyki, renderingu, itp
- Scripting reference – opis wszystkich klas i funkcji Unity3D, do których możemy się odwoływać z poziomu skryptów. Większość funkcji oraz klas jest wsparta prostymi przykładami wykorzystania w trzech językach, JavaScript, C# oraz Boo
- Klarowny podział na obiekty i komponenty (oraz skrypty)
- Obiekty („GameObjects”) – Obiekt to bazowy obiekt (masło maślane) który ma transformacje (czyli pozycja, obrót, skala), nazwę, dzieci (childs), oraz może mieć rodzica (parent). Może to być pusty obiekt (w sensie nie ma żadnej reprezentacji na ekranie ani w fizyce, ani w audio, ani w niczym, poprostu nicość
, może to być prostopadłościan, powierzchnia, światło, kamera, albo cały działający oskryptowany samochód - Komponenty („Components”) – Komponenty wchodzą w skład obiektów. Na komponentach opiera się praktycznie cała filozofia działania Unity. Komponenty przeważnie maja parametry. Wyobraźmy sobie wyrenderowaną na ekranie kulę. W filozofii Unity taki obiekt wygląda następująco: jest to obiekt GameObject (pusty), który zawiera komponent MeshFilter (odpowiedzialny za przetrzymywanie i obsługę geometrii, jako parametr ma ustawiony siatkę kuli), następnie obiekt ten zawiera komponent MeshRenderer (odpowiedzialny jest za renderowanie geometrii, którą pobiera z MeshFilter, jako parametr może mieć ustawiony materiał renderowania). Dodatkowo może zawierać komponent Rigidbody (więc zostanie mu przypisane ciało fizyczne z masą, gęstością, itp, na które będziemy mogli oddziałowywać siłą), oraz może zawierać SphereCollider (czyli fizyczny mesh kolizyjny w kształcie kuli, dzięki czemu nasza kula może się toczyć). Komponentem może być także skrypt.
- Komponent Skrypt – najważniejszy element dla programisty, czyli komponent skryptowy. I tutaj tkwi siła Unity wg mnie. Piszemy jeden skrypt i możemy go „podpiąć” do każdego obiektu. Na dodatek możemy podpiąć kilka różnych skryptów pod jeden obiekt. A skrypty możemy pisać aż w 3 różnych językach: w JavaScript, C# oraz Boo. Wszystkei skrypty są kompilowane w locie, więc na bierząco widzimy czy nie popełniliśmy błędu. Dodatkowo nawet jak popełniliśmy karygodny błąd (NullPointer Exception) nie powoduje to zamknięcia Unity, tylko włączenie pauzy, i możemy na konsoli zobaczyć co się złego stało.
- Obiekty („GameObjects”) – Obiekt to bazowy obiekt (masło maślane) który ma transformacje (czyli pozycja, obrót, skala), nazwę, dzieci (childs), oraz może mieć rodzica (parent). Może to być pusty obiekt (w sensie nie ma żadnej reprezentacji na ekranie ani w fizyce, ani w audio, ani w niczym, poprostu nicość
- Elastyczność
- Można łatwo rozbudować funkcjonalność edytora o pluginy lub skrypty
- Można łatwo przenosić elementy między projektami poprzez eksportowanie/importowanie paczek assetów (packages)
- Prefabrykowane elementy – specjalny typ obiektów. Jeśli zbudujemy scenę z 10 takich samych prefabrykantów a następnie zmienimy parametry jednego z nich, to automatycznie (jeśli tego chcemy) nowe parametry zostaną uaktualnione w pozostałych elementach tego samego typu. Przyspiesza to błyskawicznie prototypowanie oraz składanie leveli.
- Unity ma wbudowaną bazę shaderów, ale jeśli chcemy możemy ją rozbudować pisząc swoje, własne.
Te kilka rzeczy spowodowały tak szybkie przeniesienie BoberTheBeaver z FemtoEngine do Unity3d, gdyż:
- napisałem skrypt, który importował modele z Bober’a do Unity i tworzył z nich prefabrykanty,
- napisałem skrypt, który importował levele z Bobera do Unity, automatycznie wstawiając na level odpowiednie prefabrykanty w odpowiednich miejscach i skali,
- napisałem kilka skryptów obsługi postaci
- napisałem kilka skryptów obsługi menu, dźwięków, animacji poklatkowych
- uruchomiłem wszystkie skrypty po kolei i gra była przeniesiona, następny etap to było już tylko tweakowanie i poprawianie błędów. Unity ma jeszcze jedną zaletę, a mianowicie można wygenerować projekt, który działa zarówno na PC’tach, komputerach Mac, oraz na stronie www (po zainstalowaniu pluginu).
Uff, to by było tyle wstępu dotyczącego zalet Unity3D. Co będzie w następnym odcinku ? Jeszcze nie wiem, ale na pewno coś ciekawego.
