手柄输入

游戏输入

Posted by Bob on September 7, 2022

Stick

PlayStation 3 和 PlayStation 4 游戏机及其控制器不会让您将模拟摇杆移动到对角线时的完整正方形的 X 和 Y 轴,无论您如何移动摇杆,它只会沿圆圈移动。但是,使用 Xbox,您可以让 X 轴和 Y 轴完全对齐方形 (+100 /-100),尽管摇杆是圆形的。

将鼠标输入的值转换为与模拟摇杆的圆形区域相匹配(本质上添加了一个外部死区)。模拟摇杆的可能值通常局限于圆形区域,不可能达到对角线的最大值。在这种情况下,可以调整粘滞设置以取消此效果,从而可以访问完整的 X 和 Y 访问并基本上擦除任何死区。

我们试图在下图中尽可能地说明这一点。 image

为什么是四角是0.7?

https://stackoverflow.com/questions/1944499/joystick-deadzone-calculation

DeadZone

摇杆通常获得二个轴输出:一个用于X(水平)轴,一个用于 Y(垂直)轴。通常数字范围从 -1(完全延伸一个方向)到 +1(完全延伸相反方向),其中 0 是DeadZone。如果您不触摸摇杆,它将返回 (0, 0)。

但实际上,摇杆的质量各不相同,并且会随着时间的推移而磨损。您可能曾经使用过具有松散或“摇摆”摇杆的游戏手柄;在这种情况下,中立位置与 (0, 0) 稍有偏差,即使您没有触摸摇杆。这与玩家将摇杆推到一点点,一点点没有区别。

死区只是一个最小输入阈值,通常在 0.1 到 0.2 之间。如果从摇杆接收到的输入小于该值,则将其忽略。

你有时玩游戏时,即使你根本没有触摸摇杆,相机也会自行非常缓慢地移动或旋转?这是一个缺失(或太小)死区的情况。

总结一下:死区可以防止来自松动的摇杆的意外输入。

AXIAL DEAD ZONE

这是这种死区的示意图。圆圈代表摇杆的旋转空间(它与摇杆所在的控制器中的圆形开口相同),红色阴影区域表示死区将进入并取消您的输入 image 快速旋转时容易卡方向,精度不够。只适合全是 2D 四向运动的游戏

float deadzone = 0.25f;
Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if(Mathf.Abs(stickInput.x) < deadzone)
{
	stickInput.x = 0.0f;
}
if(Mathf.Abs(stickInput.y) < deadzone)
{
	stickInput.y = 0.0f;
}

RADIAL DEAD ZONE

摇杆中心的一个非常小的区域,在该区域内输入被忽略。该区域的大小只是我们对松散、磨损的摇杆在没有摇动的情况下可能自行摆动多远。 image

float deadzone = 0.25f;
Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if(stickInput.magnitude < deadzone)
{
	stickInput = Vector2.zero;
}

SCALED RADIAL DEAD ZONE

死区的边缘清晰可见:当您将摇杆推离中心时,该边缘处的梯度值会突然变化,而不是平滑。 image 死区的不再有可见边缘:当您将摇杆推离中心时,渐变值平滑地变化,而死区仍然保留。这感觉很丝滑! image

float deadzone = 0.25f;
Vector2 stickInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if(stickInput.magnitude < deadzone)
{
	stickInput = Vector2.zero;
}
else
{
	stickInput = stickInput.normalized * ((stickInput.magnitude - deadzone) / (1 - deadzone));
}

Movement Deadzone & Camera Deadzone

https://www.desmos.com/calculator/bksgiqwzrm?lang=zh-CN

https://www.desmos.com/calculator/2yn9xxppbs?lang=zh-TW

https://www.desmos.com/calculator/efo6jwjpch?lang=zh-CN