遅延マウス入力を行う方法は?


11

私はカーゲームをしていて、プレイヤーが酔っているという考えがあります。マウスを左右に動かして回転させる、マウスからの入力を遅らせたいのですが。

ユーザーが与える入力と車の回転量の間に一定の遅延を設定するにはどうすればよいですか?

今私はこれを持っています:

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

何が起こるかはターンが遅れますが、非常に遅いです。つまり、マウスを非常に速く動かすと、車の旋回は非常に遅くなりますが、乗数を上げるTime.deltaTimeと、車の旋回は速くなりますが、遅延の影響は最小限に抑えられます。

他にどのようにこれを行うことができますか?

回答:


31

タイムラグをシミュレートするには、循環バッファを使用して、最後のNフレームのマウス位置を保存します。各フレームの現在のマウス位置を保存します。コントロールの計算では、現在のマウス位置の代わりに、バッファーからの最も古いマウス位置を使用します。


1
私は実際にそれを解決しました、私はコルーチンをwaitforsecondsで使用しました。私はこのテクニックのパフォーマンスについて心配します。もしあなたが本当に速いデバイスを持っているなら、それはモバイルのようなものよりもずっと低い遅延時間を持っているでしょう。
mr-matt 2017年

2
このように入力を遅延させると、ポーリングレートに応じて結果が変わることに注意してください。
ジョーイ

6
マシュー、私は少し戸惑っています...あなたは本当にパフォーマンスを意味しますか?フレームごとに数バイトをメモリに書き込むことによるパフォーマンスの低下は完全に無視でき、すべてのメッセージで(少なくともWindowsでは)マウスの位置が解放されます。コルーチンソリューションはどのように正確に機能すると思いますか?存在するタイマーの数、有効期限、実行するコードを追跡するのは誰ですか?かなり重いですね。
バスター

ああ、いいえ、私は遅延の実際のタスクのパフォーマンスを意味するのではなく、全体的なパフォーマンスを意味します。たとえば、最後の10フレームのマウス位置を取得し、これを電話で実行して20 fpsを取得すると、遅延は0.5秒になります。ただし、これをデスクトップで実行して200 fpsを取得した場合、遅延は0.05秒しかありません。分かりますか?
mr-matt 2017年

これを避けるにはNを選択しますが、より大きな問題は、このようにフレームごとに1回ポーリングすると大量のデータが破棄されることです。すべてのマウスイベントを処理する方が良い(それがあなたの答えがそうであるように見えます)。
バスター

3

(私が理解していることから)ゲームを実行しているデバイスのパフォーマンスに関係なく遅延が一定になるため、私はコルーチンを使用することになりました。

これは私のコードです:

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);
}

これには、すべての入力に応答するという利点があります(すべてのフレームをポーリングするという私の考えとは異なります)。私はC#を知りませんが、どこかの誰かがこれらすべてのタイマーのためにやるべきことがたくさんあるようです。しかし、それが大丈夫で、あなたが望む感じを持っているなら、私はそれが好きです。
バスター

私はこれがより良い方法だと思います。タイマーがゲームにそれほど影響を与えるとは思いません。もちろん、パフォーマンスに関する経験の結果でこの質問に戻ることができます(将来の参照用)。とにかく、先に進んでこれを回答として選択する必要があります(これは単なる通知です)。
ジョンハミルトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.