如何进行延迟的鼠标输入?


11

我有一个赛车游戏,想法是玩家喝醉了。我希望鼠标有一个延迟的输入,您将鼠标左右移动来转动。

如何在用户提供的输入和汽车转弯量之间设置恒定的延迟?

现在我有这个:

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

发生的情况是转弯被延迟了,但是非常慢,换句话说,如果我非常快地移动鼠标,汽车会非常缓慢地转弯,但是如果我将乘数提高到Time.deltaTime,汽车会转弯更快,但是延迟效果会最小化。

我还能怎么做?

Answers:


31

要模拟时滞,请使用循环缓冲区存储最后N帧的鼠标位置。每帧存储当前鼠标位置。在控件计算中,使用缓冲区中最早的鼠标位置而不是当前的鼠标位置。


1
我实际上解决了它,我只是用了一个协和式的等待时间。我会担心这种技术的性能,如果您有一个非常快的设备,那么它的延迟时间将比移动设备低得多。
mr-matt

2
请注意,像这样延迟输入将根据轮询速率更改结果。
乔伊(Joey)

6
马修,我有点糊涂了……您的意思是表演吗?每帧向内存中写入几个字节的性能损失可以忽略不计,并且每条消息(至少在Windows上)都可以释放鼠标的位置。您如何看待协程解决方案的正确运作?谁来跟踪存在多少个计时器,它们何时到期以及要执行哪些代码?听起来很重量级。
Buster

哦,不,我不是指延迟实际任务的性能,而是指整体性能。例如,如果我将最后10帧的鼠标位置放在手机上并以20 fps的速度运行,则延迟将为0.5秒。但是,如果我在桌面上运行它并获得200 fps,则延迟将仅为0.05秒。你明白我的意思吗?
mr-matt

您可以选择N来避免这种情况,但是更大的问题是,像这样每帧轮询一次会浪费很多数据。更好地处理每个鼠标事件(看起来就是您的答案所做的事情)。
Buster

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#,但在我看来,某个地方的人需要为所有这些计时器进行大量记账工作。但是,如果它执行正常并具有您想要的感觉,那么我会喜欢它。
巴斯特

我认为这是更好的方法,我认为计时器不会对您的游戏产生太大影响,当然您可以通过性能体验的结果回到这个问题(以供将来参考)。无论如何,您应该继续并选择答案作为答案(这只是提醒)。
约翰·汉密尔顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.