Bagaimana cara membuat input mouse yang tertunda?

11

Saya memiliki permainan mobil dan idenya adalah bahwa pemain mabuk. Saya ingin memiliki input yang tertunda dari mouse, tempat Anda menggerakkan mouse ke sisi untuk berbalik.

Bagaimana saya bisa mengatur penundaan konstan antara input yang diberikan pengguna dan jumlah putaran mobil?

Sekarang saya punya ini:

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

Yang terjadi adalah belokan tertunda, tetapi sangat lambat, dengan kata lain, jika saya menggerakkan mouse dengan sangat cepat, mobil berputar sangat lambat, tetapi jika saya menghidupkan pengali Time.deltaTime, mobil berubah lebih cepat, tetapi efek penundaan diminimalkan .

Bagaimana lagi saya bisa melakukan ini?

mr-matt
sumber

Jawaban:

31

Untuk mensimulasikan jeda waktu, gunakan buffer melingkar untuk menyimpan posisi mouse frame N terakhir . Simpan posisi mouse saat ini setiap frame. Dalam perhitungan kontrol Anda, gunakan posisi mouse tertua dari buffer alih-alih posisi mouse saat ini.

Buster
sumber
1
Saya memecahkannya sebenarnya, saya hanya menggunakan coroutine dengan waitforseconds. Saya akan khawatir tentang kinerja dengan teknik ini, jika Anda memiliki perangkat yang sangat cepat, itu akan memiliki waktu tunda yang jauh lebih rendah daripada sesuatu seperti ponsel.
mr-matt
2
Perhatikan bahwa menunda input seperti ini akan mengubah hasilnya tergantung pada tingkat polling.
Joey
6
Matthew, aku agak bingung ... apa maksudmu benar-benar kinerja? Hukuman kinerja menulis beberapa byte ke memori per frame benar-benar dapat diabaikan, dan Anda mendapatkan posisi mouse gratis dengan setiap pesan (setidaknya pada Windows). Bagaimana menurut Anda solusi coroutine Anda bekerja dengan tepat? Siapa yang melacak berapa banyak timer yang ada, kapan mereka kedaluwarsa dan kode mana yang harus dieksekusi? Kedengarannya cukup berat.
Buster
Oh tidak, maksud saya bukan kinerja dari tugas penundaan yang sebenarnya, maksud saya kinerja keseluruhan. Sebagai contoh, jika saya mengambil posisi mouse dari 10 frame terakhir dan menjalankan ini di telepon dan mendapatkan 20 fps, maka penundaannya adalah 0,5 detik. Namun, jika saya menjalankan ini di desktop saya dan mendapatkan 200 fps, maka penundaan hanya akan selama 0,05 detik. Apakah Anda mengerti maksud saya?
mr-matt
Anda akan memilih N untuk menghindari itu, tetapi masalah yang lebih besar adalah bahwa pemungutan suara sekali per frame seperti ini membuang banyak data. Lebih baik menangani setiap acara mouse (sepertinya itulah jawaban Anda).
Buster
3

Saya akhirnya menggunakan coroutine, karena (dari apa yang saya mengerti) penundaan akan konstan terlepas dari kinerja perangkat yang menjalankan permainan.

Ini kode saya:

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
sumber
Ini memiliki keuntungan menanggapi semua input (tidak seperti ide saya polling setiap frame). Saya tidak tahu C # tetapi menurut saya seseorang di suatu tempat memiliki banyak pembukuan yang harus dilakukan untuk semua penghitung waktu itu. Tetapi jika berkinerja baik dan terasa seperti yang Anda inginkan maka saya menyukainya.
Buster
Saya pikir ini adalah cara yang lebih baik untuk melakukannya, saya tidak berpikir timer akan mempengaruhi permainan Anda sebanyak itu, tentu saja Anda bisa kembali ke pertanyaan ini dengan hasil pengalaman Anda dengan kinerja (untuk referensi di masa mendatang). Bagaimanapun, Anda harus melanjutkan dan memilih ini sebagai jawabannya (ini hanya pengingat).
John Hamilton