Jak w prototypowaniu mogę łatwiej badać zachowanie gry?

49

Sama buduję gry niezależne, ale zwykle brakuje mi energii, gdy wznoszę nowo opracowaną grę na poziom, na którym można grać z zachowaniem, więc zamiast eksploracji decyduję się na udoskonalenie. Z okropnymi wynikami.

Udoskonalenie a eksploracja
(zdjęcie z blogu interkomu )

Na przykład uważam, że cykle iteracji dla zachowań dostosowujących (tj. Łączenia i restartowania aplikacji C ++) są tak długie, że zabijają całą kreatywność. Buduję narzędzie, aby sobie z tym poradzić.

Jakie są inne sposoby szybkiego zbadania zachowania gry? Interesują mnie metodologie stosowane zarówno przez niezależnych programistów, jak i większe firmy.

Jonas Byström
źródło
1
To bardzo ładne zdjęcie. Skąd to jest?
Superbest
Myślę, że to, co robisz, jest formalnie nazywane „testowaniem jednostkowym”, zwłaszcza jeśli chcesz ulepszyć niewielką część gry na raz. Niestety gry są trudne do przeprowadzenia testu jednostkowego, ponieważ trudno jest wyodrębnić komponenty i trudno zautomatyzować sam test (aby mógł zdecydować o zaliczeniu / niepowodzeniu). Czytanie o strategiach testowania jednostkowego może jednak dać ci przydatne pomysły.
Superbest
5
@ Superbest: Wiem, że testy jednostkowe są na wylot i nie można porównywać eksploracji zachowania z testowaniem jednostkowym. Podczas eksploracji zachowania musisz załadować większość silnika gry oraz odpowiednie zasoby. Testy jednostkowe odbywają się tylko wtedy, gdy wiesz, dokąd zmierzasz; w tym przypadku nikt nie wie. Dlatego to „eksploracja”, a nie „wyrafinowanie”. Zdjęcie z bloga Interkomu .
Jonas Byström
Podczas testowania w trybie debugowania możesz zmienić kod po jego wstrzymaniu (przynajmniej w Visual Studio). dopóki nie zmienisz zbyt wiele (nagłówki funkcji itp.), możesz załadować go do swojej wstrzymanej gry w krótkim czasie kompilacji
Tobias B
@TobiasB: w praktyce niestety okazało się to bezużyteczne. Zwłaszcza, że ​​zwykle masz mechanikę gry rozłożoną na skrypty, już utworzone obiekty gry, zasoby i tak dalej. Nie jestem nawet pewien, czy bezpłatny Visual Express go obsługuje, tak naprawdę nie korzystałem z niego przez 14 lat! :)
Jonas Byström

Odpowiedzi:

30

Jak zauważyłeś, gdy pracujesz nad mechaniką gry, szybkość iteracji ma kluczowe znaczenie. Im dłuższy czas między myśleniem o modyfikacji a możliwością testowania z tą modyfikacją, tym mniej produktywny będziesz i tym bardziej będziesz rozproszony. W rezultacie zdecydowanie chcesz zarządzać czasem iteracji.

Dla mnie stwierdzam, że moja produktywność naprawdę zaczyna spadać, gdy czas na przetestowanie prostej zmiany przekracza około pięciu sekund. Więc kiedy eksperymentujesz, aby udoskonalić sposób, w jaki gra się czuje, jednym z twoich celów musi być wymyślenie „w jaki sposób mogę dokonać zmiany, a następnie grać przy użyciu tej zmiany w mniej niż pięć sekund”. Tak naprawdę nie ma znaczenia, jak to robisz, pod warunkiem, że czas iteracji będzie mniej więcej na tym poziomie.

Wiele dużych nowoczesnych silników (Unity, Unreal itp.) Zwykle robi to, umieszczając ich edytor w silniku gry, dzięki czemu można wprowadzać większość modyfikacji na żywo, bez konieczności ponownego uruchamiania gry. Mniejsze silniki / gry zazwyczaj koncentrują się na pracy w innym kierunku; spraw, aby gra się kompilowała i uruchamiała tak szybko, że nie ma znaczenia, czy musisz ponownie uruchomić grę dla każdej zmiany; nadal będziesz w testach, zanim upłynie ten pięć sekund.

W moim obecnym projekcie zajmuje mi około dziesięć sekund, aby wykonać małą rekompilację, połączyć, uruchomić grę, a następnie przejść do rozgrywki (większość z nich generuje renderowalną geometrię świata podczas ładowania zapisanej gry). A to o wiele za długo. Dlatego stworzyłem osobne tryby gry, które pozwalają mi testować różne części gry bez ładowania wszystkich prawdziwych zasobów gry, dzięki czemu mogę wchodzić i wychodzić znacznie, znacznie szybciej; zwykle w ciągu około dwóch do trzech sekund. Jeśli chcę przetestować interfejs użytkownika, mogę to zrobić bez ładowania do prawdziwej gry. Jeśli chcę przetestować renderowanie, mam inny tryb, w którym mogę to przetestować, ponownie bez ładowania całego systemu gry.

Widziałem innych ludzi, którzy podeszli do problemu, umieszczając logikę gry w bibliotece DLL i pozwalając, aby plik wykonywalny gry znajdujący się już w pamięci ponownie załadował bibliotekę DLL podczas gry, dzięki czemu można odbudować bibliotekę DLL i ponownie załadować ją do jest już załadowany plik wykonywalny, więc nie trzeba ponownie ładować / odbudowywać zasobów graficznych gry. Wydaje mi się to szaleństwem, ale widziałem, jak to zrobiono.

Znacznie prostsze byłoby określenie zachowania gry i / lub konfiguracji w skryptach lub plikach danych oraz zapewnienie sposobu na ponowne załadowanie tych plików na żądanie, lub po prostu obserwowanie ich modyfikacji, bez konieczności zamykania grę w dół, połącz ją ponownie, a następnie uruchom ponownie.

Istnieje wiele podejść. Wybierz to, co działa najlepiej dla Ciebie. Ale jednym z kluczy do udoskonalenia mechaniki gry jest niezwykle szybka iteracja. Jeśli tego nie masz, prawie nie ma znaczenia, co jeszcze robisz.

Trevor Powell
źródło
3
Czy mógłbyś rozwinąć swoje „testowe” tryby gry? Czy tworzysz kawałek gry tu i tam dla każdej części, kiedy chcesz ją powtarzać? Ile czasu potrzebujesz, aby ustawić „plasterek”? Co zostało pominięte i jak? Czy masz coś w rodzaju funkcji „zapisz grę” i „załaduj grę” dla tego typu rzeczy, czy jest to mniej ogólne?
Jonas Byström
2
@ JonasByström Nie wiem o nim, ale kiedy mam dobrą kontrolę nad stanami gry, często mogę mieć alternatywne wersje „Debugowania” (często dosłowne IF DEBUGdyrektywy kompilatora), które przechodzą bezpośrednio do mojego stanu „testowania” (pomijanie menu gry itp.), który jest tylko obszarem gry z odkrytymi kośćmi, z wszelkimi aktywami, które testowałem w tym czasie. Zasadniczo więc kompiluję alternatywny plik wykonywalny, który automatycznie ładuje bardzo zredukowany poziom (mniej zasobów do załadowania + brak potrzeby za każdym razem z menu gry).
Superbest
@ JonasByström Dzielę swoje gry na „tryby”. Jest to po prostu duża machina stanowa. Więc zazwyczaj mam tryb „Ekran tytułowy”, tryb „W grze”, tryb „Przewijania kredytów” itp. Są jak wbudowane gry w pliku wykonywalnym. Moje tryby „testowania” to np. „UITest”, który po prostu ładuje i rysuje interfejs użytkownika, nie ładując żadnej innej zawartości gry. Lub „RenderTest”, który załaduje i narysuje określony obiekt, bez ładowania czegokolwiek innego.
Trevor Powell,
@ JonasByström Gdy muszę utworzyć nowy tryb testowania, zwykle zajmuje kilka minut, aby napisać kod, który konfiguruje konkretną rzecz, którą chcę przetestować, i wszelkie zależności, które może mieć. Lub alternatywnie, często mogę dostosować istniejący tryb testowy w ciągu kilku sekund (na przykład. Ogólnie zmodyfikuję mój istniejący tryb testu UITest, aby załadować inny element interfejsu użytkownika, zamiast tworzyć nowy). Jednak tak naprawdę nie ma znaczenia, ile czasu zajmuje konfiguracja; chodzi o to, że po skonfigurowaniu mogę iterować z absurdalnie dużymi prędkościami, co pozwala mi produktywnie pracować w tym czasie iteracji.
Trevor Powell,
1
@ JonasByström Warto również zauważyć, że „kup szybszy komputer” jest całkowicie legalnym rozwiązaniem pytania „jak skrócić czas iteracji”. I często może to być najtańsze rozwiązanie w porównaniu z inwestowaniem czasu we wdrażanie specjalnych platform testowych. Skrócenie czasu iteracji to inwestycja , w którą wkładasz dużo czasu / pieniędzy / wysiłku z góry, ale która przynosi wiele dywidend.
Trevor Powell,
20

Aby dobrze prototypować, zmniejsz koszty testowania pomysłów.

Mój przepływ pracy jest dostosowany do małych gier, ale uważam, że te rzeczy są pomocne:

  • Technologia przyjazna dla prototypów  Uważam, że pomocne jest używanie dynamicznego języka programowania i frameworka, takiego jak Lua ( LÖVE jest fajny dla 2D), JavaScript lub Lisp / Scheme, gdzie nakłonienie programu do zrobienia czegoś wymaga minimalnego naciśnięcia klawiszy, nawet kosztem wszystkiego innego. Gdy wiesz, czego chcesz i chcesz go udoskonalić, zoptymalizuj lub przenieś do innego silnika.
  • Kontrola wersji  Przechowuj prototypy w repozytorium kontrolowanym pod kątem wersji. Oddział wcześnie, gałąź często. Dzięki temu możesz wygodnie próbować rzeczy bez obawy, że coś zgubisz lub zapomnisz. ( Git ma najtańszy model rozgałęziania.)
  • Zbuduj automatyzację  Upewnij się, że musisz zrobić tak mało, jak to możliwe, aby faktycznie uruchomić program. Moim zdaniem, nawet konieczności naciskania przycisku jest zbyt wiele, zazwyczaj mają Makefileo make watchcel, który działa inotifywaitw pętli, w reakcji na zmiany pliku automatycznie kompilacji / uruchamiania gry. W języku interpretowanym lub skompilowanym w JIT jest to natychmiastowe.
Anko
źródło
1
Lua nie wydaje się obsługiwać kodu wymiany. Czy to oznacza, że ​​musisz ponownie uruchomić grę / prototyp, aby przetestować zmiany?
Jonas Byström
6
Zamiana kodu Lua jest zdecydowanie możliwa.
Josh
1
@ JonasByström Jest to możliwe, ale tylko w odpowiednim środowisku. Jeśli nie możesz go znaleźć, napisz jeden, kod źródłowy Lua jest napisany w C, więc jest przenośny dla wszystkiego, co akceptuje wywołania funkcji w stylu C. Połącz go z OpenGL, SDL 2 lub inną biblioteką opakowującą grafiki / harware i stwórz sobie IDE z funkcją hotswapping.
Pharap
2
@ JonasByström Oto jak to zrobić z obsługą IDE i bez .
Anko,
2
@ JonasByström: ... z wyjątkiem powrotu na Księżyc, najwyraźniej. :(
Mason Wheeler
11

Jako programista skupiający się głównie na prototypowaniu, oto kilka porad z mojego doświadczenia.

  1. Użyj silnika, który pozwala SZYBKO wprowadzać zmiany. Obejmuje to między innymi „Nie czekanie na kompilację”, ale także „zmianę rzeczy w czasie wykonywania”, „łatwość debugowania”, „dostępność zasobów testowych” itp. Osobiście uwielbiam Unity3D, ale nie jest to najlepsze narzędzie. Najlepsze narzędzie zależy od gry: na przykład Unreal Engine kompiluje kod znacznie wolniej niż Unity3D, ale może szybko uruchomić wielu połączonych klientów. W przypadku gry sieciowej często kompensuje to koszty kompilacji. Weź również pod uwagę znajomość. Jeśli jesteś fanem C ++, nawet najlepszy silnik JavaScript nie przyniesie wiele dobrego i na odwrót. Nie marnuj czasu na walkę z nieznaną technologią (to znaczy ucz się innych języków / frameworków, ale nie w tym samym czasie, gdy tworzysz ważne prototypy).
  2. Dowiedz się, jak bezlitośnie usuwać istniejące funkcje. Trzymanie się rzeczy, które już zaimplementowałeś, jest przekleństwem udanego prototypowania, ale puszczenie pracy jest ciężkie.
  3. Jeśli nie współpracujesz z projektantem gier, postaw wyraźną granicę między „noszeniem czapki programisty” a „noszeniem czapki projektanta”. Dodanie nowej fajnej funkcji gry wydaje się bardzo kuszące, ale nie rób tego, gdy jesteś na pozycji projektanta. Staraj się raczej tworzyć zabawną rozgrywkę (najlepiej wiele wariantów) z tym, co masz; sporządzić listę funkcji, które mogłyby pomóc, a następnie wdrożyć (niektóre) je.
  4. Szybkie prototypowanie polega na równoważeniu dwóch przeciwieństw. Chcesz tworzyć rzeczy tak szybko, jak to możliwe, więc piszesz zły kod. Ale chcesz jak najwięcej zmieniać rzeczy, więc musisz napisać dobry kod! Naucz się równoważyć te dwa. Niestety nie mogę wymyślić żadnej konkretnej porady, jak to zrobić, ale przynajmniej zdaj sobie sprawę z tego problemu (-8

Sprawdź, ile czasu wymaga prototypowanie. Z mojego doświadczenia wynika, że ​​chcesz mieć grywalną wersję czegokolwiek w ciągu maksymalnie dwóch dni - od zera; i chcesz codziennie testować jedną lub dwie nowe funkcje. Jeśli nie osiągasz tych celów, poszukaj sposobów, aby być szybszym.

Nieważne
źródło
Myślę, że cechy różnią się od eksploracji zachowań. Chcę odkryć „charakter”. Funkcje są dla mnie jak piękne renderowanie: nieistotne i niepowiązane z tym, jak fajna będzie gra. Minecraft, Candy Crush, Tetris i podobne gry dowodzą, że IMHO.
Jonas Byström
@Jonas Byström Aby wyjaśnić: tutaj przez „funkcje” mam na myśli istotne zmiany w rozgrywce. W szczególności NIE jest to piękny rendering, ale coś w stylu „dodaj sposób tworzenia bloków” lub „dodaj moby atakujące i zabijające gracza” podczas prototypowania Minecrafta.
Nevermind
1
Nie można przecenić znaczenia drugiego punktu, jakim jest „pozostawienie funkcji”. Wiele faz eksploracyjnych kończy się niepowodzeniem, ponieważ nie powiedziano „nie” tej nieudanej funkcji, której wdrożenie zajęło 2 tygodnie.
Kostas
Uwaga do punktu 4. Myślę, że kluczem do tego jest zrozumienie, co będzie trzeba szybko zmienić w kodzie. Pamiętaj, aby ujawnić wartości, które wiesz, że chcesz poprawić. Pozostaw inne sekcje kodu zakopane, jeśli wiesz, że nie wpływają one tak bardzo na rozgrywkę, i ujawnij je później, gdy zajdzie taka potrzeba. Musisz to szybko rozwiązać, ale jeśli możesz spróbować zaprojektować architekturę od samego początku, aby elementy „projektowania gier” były skierowane do przodu i czyste, o ile to możliwe, reszta może być zepsuta.
Sydney
1
@sydan niefortunną prawdą jest to, że twoje wyobrażenie o tym, czym jest kod skierowany do przodu, jest błędne. To znaczy ZAWSZE okazuje się, że coś, czego nigdy nie powinieneś zmieniać, jest w rzeczywistości bardzo dynamiczne. Podczas prototypowania lepiej być przygotowanym na zmianę dosłownie każdego aspektu i zrobić to szybko.
Nevermind,
5

Rozwój gry można podzielić na cztery następujące fazy:

  • prototypowanie
  • dopracowanie rozgrywki
  • rozwój
  • udoskonalenie wydajności

Wydaje mi się, że eksploracja rozgrywki odbywa się głównie na etapie prototypowania. Oto kilka porad, które staram się stosować:

  • Rozpocznij projektowanie od papierowego prototypu. Po zrozumieniu, czym może być ta gra, zacznij ją kodować, aby naprawdę poczuć interakcje. Być może jest to bezużyteczne w przypadku gier 3D, ale osobiście bardzo mi pomogło w przeszłości.

  • Kod wiedząc, że po zakończeniu wyrzucisz swój kod. Pozwoli ci to być liberalnym, jeśli chodzi o wybór silnika gry.

  • Ważne są szybkie cykle iteracji (jak zauważyli wcześniej inni). Wybierz silnik gry na podstawie jego zdolności do szybkiego pokazania, co napisałeś. Na tym etapie nie musisz również przejmować się wydajnością ani wiernością graficzną.

  • Ogranicz swój zakres. Jeśli rzeczywista rozgrywka to 2D (zwykła gra strategiczna, JRPG), prototyp w 2D. W tej fazie zależy tylko na opiniach na temat rozgrywki .

  • Nie trać czasu na polerowanie lub wyszukiwanie zasobów. Wypisz coś na papierze, zrób zdjęcie, wytnij w Photoshopie, może pokoloruj i użyj jako duszka. Włącz mikrofon i powiedz „pew pew”. Połącz dwie kostki i kulę, a otrzymasz robota. Zawsze miej na uwadze, odkrywanie możliwości gry jest Twoim pierwszym i jedynym priorytetem.

Po podjęciu decyzji o zabawnym prototypie zacznij go udoskonalać. Nie sądzę, aby istniał powód do zmiany technologii, chyba że istnieje element rozgrywki, który tego potrzebuje.

Później w fazie rozwoju będziesz mieć pod ręką wyrafinowany prototyp, opracowując nową, znacznie lepiej wyglądającą, o wiele lepiej brzmiącą, o wiele lepiej czującą grę. Tutaj musisz wybrać rzeczywisty silnik gry, którego chcesz użyć.

Na koniec weź to, co masz i dostrój, aby zużywać mniej zasobów.

Większość tego, co opisuję powyżej, to powszechna wiedza, ale umieszczenie jej na liście, dzieląc cały proces rozwoju, pomaga mi spojrzeć na każdy krok z innej perspektywy. Mam nadzieję, że ci to pomoże.

Kostas
źródło
1
Papierowe zdjęcie i „pew pew” to doskonała rada; i tak - listy mi też pomagają. „Określ swoje trzy najważniejsze priorytety. Wyrzuć numery dwa i trzy.” :)
Jonas Byström,
4

Zgadzam się z odpowiedzią Trevora Powella, że szybkość iteracji ma kluczowe znaczenie dla pozostania w twórczym nastroju, a nie tylko polerowania. Dużym źródłem inspiracji jest dla mnie przemówienie Bret Victor „Inventing on Principle” . Niestety na tym poziomie trudno znaleźć prawdziwe narzędzia. Sam próbowałem zbudować taki do programowania w języku Python, który pozwala mi uruchamiać kod Python podczas pisania. Nazywa się to Live Coding w Pythonie .

Don Kirkby
źródło
1
Widziałem już vid, ale o tym zapomniałem. Hm Natychmiastowa interakcja jest naprawdę czymś, do czego należy dążyć; Spróbuję zastosować się do twojej rady. Dobra robota na interesującą wtyczkę Live Coding btw!
Jonas Byström
2

Zbudowałem narzędzie do prototypowania o nazwie Trabant, które:

  • jest TYLKO 3D i mechaniką gry (bez interfejsu użytkownika, bez tekstu, bez niczego);
  • wymaga bardzo małego kodu i żadnych zasobów do zbudowania prototypu;
  • Modele 3D są tworzone w kodzie przy użyciu grafiki ASCII ;
  • umożliwia iteracje podsekundowe;
  • ma wsparcie symulacji sztywnego ciała;
  • działa na systemach Windows, Mac, Linux i iOS;
  • używa dobrze znanego języka ogólnego przeznaczenia, Python;
  • ma IDE dla Windows i iOS.

Zbudowałem w nim 30 prototypów testowych, aby zweryfikować powyższe.

Jak podkreślał Trevor Powell, iteracje muszą wynosić <5 sekund, a iteracje <1s uważam za prawie pięć razy lepsze.:)

Anko wspomniała, że używanie dynamicznego języka jest dobrym pomysłem, wybrałem Python, ponieważ jest jednym z najczęściej używanych . Jeśli chodzi o automatyzację kompilacji, testowanie w Trabant jest tak szybkie, jak naciśnięcie klawisza F5 w IDE (lub F6, aby przetestować go na iPadzie), a ponieważ nie jest wymagany żaden etap kompilacji, nie robi się to natychmiast.

Kod wyrzucenie był jednym z Nevermind na wynos . Całkowicie się zgadzam i Trabant to egzekwuje.

Jonas Byström
źródło
1

Oprócz naprawdę ważnej prędkości iteracji Trevora Powella, oto kilka innych przydatnych uwag:

To jak dobry kod ...

Jest tam wiele IF.

Im bardziej solidna koncepcja, tym mniej trzeba się bawić. Jeśli wiesz, czym jest twoje mięso, prototypowanie staje się - co umieścić i jak ustawić rzeczy w stosunku do centralnego filaru (twoje najważniejsze).

Jeśli zaczynasz jak wiele innych - nie do końca pewny, co chcesz zrobić, idziesz w jednym kierunku i eksplorujesz wiele na drodze pokazanego obrazu.

Tak czy inaczej zaangażowanie w technologię nie ma znaczenia, jeśli to, czego szukasz, może być symulowane bez dużej głębi - prototypuj to, co chcesz / możesz.

Nie marnuj ani sekundy dodatkowej ilości zasobów. Pobierz wszystko z Internetu. Własne czy nie. Chcesz poczuć swoją koncepcję w pracy - chyba że grafika jest Twoją główną cechą, nikt nie pozwie Cię za eksperymentowanie z dźwiękami, teksturami i innymi rzeczami innych ludzi, nie umieścisz go jeszcze na półce w sklepie. Chyba że masz już fundusze - przekonanie ludzi, że koncepcja jest warta, to rzecz, która przyniesie ci pieniądze na zdobycie potrzebnych zasobów. Widziałem, jak ludzie studia gier prezentują koncepcje gier ze zmodyfikowanymi wersjami zastrzeżonych gier, do których nie mają żadnych praw.

To tak, jakbyś budował model w skali. Chociaż niesamowite jest mieć miniaturową replikę życia tego, czego chcesz. Czasami wystarcza, aby wyciąć go z czasopism, wykonać ręcznie i skleić elementy razem. Wszyscy z odrobiną wyobraźni nie będą zakładać, że zbudujesz wieżowiec z tego samego kartonu, z którym pokazałeś model w skali. A w branżach kreatywnych - lepiej jest pracować z ludźmi z wyobraźnią. Jeśli nie będą w stanie spojrzeć w przeszłość na pewne problemy, aby dostrzec potencjał całej koncepcji, rzadko, jeśli w ogóle, docenią produkt. Brak uznania oznacza, że ​​są mniej skłonni do popełniania zobowiązań i jest to spirala spadkowa. To różnica między ustaleniem postawy twojego dziecka, by podbić świat, a powiedzeniem „Nie możesz nawet odpowiednio zawiązać butów, mały głupku,

Cokolwiek robisz, zawsze pamiętaj, że sama postawa jest więcej niż wystarczająca do zrujnowania czegokolwiek absolutnie niezależnie od jego potencjału technologicznego lub gospodarczego.

Kiedyś prototypowałem grę, używając wyłącznie obrazów gif i dając im coś wspólnego z javascript. Nie jest olśniewający, ale służył pokazaniu tego, co chciałem pokazać. Nie ma znaczenia, czy później opracujesz go wyłącznie na konsolę Xbox.

Jeśli Twój pomysł jest bardziej złożony niż prosty prototyp, będziesz musiał zbadać technologię, z której będziesz korzystać - ponieważ prototyp będzie rusztowaniem dla ostatecznej rzeczy (po prostu dlatego, że dużo zainwestowano w i nie można go lekko wyrzucić) - jeśli oczywiście zostanie zatwierdzony.

helena4
źródło
Prototypowanie jest wymagane tylko wtedy, gdy budujesz coś nowego, to jest dane. Brak narzędzi przypomina brak pióra i papieru - i na pewno można rysować w piasku, ale jest nieefektywny. Zbudowałem Trabant, aby uniknąć konieczności korzystania z GIF + JS lub Scratch .
Jonas Byström,