Jak mogę wdrożyć funkcję „przewijania do przodu” w mojej grze?

15

Jak mogę wdrożyć funkcję szybkiego przewijania do mojej gry tower defense, takiej jak w http://fieldrunners.com/ i innych grach TD?

Używam Unity 3D. Czy byłoby coś do zarządzania mniejszą liczbą klatek na sekundę lub jakiś ręcznie ustawiony szybki ruch wrogów i prędkość strzelania z wieży, itd.?

Syed
źródło
próbowałeś zwiększyć częstotliwość aktualizacji? może być konieczne pominięcie ramek.
concept3d

Odpowiedzi:

7

jeśli twoja gra nie ma skomplikowanych lub kosztownych obliczeniowo symulacji, które wymagają rozdzielenia ich na niezależne ramy czasowe aktualizacji, możesz zastosować proste podejście polegające na oparciu kodu w swoich Update()funkcjach na wartości Time.time Unity, a w kodzie ustaw wartość Time .timeSkaluj, aby być tym, czego chcesz. 0 == wstrzymane, 1 = normalne, nasi testerzy uwielbiają ustawiać Skalę czasu> 1, aby szybciej wykonywać zadania.

http://unity3d.com/support/documentation/ScriptReference/Time-timeScale.html

Chroniczny programista gier
źródło
18

Podejście: wyższy wskaźnik symulacji

Twoje wyczucie interfejsu użytkownika powinno być oddzielone od rzeczywistej pętli gry, podobnie jak renderowanie. Powiedz na przykład, że twój świat biegnie z prędkością 4x. Powiedzmy, że przy podstawowej (1x) prędkości Twoja gra uruchamia 30 aktualizacji na sekundę.

W trybie szybkiego przewijania będziesz mieć coś takiego:

  • Światowa logika uruchamia 4 aktualizacje dla każdej aktualizacji interfejsu użytkownika i mechanizmu renderującego. Oznacza to, że musi uruchamiać 120 aktualizacji na sekundę. W ten sposób Twój model świata (dane) jest aktualizowany w tym tempie.
  • Renderowanie i logika interfejsu użytkownika nadal odpytują lub robią cokolwiek przy 30 aktualizacjach na sekundę.

Innymi słowy, gra jako całość nie działa szybciej. Część symulacyjna jest.

Możesz z tego wywnioskować dwie rzeczy:

  1. Musisz utrzymać logikę gry na tyle prostą, abyś mógł ją z łatwością uruchomić cztery razy szybciej na docelowej platformie, LUB musisz wprowadzić metody szybszej ekstrapolacji różnych aspektów gry - może to jednak skutkować modelem, który jest różni się od tego, co by było, gdybyś po prostu użył szybszej symulacji. Zatem kompromisem będzie koszt przetwarzania dla dokładności. Zobacz podejście 2 poniżej.

  2. To oddzielenie problemów pozwala z łatwością przyspieszyć symulację świata, przy czym separacją jest model, widok i kontroler ( MVC ). Jeśli twoje dane świata (M), logika renderowania (V) i logika gry (C) są pomieszane, naprawdę nie będziesz w stanie tego zrobić, przynajmniej nie bez ogromnej migreny.

Podejście: ekstrapolacja oparta na delcie czasowej

Jak wspomniano powyżej, musisz obliczyć ruch na podstawie tego, jak daleko coś by przebyło w danym czasie. Zakłada się jednak, że fizyka gry jest z natury bardziej realistyczna w symulacji, co może nie być prawdą. Jest to raczej większy temat i znacznie bardziej złożony. Musisz zadać więcej pytań, jeśli chcesz wiedzieć. Zasadniczo będziesz robić rachunek różniczkowy, aby wszystko było dobrze. Będziesz musiał poradzić sobie z przenikaniem się kolizji i wieloma innymi zagadnieniami, o których tu nie będę mówić.

Podsumowując

To daje ogólny zarys. Twój wybór języka należy do ciebie, prawdopodobnie albo wiesz, jak to zrobić w Unity, albo nie. Czas w każdym języku wymaga szczegółowego zrozumienia tajników, sugeruję zacząć od artykułów Gaffera i przejrzeć dokumenty Unity API.

Inżynier
źródło
Jeśli zamierzasz użyć wyższej częstotliwości symulacji metodę i chcesz wspierać spowolnienie , prawdopodobnie potrzebujesz naprawdę bardzo niskiej podstawowej częstotliwości symulacji, a następnie uruchom ją domyślnie na poziomie 100 kroków symulacji / klatki.
bobobobo
9

Zgodnie z ogólną zasadą aktualizacja logiki gry powinna być oddzielona od aktualizacji grafiki gry - to znaczy symulacja rozgrywki, sztuczna inteligencja, ruch jednostek itp. Nie powinny być powiązane z prędkością renderowania gry . Zwykle główna pętla gry oblicza, ile czasu rzeczywistego upłynęło od ostatniej aktualizacji gry, i przesyła ten krok czasu delta do procedur aktualizacji każdego pojedynczego obiektu logiki gry.

W takim scenariuszu łatwo jest wdrożyć skalowanie czasu (w tym szybkie przewijanie do przodu) w grze. Po prostu przedwcześnie zastosuj krok logiki gry o pewną wartość skalarną, która kontroluje, ile czasu można „przyspieszyć” lub spowolnić. Domyślnie ta wartość będzie wynosić jeden, a na przykład, gdy użytkownik naciśnie klawisz „przewijanie do przodu”, ustawisz go na 1,5, a cała symulacja będzie wydawać się szybsza o 50%. Jednak nadal renderowałbyś w tym samym tempie.

Nie jestem zbyt obeznany z Unity i dlatego może się mylić w poniższej sugestii, ale Unity ma komponent zarządzania czasem, który może być przydatny do wdrożenia tego. W rzeczywistości ma już właściwość czasu. Opis komponentu sugeruje, że klasa została zaprojektowana dla obiektów fizycznych, ale może mieć również zastosowanie do twojego scenariusza.


źródło
1
To zdecydowanie odnosi się do jego scenariusza. Musiałby tylko ustawić Time.timeScale na jakiś mnożnik i wszystko pójdzie szybciej. Jest to ogólna zmiana, więc jeśli są takie interakcje w menu i takie, będą one również działać szybciej.
Tetrad,
jeszcze raz dziękuję Tetrad :)
Syed