Come posso implementare una funzione di "avanzamento rapido" nel mio gioco?


15

Come posso implementare la funzione di avanzamento rapido per il mio gioco di difesa della torre come in http://fieldrunners.com/ e altri giochi TD?

Sto usando Unity 3D. Ci sarebbe qualcosa per gestire un minor numero di fotogrammi al secondo o una sorta di spostamento manuale rapido dei nemici e la velocità di sparo della torre, eccetera?


hai provato ad aumentare la frequenza di aggiornamento ?? potresti dover saltare i frame ..
concept3d

Risposte:


7

se il tuo gioco non ha simulazioni complicate o costose dal punto di vista computazionale che richiedono di separarle in tempistiche di aggiornamento indipendenti, puoi utilizzare un semplice approccio per basare il codice nelle tue Update()funzioni sul valore Time.time di Unity e nel tuo codice impostare il valore di Time .timeScale per essere quello che vuoi. 0 == in pausa, 1 = normale, i nostri tester amano impostare timeScale> 1 per fare le cose più velocemente.

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


18

Approccio: velocità di simulazione più elevata

I tempi per l'interfaccia utente dovrebbero essere disaccoppiati dal ciclo di gioco reale, così come il rendering. Supponiamo ad esempio che il tuo mondo funzioni a velocità 4x. Diciamo che alla tua velocità di base (1x), il tuo gioco esegue 30 aggiornamenti al secondo.

Avresti quindi qualcosa di simile al seguente, quando in modalità di avanzamento rapido:

  • La logica mondiale esegue 4 aggiornamenti per ogni aggiornamento dell'interfaccia utente e del renderer. Ciò significa che deve eseguire 120 aggiornamenti al secondo. Pertanto, il tuo modello mondiale (dati) viene aggiornato a questo ritmo.
  • La logica di rendering e UI continuano entrambi a eseguire il polling o a fare qualsiasi cosa con 30 aggiornamenti al secondo.

In altre parole, il gioco nel suo insieme non funziona più velocemente. La parte di simulazione è.

Puoi dedurre due cose da questo:

  1. Devi mantenere la tua logica di gioco abbastanza semplice da poterla eseguire facilmente quattro volte più velocemente sulla tua piattaforma di destinazione, OPPURE devi introdurre metodi per estrapolare più rapidamente vari aspetti del gameplay; ciò può comportare, tuttavia, un modello che è diverso da come sarebbe stato se avessi semplicemente usato una simulazione più veloce. Quindi il compromesso sarebbe l'elaborazione dei costi per l'accuratezza. Vedi l'approccio 2, di seguito.

  2. È la separazione delle preoccupazioni che ti consente di velocizzare facilmente la tua simulazione mondiale, essendo quella separazione come modello, vista e controller ( MVC ). Se i tuoi dati mondiali (M), la logica di rendering (V) e la logica di gioco (C) sono tutti confusi, non sarai davvero in grado di farlo, almeno non senza un'enorme emicrania.

Approccio: estrapolazione basata su delta temporali

Come accennato in precedenza, dovrai calcolare il movimento in base alla distanza percorsa da qualcosa in un determinato momento. Questo presuppone che la fisica del tuo gioco sia intrinsecamente più realistica nella loro simulazione, tuttavia, che potrebbe non essere il caso. Questo è un argomento piuttosto più ampio e considerevolmente più complesso. Dovrai porre ulteriori domande se vuoi sapere. In sostanza, eseguirai alcuni calcoli per ottenere le cose giuste. Dovrai affrontare la compenetrazione in caso di collisione e una serie di altre questioni che non affronterò qui.

Concludere

Questo ti dà lo schema generale. La scelta della lingua è tua, presumibilmente o sai come farlo in Unity oppure no. Il tempismo in qualsiasi lingua richiede di comprendere in dettaglio i dettagli, suggerirei di iniziare con gli articoli di Gaffer e di consultare i documenti dell'API di Unity.


Se si intende utilizzare l' approccio con un tasso di simulazione più elevato e si desidera supportare il rallentamento , probabilmente è necessario disporre effettivamente di un tasso di simulazione di base estremamente lento , quindi eseguirlo per impostazione predefinita in 100 passaggi / frame di simulazione.
Bobobobo,

9

Come principio generale, l'aggiornamento della logica di gioco dovrebbe essere disaccoppiato dall'aggiornamento della grafica del gioco, vale a dire la simulazione del tuo gameplay, l'intelligenza artificiale, il movimento delle unità, eccetera, non dovrebbero essere legati alla velocità con cui il gioco sta eseguendo il rendering . Di solito il ciclo di gioco principale calcola quanto tempo reale è trascorso dall'ultimo aggiornamento del gioco e invia quel passaggio delta del tempo alle routine di aggiornamento di ogni singolo oggetto di logica di gioco.

In tale scenario, diventa semplice implementare il ridimensionamento del tempo (incluso l'avanzamento rapido) nel tuo gioco. Basta moltiplicare anticipatamente il tempo logico del gioco per un valore scalare che controlla quanto "avanzare rapidamente" o rallentare il tempo. Per impostazione predefinita, questo valore sarebbe uno e, ad esempio, quando l'utente preme il tasto "avanzamento rapido" lo imposti su 1,5 e tutta la simulazione sembrerebbe andare più veloce del 50%. Renderesti comunque alla stessa velocità, comunque.

Non ho molta familiarità con Unity e quindi potrei sbagliarmi nel seguente suggerimento, ma Unity ha una componente di gestione del tempo che può essere utile per implementarlo. In effetti ha già una proprietà cronologica. La descrizione del componente implica che la classe è stata progettata per oggetti di fisica, ma può essere applicabile anche al tuo scenario.


1
È sicuramente applicabile al suo scenario. Tutto ciò che dovrebbe fare è impostare Time.timeScale su un moltiplicatore e tutto andrà più veloce. È un cambiamento generalizzato, quindi se ci sono cose come interazioni di menu e simili andranno anche più veloci.
Tetrad,

grazie ancora Tetrad :)
Syed
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.