Как сделать отложенный ввод мышью?

11

У меня есть автомобильная игра, и идея в том, что игрок пьян. Я хочу иметь задержку ввода от мыши, где вы перемещаете мышь из стороны в сторону, чтобы повернуть.

Как я могу установить постоянную задержку между вводом, который дает пользователь, и количеством поворотов автомобиля?

Прямо сейчас у меня есть это:

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

То, что происходит, это поворот с задержкой, но очень медленный, другими словами, если я очень быстро двигаю мышь, машина поворачивает очень медленно, но если я проворачиваю множитель для Time.deltaTime, машина поворачивает быстрее, но эффект задержки минимизируется ,

Как еще я мог это сделать?

MR-матовый
источник

Ответы:

31

Чтобы смоделировать задержку по времени, используйте круговой буфер для хранения позиций мыши последних N кадров. Сохранить текущую позицию мыши в каждом кадре. В ваших контрольных расчетах используйте самую старую позицию мыши из буфера вместо текущей позиции мыши.

попойка
источник
1
Я решил это на самом деле, я просто использовал сопрограмму с секундой ожидания. Я был бы обеспокоен производительностью с этой техникой, если у вас действительно быстрое устройство, оно будет иметь намного меньшее время задержки, чем что-то вроде мобильного.
г -
2
Обратите внимание, что такая задержка ввода изменит результат в зависимости от частоты опроса.
Джои
6
Мэтью, я немного сбит с толку ... ты действительно имеешь в виду производительность? Потеря производительности при записи нескольких байтов в память на кадр совершенно незначительна, и вы освобождаете положение мыши при каждом сообщении (по крайней мере, в Windows). Как вы думаете, ваше решение сопрограммы работает точно? Кто отслеживает, сколько существует таймеров, когда они истекают и какой код выполнять? Звучит довольно тяжеловесно.
Бастер
О нет, я не имею в виду выполнение реальной задачи задержки, я имею в виду общую производительность. Например, если я беру позицию мыши в последних 10 кадрах и запускаю ее на телефоне и получаю 20 кадров в секунду, тогда задержка составит 0,5 секунды. Однако, если я запустлю это на своем рабочем столе и получу 200 кадров в секунду, то задержка составит всего 0,05 секунды. Вы видите, что я имею в виду?
г-н
Вы бы выбрали 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);
}
MR-матовый
источник
Это имеет преимущество ответа на все входные данные (не как моя идея опроса каждого кадра). Я не знаю C #, но мне кажется, что кто-то где-то много делает для всех этих таймеров. Но если он работает хорошо и чувствует, что вы хотите, то мне это нравится.
Бастер
Я думаю, что это лучший способ сделать это, я не думаю, что таймеры будут сильно влиять на вашу игру, конечно, вы можете вернуться к этому вопросу с результатами вашего опыта с производительностью (для дальнейшего использования). В любом случае, вы должны пойти дальше и выбрать это как ответ (это просто напоминание).
Джон Гамильтон