Como fazer uma entrada atrasada do mouse?

11

Eu tenho um jogo de carro e a idéia é que o jogador esteja bêbado. Quero ter uma entrada atrasada do mouse, onde você move o mouse de um lado para o outro para girar.

Como posso configurar um atraso constante entre a entrada que o usuário fornece e o valor da curva do carro?

Agora eu tenho isso:

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

O que acontece é que a curva está atrasada, mas é muito lenta, ou seja, se eu mover o mouse muito rápido, o carro gira muito lentamente, mas se eu acionar o multiplicador Time.deltaTime, o carro gira mais rápido, mas o efeito de atraso é minimizado .

De que outra forma eu poderia fazer isso?

Sr. Matt
fonte

Respostas:

31

Para simular um intervalo de tempo, use um buffer circular para armazenar as posições do mouse dos últimos N quadros. Armazene a posição atual do mouse em cada quadro. Nos seus cálculos de controle, use a posição do mouse mais antiga do buffer em vez da posição atual do mouse.

Buster
fonte
1
Na verdade, eu resolvi, apenas usei uma corotina com uma espera de segundos. Eu ficaria preocupado com o desempenho com essa técnica, se você tiver um dispositivo muito rápido, ele terá um tempo de atraso muito menor do que algo como um celular.
mr-mate
2
Observe que atrasar uma entrada como essa alterará o resultado, dependendo da taxa de polling.
Joey
6
Matthew, estou um pouco confuso ... você realmente quer dizer performance? A penalidade no desempenho de gravar alguns bytes na memória por quadro é perfeitamente insignificante, e você fica livre da posição do mouse em todas as mensagens (pelo menos no Windows). Como você acha que sua solução de rotina funciona exatamente? Quem controla quantos cronômetros existem, quando expiram e qual código executar? Parece bastante pesado.
Buster
Ah, não, não quero dizer o desempenho da tarefa real do atraso, quero dizer o desempenho geral. Por exemplo, se eu pegar a posição do mouse dos últimos 10 quadros e executá-la em um telefone e obtiver 20 fps, o atraso será de 0,5 segundos. No entanto, se eu executar isso na minha área de trabalho e obter 200 qps, o atraso será de apenas 0,05 segundos. Você entende o que eu quero dizer?
mr-mate
Você escolheria N para evitar isso, mas o maior problema é que a pesquisa uma vez por quadro como esse está descartando muitos dados. Melhor lidar com todos os eventos do mouse (parece que é isso que sua resposta faz).
Buster
3

Acabei usando uma rotina, porque (pelo que entendi) o atraso será constante, independentemente do desempenho do dispositivo executando o jogo.

Este é o meu código:

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);
}
Sr. Matt
fonte
Isso tem a vantagem de responder a todas as informações (não como a minha ideia de pesquisar todos os quadros). Eu não sei C #, mas parece-me que alguém em algum lugar tem muita contabilidade para fazer para todos esses temporizadores. Mas se tiver um bom desempenho e a sensação que você deseja, eu gostei.
Buster
Eu acho que essa é a melhor maneira de fazer isso, não acho que os temporizadores afetem tanto o seu jogo, é claro que você poderia voltar a essa pergunta com os resultados da sua experiência com desempenho (para referência futura). De qualquer forma, você deve seguir em frente e escolher esta como a resposta (isso é apenas um lembrete).
John Hamilton