¿Cómo hacer una entrada retrasada del mouse?

11

Tengo un juego de autos y la idea es que el jugador esté borracho. Quiero tener una entrada retrasada del mouse, donde mueves el mouse de lado a lado para girar.

¿Cómo puedo configurar un retraso constante entre la entrada que da el usuario y la cantidad de giro del automóvil?

En este momento tengo esto:

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

Lo que sucede es que el giro se retrasa, pero es muy lento, en otras palabras, si muevo el mouse muy rápido, el auto gira muy lentamente, pero si hago Time.deltaTimegirar el multiplicador , el auto gira más rápido, pero el efecto de retraso se minimiza .

¿De qué otra forma podría hacer esto?

señor-mate
fuente

Respuestas:

31

Para simular un intervalo de tiempo, use un búfer circular para almacenar las últimas posiciones de mouse de N cuadros. Almacene la posición actual del mouse en cada cuadro. En sus cálculos de control, use la posición más antigua del mouse del búfer en lugar de la posición actual del mouse.

Buster
fuente
1
En realidad lo resolví, solo usé una corutina con una espera de segundos. Me preocuparía el rendimiento con esta técnica, si tienes un dispositivo realmente rápido, tendría un tiempo de retraso mucho menor que algo como un móvil.
Mr-Matt
2
Tenga en cuenta que retrasar una entrada como esta cambiará el resultado dependiendo de la tasa de sondeo.
Joey
66
Matthew, estoy un poco desconcertado ... ¿realmente quieres decir rendimiento? La penalización de rendimiento de escribir unos pocos bytes en la memoria por fotograma es perfectamente insignificante, y obtienes la posición del mouse libre con cada mensaje (al menos en Windows). ¿Cómo cree que funciona exactamente su solución de rutina? ¿Quién realiza un seguimiento de cuántos temporizadores existen, cuándo caducan y qué código ejecutar? Suena bastante pesado.
Buster
Oh no, no me refiero al desempeño de la tarea real de la demora, me refiero al desempeño general. Por ejemplo, si tomo la posición del mouse de los últimos 10 cuadros y ejecuto esto en un teléfono y obtengo 20 fps, entonces el retraso sería de 0.5 segundos. Sin embargo, si ejecuto esto en mi escritorio y obtengo 200 fps, entonces el retraso solo sería de 0.05 segundos. ¿Ves a lo que me refiero?
mr-matt
Elegiría N para evitar eso, pero el problema más grande es que el sondeo una vez por cuadro como este arroja muchos datos. Es mejor manejar cada evento del mouse (parece que eso es lo que hace su respuesta).
Buster
3

Terminé usando una rutina, porque (por lo que entiendo) el retraso será constante independientemente del rendimiento del dispositivo que ejecuta el juego.

Este es mi código:

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);
}
señor-mate
fuente
Esto tiene la ventaja de responder a todas las entradas (no como mi idea de sondear cada cuadro). No sé C #, pero me parece que alguien en algún lugar tiene mucha contabilidad para todos esos temporizadores. Pero si funciona bien y tiene la sensación que deseas, entonces me gusta.
Buster
Creo que esta es la mejor manera de hacerlo, no creo que los temporizadores afecten demasiado tu juego, por supuesto, puedes volver a esta pregunta con los resultados de tu experiencia con el rendimiento (para referencia futura). De todos modos, debes seguir adelante y elegir esto como la respuesta (esto es solo un recordatorio).
John Hamilton