Як зробити затримку миші?


11

У мене є машина на машині, і ідея полягає в тому, що гравець п’яний. Я хочу мати відкладений вхід від миші, де ви переміщаєте мишу стороною в бік, щоб повернути.

Як я можу налаштувати постійну затримку між входом, який дає користувач, та кількістю повороту автомобіля?

Зараз у мене це є:

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

Що трапляється - черга затримується, але дуже повільна, іншими словами, якщо я рухаю мишу дуже швидко, машина повертається дуже повільно, але якщо я закрутив мультиплікатор Time.deltaTime, машина повертається швидше, але ефект затримки мінімізований .

Як ще я могла це зробити?

Відповіді:


31

Щоб імітувати затримку часу, використовуйте круговий буфер, щоб зберігати позиції миші останніх N кадрів. Зберігайте поточну позицію миші в кожному кадрі. У своїх контрольних розрахунках використовуйте найстарішу позицію миші з буфера замість поточної позиції миші.


1
Я вирішив це фактично, я просто використав сумісну програму із зачеканими секундами. Мені б занепокоєти ефективність роботи з цією технікою, якщо у вас дійсно швидкий пристрій, у нього буде значно менший час затримки, ніж щось на зразок мобільного.
містер-мат

2
Зауважте, що затримка такого введення змінить результат залежно від рівня опитування.
Джої

6
Метью, я трохи збентежений ... ти справді маєш на увазі продуктивність? Штраф за ефективність запису декількох байтів у пам'ять на кадр є абсолютно незначним, і ви отримуєте положення миші вільним з кожним повідомленням (принаймні в Windows). Як ви думаєте, як саме працює ваше рішення? Хто відслідковує, скільки таймерів існує, коли вони закінчуються та який код виконувати? Це звучить досить важко.
Бустер

О ні, я не маю на увазі виконання фактичного завдання затримки, я маю на увазі загальну ефективність. Наприклад, якщо я зайняв положення миші останніх 10 кадрів і запустив це по телефону і отримав 20 кадрів в секунду, то затримка склала б 0,5 секунди. Однак якщо я запускаю це на своєму робочому столі і отримую 200 кадрів в секунду, то затримка складе лише 0,05 секунди. Ви бачите, що я маю на увазі?
mr-matt

Ви вибрали б N, щоб уникнути цього, але більша проблема полягає в тому, що опитування одного разу за кадром, як це, викидає багато даних. Краще обробляти кожну подію миші (схоже, саме так і відповідає ваша відповідь).
Бустер

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 #, але мені здається, хтось десь має багато бухгалтерського обліку для всіх цих таймерів. Але якщо він працює добре і відчуваєш, що хочеш, то мені це подобається.
Бустер

Я думаю, що це кращий спосіб зробити це, я не думаю, що таймери настільки сильно вплинуть на вашу гру, звичайно, ви могли б повернутися до цього питання з результатами вашого досвіду роботи (для подальшої довідки). У будь-якому випадку, вам слід йти вперед і вибрати це як відповідь (це лише нагадування).
Джон Гамільтон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.