Comment faire une entrée de souris retardée?

11

J'ai un jeu de voiture et l'idée est que le joueur est ivre. Je veux avoir une entrée retardée de la souris, où vous déplacez le côté de la souris pour tourner.

Comment puis-je configurer un délai constant entre l'entrée donnée par l'utilisateur et le nombre de tours de la voiture?

En ce moment, j'ai ceci:

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

Ce qui se passe, c'est que le virage est retardé, mais est très lent, en d'autres termes, si je déplace la souris très rapidement, la voiture tourne très lentement, mais si je monte le multiplicateur pour Time.deltaTime, la voiture tourne plus vite, mais l'effet de retard est minimisé .

Sinon, comment pourrais-je faire cela?

mr-matt
la source

Réponses:

31

Pour simuler un décalage temporel, utilisez un tampon circulaire pour stocker les positions de souris des N dernières images. Enregistrez la position actuelle de la souris à chaque image. Dans vos calculs de contrôle, utilisez la position de souris la plus ancienne du tampon au lieu de la position actuelle de la souris.

mec
la source
1
Je l'ai résolu en fait, je viens d'utiliser une coroutine avec un délai d'attente. Je serais préoccupé par les performances de cette technique, si vous avez un appareil vraiment rapide, il aurait un temps de retard beaucoup plus court que quelque chose comme un mobile.
mr-matt
2
Notez que retarder une telle entrée changera le résultat en fonction du taux d'interrogation.
Joey
6
Matthew, je suis un peu perplexe ... tu veux dire vraiment la performance? La pénalité de performance d'écrire quelques octets dans la mémoire par trame est parfaitement négligeable, et vous obtenez la position de la souris libre avec chaque message (sous Windows au moins). Comment pensez-vous que votre solution coroutine fonctionne exactement? Qui garde la trace du nombre de temporisateurs existants, de leur date d'expiration et du code à exécuter? Cela semble assez lourd.
Buster
Oh non, je ne parle pas de la performance de la tâche réelle du retard, je veux dire de la performance globale. Par exemple, si je prends la position de la souris des 10 dernières images et que je l'exécute sur un téléphone et que j'obtiens 20 fps, le délai serait de 0,5 seconde. Cependant, si j'exécute cela sur mon bureau et que j'obtiens 200 images par seconde, le délai ne sera que de 0,05 seconde. Est-ce que tu vois ce que je veux dire?
mr-matt
Vous choisiriez N pour éviter cela, mais le plus gros problème est que l'interrogation une fois par image comme celle-ci jette beaucoup de données. Mieux vaut gérer chaque événement de la souris (on dirait que c'est ce que fait votre réponse).
Buster
3

J'ai fini par utiliser une coroutine, car (d'après ce que je comprends), le retard sera constant quelles que soient les performances de l'appareil exécutant le jeu.

Voici mon code:

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);
}
mr-matt
la source
Cela a l'avantage de répondre à toutes les entrées (pas comme mon idée d'interroger chaque trame). Je ne connais pas C # mais il me semble que quelqu'un quelque part a beaucoup de comptabilité à faire pour tous ces temporisateurs. Mais s'il fonctionne bien et a la sensation que vous voulez, alors j'aime ça.
Buster
Je pense que c'est la meilleure façon de le faire, je ne pense pas que les minuteries affecteront beaucoup votre jeu, bien sûr, vous pouvez revenir à cette question avec les résultats de votre expérience avec la performance (pour référence future). Quoi qu'il en soit, vous devriez aller de l'avant et choisir cela comme réponse (ce n'est qu'un rappel).
John Hamilton