Come effettuare un input ritardato del mouse?


11

Ho un gioco di macchine e l'idea è che il giocatore sia ubriaco. Voglio avere un input ritardato dal mouse, in cui muovi il mouse da un lato all'altro per girare.

Come posso impostare un ritardo costante tra l'ingresso fornito dall'utente e la quantità di virata dell'auto?

In questo momento ho questo:

h = Mathf.Lerp(h, (((Input.mousePosition.x / Screen.width) * 2) - 1), Time.deltaTime * 2);

Quello che succede è che il turno è ritardato, ma è molto lento, in altre parole, se muovo il mouse molto velocemente, l'auto gira molto lentamente, ma se accendo il moltiplicatore per Time.deltaTime, l'auto gira più veloce, ma l'effetto del ritardo è ridotto al minimo .

In quale altro modo posso farlo?

Risposte:


31

Per simulare un ritardo, utilizzare un buffer circolare per memorizzare le posizioni del mouse degli ultimi N frame. Memorizza la posizione corrente del mouse in ciascun fotogramma. Nei calcoli di controllo, utilizzare la posizione del mouse più vecchia dal buffer anziché la posizione corrente del mouse.


1
In realtà l'ho risolto, ho appena usato un coroutine con secondi di attesa. Sarei preoccupato per le prestazioni con questa tecnica, se hai un dispositivo davvero veloce, avrebbe un ritardo molto inferiore rispetto a qualcosa come un cellulare.
sig. Matt del

2
Notare che ritardare l'input in questo modo cambierà il risultato in base alla frequenza di polling.
Joey,

6
Matthew, sono un po 'sconcertato ... intendi davvero performance? La penalità prestazionale di scrivere pochi byte nella memoria per frame è perfettamente trascurabile e si ottiene la posizione del mouse libera con ogni messaggio (almeno su Windows). Come pensi che la tua soluzione coroutine funzioni esattamente? Chi tiene traccia di quanti timer esistono, quando scadono e quale codice eseguire? Sembra piuttosto pesante.
Buster,

Oh no, non intendo la prestazione del compito effettivo del ritardo, intendo la prestazione complessiva. Ad esempio, se prendo la posizione del mouse degli ultimi 10 fotogrammi ed eseguo questo su un telefono e ottengo 20 fps, il ritardo sarebbe di 0,5 secondi. Tuttavia, se eseguo questo sul mio desktop e ottengo 200 fps, il ritardo sarebbe solo per 0,05 secondi. Capisci cosa intendo?
sig. Matt del

Sceglieresti N per evitarlo, ma il problema maggiore è che il polling una volta per frame come questo sta gettando via molti dati. Meglio gestire ogni evento del mouse (sembra che sia quello che fa la tua risposta).
Buster,

3

Ho finito per usare un coroutine, perché (da quanto ho capito) il ritardo sarà costante indipendentemente dalle prestazioni del dispositivo che esegue il gioco.

Questo è il mio codice:

private IEnumerator DelayedInput()
{
    Vector3 a = Input.acceleration;
    Vector2 m = Input.mousePosition;

    yield return new WaitForSeconds(delay);

    accelerometer = Vector3.Lerp(accelerometer, a, Time.deltaTime * turnSpeed);
    mouse = Vector2.Lerp(mouse, m, Time.deltaTime * turnSpeed);
}

Questo ha il vantaggio di rispondere a tutti gli input (non come la mia idea di eseguire il polling di ogni frame). Non conosco C # ma mi sembra che qualcuno da qualche parte abbia un sacco di contabilità da fare per tutti quei timer. Ma se funziona bene e ha la sensazione che vuoi, allora mi piace.
Buster,

Penso che questo sia il modo migliore per farlo, non credo che i timer influenzeranno molto il tuo gioco, ovviamente potresti tornare a questa domanda con i risultati della tua esperienza con le prestazioni (per riferimento futuro). Ad ogni modo, dovresti andare avanti e scegliere questa come risposta (questo è solo un promemoria).
John Hamilton,
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.