Come posso mantenere sincronizzati due giocatori di corse?


8

Sto lavorando a un gioco mobile Unity, proprio come una versione multiplayer di Temple Run . Sto vedendo una latenza di rete fluttuante (generalmente 200-500ms) a causa della piattaforma mobile.

I personaggi dei due giocatori vengono mostrati correndo lungo lo stesso percorso e devono compiere azioni semplici (salto, scorrimento, power-up, ecc.) Per superare gli ostacoli.

Quando un messaggio arriva in ritardo, il gioco presuppone che il giocatore remoto abbia superato un ostacolo. Questo di solito funziona bene, ma nel caso in cui un giocatore venga ucciso da un ostacolo, voglio che il giocatore remoto appaia morire sullo stesso ostacolo / posizione del giocatore locale. A causa della latenza, il giocatore remoto sembra aver attraversato l'ostacolo prima ancora che arrivi il messaggio che annuncia la sua morte.

Come posso mantenere sincronizzati i giocatori?


Ho provato a spostare immediatamente il giocatore remoto nella posizione di morte dei giocatori locali quando arriva il messaggio di morte, sembra imbarazzante visivamente e potrebbe sollevare altri problemi di sincronizzazione.

Risposte:


10

Analisi del problema

La comunicazione in tempo reale su una connessione ad alta latenza è ovviamente impossibile.

È possibile , naturalmente, tentare un'illusione (come si sta facendo, rendendo il giocatore a distanza sembra aver superato un ostacolo, quando non è ancora noto). Quando quell'illusione fallisce (come fa la tua quando il giocatore remoto in realtà non ha superato l'ostacolo, ma invece è morto ) non si può più fare nulla.

il problema

In un caso (come qui) in cui il fallimento dell'illusione sembra davvero grave , potrebbe essere più facile accettare i fatti e fare semplicemente del tuo meglio per rappresentare la situazione così com'è.

Soluzione potenziale

Che ne dici di rallentare letteralmente l'altro giocatore se la sua decisione richiede tempo per propagarsi?

una soluzione

Ogni giocatore vede un'immagine dell'altro, ma quell'immagine rallenta quando si avvicinano ostacoli per i quali il messaggio decisionale è ancora in aria. Solo una volta ricevuto il messaggio sembrano superare o superare l'ostacolo. Dopo l'ostacolo, l'immagine accelera di nuovo per raggiungere, rallentando di nuovo per il successivo, se necessario.

Su una connessione a bassa latenza, la decisione arriva presto e il rallentamento e l'accelerazione saranno trascurabili. Su una connessione ad alta latenza, questo farà sembrare l'altro giocatore in ritardo, ma assicura che lo stato di gioco più importante di "chi ha superato questo ostacolo" sia coerente per entrambi i giocatori.


Grazie per la tua risposta. Abbiamo già provato la potenziale soluzione che hai proposto ma non l'abbiamo trovata possibile per i seguenti motivi: 1.Il primo motivo è l'alta velocità del mio gioco. Per coprire una finestra di 200ms dovrei rallentare il giocatore remoto a 1/4 della velocità che provoca un'anomalia visiva molto spiacevole e visibile specialmente nel caso in cui il giocatore correva fianco a fianco. 2. Poiché la latenza è fluttuante, è davvero difficile calcolare la riduzione di velocità per il giocatore remoto che garantirebbe che il messaggio arrivi prima che attraversi l'ostacolo.
Zohaib Javed

2
@ZahaibJaved Spesso l'unica vera soluzione è nascondere la latenza attraverso le animazioni. Invece di rallentare mentre si avvicinano all'ostacolo, considera di fermarti completamente al limite ed eseguire un'animazione "prepararsi a saltare" che impiega un secondo intero per giocare. Una volta che il pacchetto "ce l'hanno fatto" arriva, esegui il salto vero e vai avanti nella loro posizione reale.
BlueRaja - Danny Pflughoeft

Mi scuso per aver risposto tardi. Quindi la soluzione che ho implementato all'inizio è stata filmata in cui tutti i giocatori possono essere visti. Il giocatore locale è sempre in prima posizione. Al termine del filmato. Sposto tutto il giocatore remoto abbastanza indietro in modo che possano avere un po 'di tempo per ricevere le informazioni che il giocatore locale è morto su un ostacolo specifico o scivolare o saltare correttamente sul percorso. E alla fine c'è un percorso rettilineo in cui sincronizzo nuovamente i giocatori. Quindi quel risultato viene visualizzato correttamente.
Zohaib Javed,

4

Per completare la risposta di Anko, puoi modificare un po 'il design del tuo gioco aggiungendo la conseguenza dell'ostacolo fallito dopo il fallimento, ad esempio un salto fallito porta all'atterraggio in una pozza di fango che squalifica il giocatore. In questo modo l'altro giocatore nota il fallimento vedendo l'altro cadere nel fango, mentre il giocatore che fallisce lo vede subito.

Ecco un bel post sul blog su questo problema (non è così recente ma è abbastanza interessante): Time Management and Synchronization di Darrin West .


1

È così importante per il giocatore locale conoscere la posizione esatta della morte del giocatore remoto? Supponiamo che il giocatore remoto non possa saltare uno dei tuoi ostacoli e quindi sia morto.

Il giocatore morto vedrebbe la loro morte immediatamente e continuerebbe dal luogo dell'incidente. Niente di magico qui.

Il giocatore locale (quello ancora vivo e calciato) vedrebbe il giocatore remoto superare l'ostacolo con successo. Sarebbe arrivata una notifica di morte. Il giocatore remoto sarebbe inciampare in piedi, cadere e svanire lentamente. La prossima volta che conosci la posizione del giocatore remoto, il giocatore si dissolverebbe in quella posizione esatta, correndo di nuovo normalmente. In una tale configurazione, i giocatori sarebbero consapevoli della latenza, ma la latenza sarebbe rappresentata come un elemento di gioco (inciampare) piuttosto che apparire a scatti e scomparire i giocatori.

Se la velocità dei due giocatori è costante, la traiettoria di corsa è predefinita e il tempo necessario per riprendersi da una caduta è noto, è possibile eliminare completamente la parte in dissolvenza / scomparsa. Immagina un giocatore remoto che muore a causa di uno degli ostacoli. La sua rappresentazione locale è ancora in esecuzione quando arriva una notifica. Il giocatore viene mostrato inciampare immediatamente. Ci vuole tempo per alzarsi e ricominciare a correre. In realtà, ci vuole tanto tempo come se fossero mostrati morire all'ostacolo. Pertanto, quando sono di nuovo attivi e funzionanti, le posizioni locale e remota sono sincronizzate.

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.