Asteroidy! - taka sobie gra w Unity

3

Projekt stworzony w wyniku trzech dni nauki Unity i równoczesnego pisania poniższego dzieła, które z pewnością zapamiętają pokolenia. Gra ma oszałamiające efekty specjalne, niekonwencjonalną mechanikę, a także porywającą, pozwalającą się wczuć w klimat oprawę dźwiękową.

Jeżeli ktoś zna się w miarę dobrze na Unity, prosiłbym o podanie mi kilku wskazówek dotyczących kodu/zastosowanych technik bądź wskazania wtfów.

Opis:
Asteroidy! to gra, w której głównym zadaniem gracza jest zestrzelenie jak największej liczby asteroid. Za kolejne zniszczone (bądź uszkodzone) obiekty dostajemy punkty, dzięki którym co pewien czas otrzymujemy do dyspozycji rakietę nuklearną zdolną zniszczyć jednorazowo wszystkie widoczne asteroidy. Ilość amunicji jest ograniczona, dlatego należy pamiętać o zbieraniu spadających paczek. Statek gracza może uderzyć w lecące asteroidy maksymalnie 10 razy.

Sterowanie:
WSAD, strzałki - statek
Spacja - strzał
CTRL - rakieta nuklearna
ESC - wyjście z gry

Download: https://www.dropbox.com/s/kfrd2e6ht6n1n6h/Asteroidy.zip?dl=0
Projekt: https://www.dropbox.com/s/9kyvjzh61b5ctak/Source.zip?dl=0

s1.png
s2.png
s3.png
s4.png

0

Strasznie brzydkie i niegrywalne.

Pewnie robione według jakiegoś tutoriala.

0

Brzydkie na pewno, ostatecznie to są tylko losowe grafiki ściągnięte z losowych stron. I tak dobrze że sam ich nie robiłem ;)
Natomiast czy niegrywalne... co kto lubi.

Nie, nie korzystałem z żadnego tutoriala, wszystko wykombinowane na drodze eksperymentów.

1

Moim zdaniem zbyt wysoki poziom trudności, nie mogę dojść do tych 2k pkt.
Muszę się kiedyś nauczyć Unity :P

4

@AlfaLeporis

Jako ze pracuje z unity na codzien to zrobie Ci maly review

Co powinienes dolaczyc to tylko dwa foldery
Assets
ProjectSettings

Reszta generuje sie i tak na nowo na nowym kompie (library jest duze i niepotrzebne w ogole)

  • rozpierdziel w assets. Pogrupowalbys to (prawym, utworz folder). Animation, Animator, Scripts, Materials, Sounds, Prefabs, Scenes
  • Probuje otworzyc jakakolwiek scene a tu mi sie crashuje caly projekt. Takze cos zle zrobiles. Wiec nie zobacze jak masz utworzony gameobject. Cos jest bardzo nie tak bo teraz w ogole go nie moge uruchomic. Nie uzywasz czasem jakies pirackiej wersji dla pro?
  • Magic numbery w ActionText. Te zmienne powinny byc publiczne zeby mozna w unity sobie je regulowac podczas play (wtedy wroca do oryginalnej wartosci po play)
  • puste funkcje
  • ActionTextxManager. Co jezeli Nie znajdzie Canvasu funkcja? Wtedy bedzie duzy problem (NullReferenceException). Powinno byc tam jakies sprawdzanie (najlepiej assert z czytelnym komunikatem)
  • Ammo.png, powinno byc 3 texturami a nie jednym. Co jesli bedziesz chcial pokolorowac ikonke? Albo zmienic czarne na niebieskie? Albo biale na zolte?, to samo z atomic i health
  • Ammunition. FixedUpdate, tworzysz za kazdym razem nowy Vector. Dla GC moze byc to problem.
  • Asteroid. Powaznie za kazdym update musisz szukac gracza? Nie lepiej OnEnable() albo Start? Albo Awake()? Nie moge znalezc (bo nie moge otworzyc unity) jak zdefiniowales Player. Ale ogolnie, teraz on jest globalny. Dlaczego Asteroid dodaje punkty playerowi? Nie powinno byc tak ze "plansza" o tym decyduje a nie obiekt ktory jest niszczony? Powinna byc jedna klasa ktora definiuje wszstkie zasady gry, ile pkt itd. Jezeli obiektow przybywa to zrobilbym polimofrizm i dla danego obiektu bylby "manager" zasad (jezeli dla asteroidy byloby 10 zasad a dla innych 3,5,7,8 itd). Tworzysz w update new Vector co moze byc zgubne. Co robisz w update to czekasz az helath bedzie ponizej 0 i wtedy wylaczasz renderer (plus jakis tam rzeczy) wiec na dobra sprawe to co sie tam dzieje nie powinno tego byc! Jezeli health jest ponizej 0 (mozesz to sprawdzac gdzies wyzej, tam gdzie definiujesz zasady) gdzies w Collider mowisz "oho uderzona wiec zmniejszam punkt, ma ponizej 0? Usuwam!". Bo teraz asteroida decyduje o swoim bycie. To bardzo zle
  • Background. Nie patrzylem uwaznie, ale widze ze obliczasz delty. Masz Time.DeltaTime;

Moze pozniej dopisze reszte, ale jest nad czym popracowac ;) A sceny nie widzialem bo nie uruchomilem.

Edit. znalazlem chwile

  • Background ciag dalszy. InitStars. Count powinien byc definiowany w insektorze w unity. Tworzysz duzo obiektow w update. Co zapewne nie jest potrzebne. Wyobraz sobie takie cos. Co sekunde jezeli masz 60 fps powiedzmy, mozesz stworzyc 60 obiektow. Jezeli robisz to w kilku miejscach, powiedzmy w 10 to juz masz 600 nowych obiektow. Mielismy projekt (w obj-c) gdzie byly tworzone nowe obiekty przy zoomowaniu. Byly tak szybko tworzone ze GC gubil refenrecje (z tego co pamietam tak bylo, musialbym sprawdzic logi) po czym crashowal aplikacje. Od tamtej pory mysle czy aby na pewno potrzebuje stworzyc tyle obiektow w update.
  • widac ze piszesz w tym MonoDevelop. Wez unityvs.com i jedziesz. community wersja powinna pasowac do unity.
  • Bullet. To samo co z astroidami, nie potrzebnie definiuje zasady gry. I szukasz jeszcze playera w kolizji. Mozesz ustawic dla jakich obiektow/tagow co ma kolidowac ze soba. Edit -> Project Settings -> Physics/physics 2d.
  • statystki trzymalbym w UserPrefs a nie w playerze. Albo w osobnej klasie Storage
  • Explosion. ? Na co po co?
  • popraw formatowanie, w kazdym pliku. components [0].Play (); Przeciez to jakas porazka.
  • HAAAA juz widze co to jest player. Do usuniecia. Wszystko static, nie, nie, nie i jeszcze raz nie.
  • Ship -> podziel na czytelniejsze funkcje
  • Jezeli uzywasz GUI system upewnij sie ze masz wersje 4.6 bo tam zmienili prawie wszystko w nim (gui jest dostepne nawet na githubie). Jest duzo lepsze od poprzednika. Nie jest super wydajne (napisalismy lepsze), ale jest w zupelnosci wystarczajace do gui.
3
  1. Nie można lecieć i strzelać jednocześnie.
  2. Dodałbym zróżnicowane asteroidy (tak, odejść od oryginału), nowe statki, amunicje itp. - ale bym grał ;3
  3. W następnej wersji załatw lepszą grafikę to całe forum będzie grać ;p
0

@fasadin - dziękuje ślicznie za tyle cennych uwag i wskazówek, już się odnoszę do każdej :)

  • rozpierdziel w assets. Pogrupowalbys to (prawym, utworz folder). Animation, Animator, Scripts, Materials, Sounds, Prefabs, Scenes

Do zrobienia, jak już tych obiektów zrobiło się trochę to faktycznie odszukanie konkretnego elementu zajmowało chwilę.

  • Probuje otworzyc jaka kolwiek scene a tu mi sie crashuje caly projekt. Takze cos zle zrobiles. Wiec nie zobacze jak masz utworzony gameobject. Cos jest bardzo nie tak bo teraz w ogole go nie moge uruchomic. Nie uzywasz czasem jakies pirackiej wersji dla pro?

Hmm, używam normalnej wersji free, bez żadnych triali i innych cudów. Powiem więcej, u mnie się normalnie wszystko otwiera - w każdym razie poszukam w necie coś na ten temat.

  • Magic numbery w ActionText. Te zmienne powinny byc publiczne zeby mozna w unity sobie je regulowac podczas play (wtedy wroca do oryginalnej wartosci po play)

Ok, czyli wniosek taki że wszystkie zmienne wpływające na rozgrywkę powinny być publiczne i dające się regulować z poziomu edytora.

  • ActionTextxManager. Co jezeli Nie znajdzie Canvasu funkcja? Wtedy bedzie duzy problem (NullReferenceException). Powinno byc tam jakies sprawdzanie (najlepiej assert z czytelnym komunikatem)

Hmm, szczerze mówiąc nawet nie myślałem o obsłudze błędów. Swoją drogą pytanie w związku z tym bo teraz to jest tak wymieszane: w jaki sposób praktyczniej wrzucać obiekty do skryptów (zwłaszcza jak jest ich dużo) - poprzez edytor czy manualne ładowanie przy pomocy GameObjects.Find?

  • Asteroid. Powaznie za kazdym update musisz szukac gracza? Nie lepiej OnEnable() albo Start? Albo Awake()? Nie moge znalezc (bo nie moge otworzyc unity) jak zdefiniowales Player. Ale ogolnie, teraz on jest globalny. Dlaczego Asteroid dodaje punkty playerowi? Nie powinno byc tak ze "plansza" o tym decyduje a nie obiekt ktory jest niszczony? Powinna byc jedna klasa ktora definiuje wszstkie zasady gry, ile pkt itd. Jezeli obiektow przybywa to zrobilbym polimofrizm i dla danego obiektu bylby "manager" zasad (jezeli dla asteroidy byloby 10 zasad a dla innych 3,5,7,8 itd). Tworzysz w update new Vector co moze byc zgubne. Co robisz w update to czekasz az helath bedzie ponizej 0 i wtedy wylaczasz renderer (plus jakis tam rzeczy) wiec na dobra sprawe to co sie tam dzieje nie powinno tego byc! Jezeli health jest ponizej 0 (mozesz to sprawdzac gdzies wyzej, tam gdzie definiujesz zasady) gdzies w Collider mowisz "oho uderzona wiec zmniejszam punkt, ma ponizej 0? Usuwam!". Bo teraz asteroida decyduje o swoim bycie. To bardzo zle

No właśnie, tutaj się zdecydowanie pogubiłem. Konkretnie kto kogo ma wykrywać i komu dodawać punkty. Czyli rozumiem że dobrym rozwiązaniem było by utworzenie (przykładowo dla asteroid) jakiegoś AsteroidsManager który zarządzałby czasem życia asteroid i wysyłał gdzieś wyżej "asteroida X zderzyła się z obiektem Y, zróbcie coś z tym".

  • Background ciag dalszy. InitStars. Count powinien byc definiowany w insektorze w unity. Tworzysz duzo obiektow w update.

Ok, pomyślę jak to inaczej rozwiązać.

  • widac ze piszesz w tym MonoDevelop. Wez unityvs.com i jedziesz. community wersja powinna pasowac do unity.

Zdecydowanie muszę to zrobić, zwłaszcza że formatowanie przy C# to jest totalna katastrofa. Część poprawiłem, część została i kod wygląda jak wygląda.

  • Bullet. To samo co z astroidami, nie potrzebnie definiuje zasady gry. I szukasz jeszcze playera w kolizji. Mozesz ustawic dla jakich obiektow/tagow co ma kolidowac ze soba. Edit -> Project Settings -> Physics/physics 2d.

Czyli podobnie, jakiś BulletsManager.

  • statystki trzymalbym w UserPrefs a nie w playerze. Albo w osobnej klasie Storage

oraz

  • HAAAA juz widze co to jest player. Do usuniecia. Wszystko static, nie, nie, nie i jeszcze raz nie.

Programista płakał jak pisał "static" ;) W każdym razie zrobiłem to z pełną świadomością że jest źle, stąd pytanie gdzie umieszczać takie informacje jak liczba pocisków, statystyki itp. Chociaż po zastosowaniu tych managerów sprawa się ułatwia bo wystarczyło by im wrzucić tą klasę Storage.

  • Jezeli uzywasz GUI system upewnij sie ze masz wersje 4.6 bo tam zmienili prawie wszystko w nim (gui jest dostepne nawet na githubie). Jest duzo lepsze od poprzednika. Nie jest super wydajne (napisalismy lepsze), ale jest w zupelnosci wystarczajace do gui.

4.6.1, sprawdzę.

@Trebuh

Nie można lecieć i strzelać jednocześnie.

Wiem że zabrzmi smutno ale... u mnie się da ;)

Dodał bym zróżnicowane asteroidy (tak, odejść od oryginału), nowe statki, amunicje itp. - ale bym grał ;3

Na początku to w ogóle miały dojść jeszcze statki kosmitów i inne dziwne rzeczy - natomiast asteroidy miały być tylko znaczącym dodatkiem. Jak wyszło tak wyszło ;)

W następnej wersji załatw lepszą grafikę to całe forum będzie grać ;p

Poszukam, te obecne były wzięte z losowych stron więc jak jest, każdy widzi.

Dzięki jeszcze raz wszystkim, tak sobie myślę że zaczynanie od 2D zamiast od razu rzucać się na 3D to był dobry pomysł... :)

2

wylacz unity (jak cos komitujesz wysylasz unity lepiej jak jest zamkniete bo tworzy pliki ktore nie sa do konca potrzebne
zrob zipa Assets i ProjectSettings
Wyslij ;)

Regulacja z poziomu edytora jest fajna dla artystow/designerow. Bo jako artysta nie musisz isc do kodu tylko sobie "testujesz" to co chcesz. Ulatwia to dla takich osob bardzo duzo.

Rowniez jezeli bedziesz testowal predkosc to mozesz miec odczucie "na zywo" bo zmieniasz wartosc a ona Od razu sie zmienia. Wiec mozna fajnie dostroic gre.

GameObject.Find() jest drogi. Bo idzie od poczatku hierarchi az cos znajdzie. Powiedzialbym wiecej, jest bardzo drogi. Lepiej wrzucac obiekty z poziomu edytora. Jezeli nie chcesz to mozesz uzywac Find, ale wtedy uzywaj Transform.Find() bo nie szuka po calej hierarchi a tylko po dzieciach. Zdecyduj sie na jedna rzecz, albo find albo wrzucanie poprzez edytor.

Nie musisz miec dla kazdego obiektu managera. Bo Twoja gra jest mala. Powinienes miec klase na zasadzie AsteroidsGame i w niej wywolywac odpowiednie metody. Klasy nie musza dziedziczyc po monobehaviour (moga ale nie musza, bo nie wiem czy wiedziales o tym. Wtedy normlanie tworzysz klase za pomoca new)

Ogolna idea jest taka, podam na przykladzie asteroidy. Asteroida jest GameObjectem. Wiec rowniez musi posiadac boxcollider (detekcja kolizji itd). Wiec jezeli Asteroida uderzy w cos rozpoznaje co to jest i wysyla odpowiedni komunikat do AsteroidsGame. Np asteroidsGame.AsteroidWithPlayer(); I asteoridy nie powinno obchodzic co sie stanie z nia czy z graczem czy w ogole, ona przyjela do wiadomosci ze uderzyla w cos i przekazala to dalej.

Mozesz rozwiazac ten problem na kilka...nascie rozwiazan, sam w glowie mam z 4 nie wiem ktore bedize najlepsze ale sadze ze to bedzie najlatwiesze do zaimplementowania a do utrzymywania tez nie powinno byc problemow bo klasa bedzie skalowalna (duza, ale skalowalna) jezeli wyjdzie duzo wiecej takich obiektow to mozesz zrobic subklasy dla AsteroidsGame. Rozwiazanie ma dosc duzo wad, ale jest szybkie i latwie w zaimplementowaniu ;) Jak bedziesz rozszerzal projekt zobaczysz dlaczego to stanie sie wada (jezeli bedziesz, jezeli nie to przynajmniej bedziesz mial cos co mozesz pokazac[juz masz :D])

no i jeszcze poczytaj sobie o
http://gamedev.stackexchange.com/questions/4157/what-are-some-programming-design-patterns-that-are-useful-in-game-development

0

@fasadin - faktycznie, naprawdę sporo rzeczy mi teraz wyjaśniłeś co do których miałem wątpliwości w czasie pisania, jeszcze raz wielkie dzięki :) Nie wiem czy będę ten kod jeszcze ruszał, jako że skopany jest cały mechanizm działania. Niemniej jednak pomyślę dzisiaj nad jakąś nową gierką i spróbuję ją napisać z uwzględnieniem tego co napisałeś.

@Niebieska Żaba - oczekiwałeś że w ciągu trzech dni nauki Unity stworzę nową serię Civilization albo kolejne Kerbal Space Program (też w Unity stworzone swoją drogą)? ;)

Swoją drogą, znacie może jakieś fajne stronki z grafikami właśnie do takich mikro gierek (zręcznościowe, strategiczne, jakiekolwiek)? Jestem upośledzony graficznie dlatego sam niczego nie narysuję :[

1

Bardzo mi się podoba ta gra. Tylko popracuj nad grafiką.

1

Nie wiem czy na to pozwala wersja free unity, ale mógł byś zrobić wersje mobilną :)

0
deadparty211 napisał(a):

Nie wiem czy na to pozwala wersja free unity, ale mógł byś zrobić wersje mobilną :)

Z tego co sprawdzałem to da się, generuje mi jakiś plik apk. Ale niestety nie posiadam sprzętu z Andkiem (Symbian forever :) ) żeby przetestować dotykowość, więc ruchy w tym kierunku dopiero jak takowy telefon sobie sprawię ;)

1

Możesz sobie zawsze zainstalować androida na vm, nie wiem jak z innymi systemami mobilnymi.

1

Można próbować, ale generalnie nigdy nie będzie to to samo co testowanie na fizycznym urządzeniu. Spróbuję dzisiaj zainstalować Andka i zobaczyć jak to wyjdzie.

0

Na linuxie i Wine 1.4 gra się uruchamia, ale bez tekstu. Nie ma w ogóle informacji o liczbie pkt, itd.
Fajny efekt cząsteczkowy. Myślę, że przy schodzeniu w dół trochę nierealistyczny.

0

moze napisz jakie wymagania ma ta gra

u mnie na GeForce 6200 nie dziala

1 użytkowników online, w tym zalogowanych: 0, gości: 1