Od wersji chyba 4.3 Unity, zaoferowano nam specjalne narzędzia do tworzenia gier w 2D. Mamy tam do dyspozycji widok 2D, Collider czy Rigidbody 2D. Ale czy to wszystko jest nam potrzebne? Jakie są różnice pomiędzy 2D i 3D w Unity3d?
Odpowiadając bardzo krótko na pierwsze pytanie: Tak.
Zacznijmy od samego początku. Gdy tworzymy nowy projekt, mamy możliwość wybrać domyślne ustawienia dla danego “wymiaru” gry.
Jednak, gdy na coś się zdecydujemy, nie jest tak, że nie możemy już nic zmienić później Wybranie tutaj trybu 2D, wiąże się z trzema zmianami:
Kamera bez głębi
Domyślnie kamera zostanie ustawiona w tryb “orthographic”, czyli brak perspektywy, co oznacza, że głębia obrazu nie będzie uchwycona. Można to bardzo prosto zmienić w ustawieniach kamery, za pomocą opcji “Projection”.
Tekstury jako Sprite
Druga zmiana, to fakt, że wszystkie zaimportowane tekstury, domyślnie będą ustawiane jako Sprite 2D. Program zakłada, że nikt do gry 2D nie wstawi modelu w 3D, a jedynie będzie operował na Spritach (grafiki w 2D). Jednak i ten parametr możemy zmienić w locie. Oczywiście taki tryb nie sprawia, że nie możemy do gry dodawać modeli 3D.
Sposób wyświetlania sceny
Ostatnią zmianą jaka nam się trafi, to sposób wyświetlania sceny w samym programie. Będzie to rzut 2D, czyli będziemy mogli operować tylko osiami X i Y, zniknie nam oś Z. Czyli zostaje tylko przesuwanie góra-dół i lewo-prawo, możemy spokojnie zdemontować z myszki kółko, bo obrotu nie wykonamy i tak. Jednak i ten tryb możemy błyskawicznie zmienić, dosłownie jednym kliknięciem:
A co z fizyką?
Jeżeli przeglądamy listę komponentów, od razu rzuca się w oczy fakt, że mamy do dyspozycji dwa działy: “Physics” i “Physics2D”. W obu działach, znajdziemy dokładnie te same komponenty. Mało tego, każdy komponent w obu działach, jest opisany dokładnie tymi samymi atrybutami – z małym wyjątkiem. Jeżeli chodzi o położenie i wymiar Colliderów, określamy je tylko względem osi X i Y. Możemy taki Collider przypisać do obiektu 3D, jednak będzie się on zawsze znajdował w jego centrum.
No dobra, ale jednak uważamy, że ludzie odpowiedzialni za silnik, to nie banda idiotów, którzy dodali kolekcję identycznych komponentów, tylko po to, żeby im zabrać jeden atrybut – w końcu inteligentny programista, umiałby sobie wyzerować oś Z w 3 wymiarowym Colliderze.
Otóż chodzi tutaj o silnik fizyki, który obsługuje grę. Jeżeli korzystamy z komponentów fizycznych 2D, Unity ignoruje jeden z wymiarów i nie wykonuje dla niego obliczeń. Na chłopski rozum – jeśli obliczamy fizykę w 2 wymiarach, zamiast w 3, obliczeń będzie mniej. Dokładnie tak jest w rzeczywistości. Dokopałem się do pewnego zestawienia, skompletowanego przez pewną grupę developerską, która korzystając z Profilera dostępnego w Unity Pro, zrobiła kilka testów na obciążenie procesora, przy obliczeniach fizyki 2D i 3D.
Test na generowanie obiektów
Pierwszy test polegał na wygenerowaniu 300 cubów z odpowiednimi Colliderami. W przypadku silnika 3D, zajęło to ok 300ms, kiedy silnik 2D poradził sobie w czasie zbliżonym do 70ms. Czas generowania samych obiektów jest ponad czterokrotnie mniejszy. Jeżeli spojrzycie też na wykresy przez nich dostarczone, widać, że w przypadku obliczeń 2D, procesor balansuje między 30 a 15 FPS, kiedy dla 3D nadchodzi taki moment, gdzie 15 FPS staje się barierą nie do przebicia.
Test obliczeń w locie
Drug test, operował już na samych klatkach na sekundę. Ekipa w piramidę bloków strzelała kulami, licząc średnią liczbę klatek. W przypadku 3D było to 13 FPS, kiedy 2D może się pochwalić… 47! Prawie czterokrotna poprawa!
Spirte czy model 3D?
Jest jeszcze jedna istotna kwestia, związana z wyborem pomiędzy 2D i 3D, a optymalizacją gry. Czy nasze obiekty i modele mają być modelami 3D czy tylko i wyłączenie Spritami? Logika mówi, że łatwiej wyrysować obrazek 2D niż model. No i logika z reguł ma rację. Jeżeli chodzi o środowisko, statyczne obrazy itp. najlepszym wyborem jest Spirte.
Jednak co w przypadku animowanych postaci? Jeżeli tworzymy platformówkę, gdzie nasza postać nie jest za duża i nie ma za wielu animacji, Sprite będzie lepszym rozwiązaniem. Tak jak było to w Mario, Braid itp. Problem zaczyna się w przypadku większych postaci. Np. tworząc bijatykę, bohaterowie stanowią znaczącą część ekranu, do tego mają multum animacji. Stworzenie rysunku tak dużego, żeby przy sporych monitorach dalej wyglądał dobrze, a przy okazji był animowany płynnie i efektownie, jest zadaniem więcej niż trudnym. W takim przypadku, model 3D spisze się dużo lepiej.
Wniosek można tutaj najprościej sprowadzić do stwierdzenia: Im postać bardziej złożona, tym bardziej powinna być modelem 3D.
Konkluzja?
Jeżeli planujesz pisać grę 2D, koniecznie powinieneś skorzystać z komponentów fizyki 2D. Gra działa ok. czterokrotnie szybciej, przez co możesz dodać więcej elementów bez strachu, że gra szybko straci na płynności. Sam wybór trybu pracy na początku, nie ma aż tak istotnego znaczenia i da się go skorygować w czasie tworzenia gry. Jeżeli chodzi o decyzję Sprity czy modele 3D, nie ma jednoznacznej odpowiedzi.
Na koniec małe przypomnienie! W przypadku 2D i 3D istnieją też różnice w kodzie:
2D: rigidBody2D.AddForce() void OnCollisionEnter2D() void OnTriggerEnter2D() 3D: rigidBody.AddForce() void OnCollisionEnter() void OnTriggerEnter()