Действительно ли неправильно использовать ввод.GetKey() на FixedUpdate?

мы знаем, что есть "правило", что Input функции не должны использоваться внутри FixedUpdate(); Input.GetKeyDown() может не работать, если мы это сделаем, но действительно ли неправильно использовать Input.GetKey()?

предположим, мы хотим запустить что-то при нажатии и удержании клавиши с некоторой скоростью, которая не зависит от производительности оборудования. Я не хочу создавать логику для управления этим с помощью delta time или написания кода обнаружения ключа в Update и код стрельбы в FixedUpdate.

не имеет смысла просто сделайте все внутри FixedUpdate? Что может случиться - мы можем потерять некоторые ключевые события, те, которые мы все равно не хотели, чтобы сохранить желаемую скорость.

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

3 ответов


С GetKeyDown docs:

вам нужно вызвать эту функцию от функции обновления, так как состояние сбрасывается каждый кадр

так что да, состояние ввода сбрасывается каждый кадр означает, что оборудование будет иметь эффект в зависимости от того, как часто Update пожары между FixedUpdate.

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

обновление:

относительно комментария Раттера ниже. Я просто заметил, что OP спрашивал о GetKey(), о чем я писал GetKeyDown() остается верным для GetKey() хотя в документации об этом прямо не говорится.

это можно проверить, зайдя в Диспетчер Времени и изменением частоты FixedUpdate с интервалом 1 секунда. Тогда сделай что-нибудь. например:

void FixedUpdate() {
    if(Input.GetKey(KeyCode.D)){
        Debug.Log("D-Key Down");
    } else {
        Debug.Log("No key down");
    }
}

если вы нажмете и отпустите "D" между 1 секундными фиксированными кадрами, вы увидите только "нет клавиши вниз".


по моему опыту, обновление происходит во время кадра, в отличие от фиксированного обновления, которое может происходить несколько раз на кадр. Кроме того, физика объектов фактически обновляется до вызова FixedUpdate (), что означает, что может быть задержка, основанная на сложности сцены.

Я считаю, что вход на самом деле транслируется на кадр, поэтому, когда FixedUpdate() отстает и должен догнать, запустив несколько раз, проверка ввода завершится неудачей.

дополнительные Ресурсы:

http://answers.unity3d.com/questions/10993/whats-the-difference-between-update-and-fixedupdat.html


причина, по которой Вы не должны использовать Input в FixedUpdate, заключается в том, что Input запускается ОС. Обновление выравнивается с ОС, но не FixedUpdate.

в результате, если вы используете Input в FixedUpdate, вы можете пропустить некоторые входные данные.

например, если вы запускаете 100fps, но FixedUpdate-50fps:

f0   f1    f2    f3    f4
FU         FU          FU
U    U     U     U     U
     I       

I означает кадр, когда ОС сообщает о вводе в программное обеспечение. Update захватывает информацию и использует ее. К концу f1 вход сбрасывается ОС.

если бы вы поймали ввод в FixedUpdate, вы пропустили бы его, потому что FixedUpdate не запускался в f1.