Wie mache ich eine verzögerte Mauseingabe?


11

Ich habe ein Autospiel und die Idee ist, dass der Spieler betrunken ist. Ich möchte eine verzögerte Eingabe von der Maus haben, bei der Sie die Maus zum Drehen hin und her bewegen.

Wie kann ich eine konstante Verzögerung zwischen der Eingabe des Benutzers und der Abbiegungsmenge des Autos einstellen?

Im Moment habe ich Folgendes:

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

Was passiert ist, dass die Kurve verzögert ist, aber sehr langsam, mit anderen Worten, wenn ich die Maus sehr schnell bewege, dreht sich das Auto sehr langsam, aber wenn ich den Multiplikator für Time.deltaTimeankurble, dreht sich das Auto schneller, aber der Verzögerungseffekt wird minimiert .

Wie könnte ich das sonst tun?

Antworten:


31

Um eine Zeitverzögerung zu simulieren, verwenden Sie einen Kreispuffer, um die Mauspositionen der letzten N Frames zu speichern . Speichern Sie die aktuelle Mausposition in jedem Frame. Verwenden Sie in Ihren Steuerungsberechnungen die älteste Mausposition aus dem Puffer anstelle der aktuellen Mausposition.


1
Ich habe es tatsächlich gelöst, ich habe nur eine Coroutine mit einer Wartezeit von Sekunden verwendet. Ich wäre besorgt über die Leistung mit dieser Technik. Wenn Sie ein wirklich schnelles Gerät haben, hat es eine viel geringere Verzögerungszeit als so etwas wie ein Mobiltelefon.
Herr-Matt

2
Beachten Sie, dass eine solche Verzögerung der Eingabe das Ergebnis abhängig von der Abfragerate ändert.
Joey

6
Matthew, ich bin ein bisschen verwirrt ... meinst du wirklich Leistung? Der Leistungsverlust beim Schreiben einiger Bytes in den Speicher pro Frame ist völlig vernachlässigbar, und Sie erhalten die Mausposition bei jeder Nachricht frei (zumindest unter Windows). Wie funktioniert Ihre Coroutine-Lösung Ihrer Meinung nach genau? Wer verfolgt, wie viele Timer existieren, wann sie ablaufen und welchen Code ausgeführt werden soll? Es klingt ziemlich schwer.
Buster

Oh nein, ich meine nicht die Leistung der eigentlichen Aufgabe der Verzögerung, ich meine die Gesamtleistung. Wenn ich zum Beispiel die Mausposition der letzten 10 Bilder nehme und diese auf einem Telefon ausführe und 20 fps erhalte, beträgt die Verzögerung 0,5 Sekunden. Wenn ich dies jedoch auf meinem Desktop ausführe und 200 fps erhalte, beträgt die Verzögerung nur 0,05 Sekunden. Verstehst du, was ich meine?
Herr-Matt

Sie würden N wählen, um dies zu vermeiden, aber das größere Problem ist, dass das Abrufen einmal pro Frame wie dieses viele Daten wegwirft. Besser mit jedem Mausereignis umgehen (so sieht Ihre Antwort aus).
Buster

3

Am Ende habe ich eine Coroutine verwendet, da (soweit ich weiß) die Verzögerung unabhängig von der Leistung des Geräts, auf dem das Spiel ausgeführt wird, konstant bleibt.

Das ist mein 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);
}

Dies hat den Vorteil, auf alle Eingaben zu reagieren (nicht wie meine Idee, jeden Frame abzufragen). Ich kenne C # nicht, aber es scheint mir, dass irgendwo jemand viel Buchhaltung für all diese Timer zu tun hat. Aber wenn es in Ordnung ist und das Gefühl hat, das Sie wollen, dann gefällt es mir.
Buster

Ich denke, dies ist der bessere Weg, ich glaube nicht, dass Timer Ihr Spiel so sehr beeinflussen werden. Natürlich könnten Sie mit den Ergebnissen Ihrer Erfahrung mit der Leistung (als zukünftige Referenz) auf diese Frage zurückkommen. Auf jeden Fall sollten Sie dies als Antwort auswählen (dies ist nur eine Erinnerung).
John Hamilton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.