手柄
初级 程序员
手柄(Gamepad)(如 Xbox Elite 无线控制器和 PS4 DualShock)是主机和桌面上流行的输入设备。
Note
Stride 目前针对 Xbox Elite 手柄进行了优化。其他控制器也能工作,但可能有非预期的按键映射。PS4 DualShock 触摸板等手柄特有功能不受支持。
数字按钮与模拟按钮
数字按钮有两种状态:抬起(up)和按下(down)。方向键(D-pad)、Start、Back、摇杆(按下)、A、B、X 和 Y 按钮都是数字按钮。
模拟按钮根据用户按压力度返回一个值。扳机键(Trigger)是模拟按钮,返回 0 到 1 之间的值。摇杆(Stick)也是模拟的,在 X 轴和 Y 轴上返回 -1 到 1 之间的值。
Xbox Elite 控制器的按钮在 Stride 中的名称如下:

处理手柄输入
检查手柄是否已连接
处理手柄输入之前:
要检查是否有手柄已连接,请使用 InputManager.HasGamePad。
要检查已连接的手柄数量,请使用 InputManager.GamePadCount。
要检查当前设备是否已断开连接,请使用 InputManager.DeviceRemoved 事件。
要检查是否有设备已连接,请使用 InputManager.DeviceAdded 事件。
数字按钮
要查询数字手柄按钮的状态和状态变化,请在 GamePad 对象上调用:
| 方法 | 功能 |
|---|---|
| IsButtonDown(IGamePadDevice, GamePadButton) | 检查按钮是否处于_按下_状态。 |
| IsButtonPressed(IGamePadDevice, GamePadButton) | 检查自上次更新以来用户是否_按下_了该按钮。 |
| IsButtonReleased(IGamePadDevice, GamePadButton) | 检查自上次更新以来用户是否_释放_了该按钮。 |
Button (GamePadButton) 是你要检查的手柄按钮。
你也可以使用 GamePadState.Buttons 获取数字按钮的状态。
Note
GamePadState.Buttons 字段是使用二进制系统的位掩码。根据位掩码的值,可以确定哪些按钮处于按下或抬起状态。
要获取手柄状态,请使用 IGamePadDevice.State。
模拟按钮
要查询模拟按钮的值,请先使用 GetGamePadByIndex(index) 获取手柄的当前状态,其中 index(整数) 是要检查的手柄索引。
Warning
IGamePadDevice.State 返回的值是手柄在当前更新时的状态。你不能在后续更新中重用该值,必须在每次更新时重新查询。
要获取扳机键和摇杆的位置,请使用以下 GamePadState 字段:
| 字段 | 说明 |
|---|---|
| GamePadState.LeftThumb | 左摇杆 X 轴/Y 轴的值,两个轴的范围均为 [-1.0f, 1.0f]。 |
| GamePadState.RightThumb | 右摇杆 X 轴/Y 轴的值,两个轴的范围均为 [-1.0f, 1.0f]。 |
| GamePadState.LeftTrigger | 左扳机键的模拟控制值,单轴范围为 [0, 1.0f]。 |
| GamePadState.RightTrigger | 右扳机键的模拟控制值,单轴范围为 [0, 1.0f]。 |
摇杆沿 X 轴和 Y 轴移动,其位置读数如下:

扳机键沿 X 轴移动,其位置读数如下:

震动
要设置手柄震动强度,请使用 IGamePadDevice.SetVibration。
Note
Stride 目前仅支持 Xbox 手柄的震动功能。
示例代码
using Stride.Core.Mathematics;
using Stride.Engine;
public class TestScript : SyncScript
{
public override void Update()
{
//检查是否连接了手柄
if (Input.HasGamePad)
{
//获取已连接手柄的数量
int gamepadCount = Input.GamePadCount;
// 检查每个手柄的状态
foreach(var gamepad in Input.GamePads)
{
// 获取模拟摇杆的位置
Vector2 speed = gamepad.State.LeftThumb;
Vector2 direction = gamepad.State.RightThumb;
// 获取数字按钮的状态
if (gamepad.IsButtonDown(GamePadButton.X))
{
// 只要用户按住按钮,该动作就会持续重复。
// 这适用于机枪射击等连续动作。
}
if (gamepad.IsButtonPressed(GamePadButton.A))
{
// 即使用户按住按钮,该动作也只会触发一次。
// 这适用于跳跃等一次性动作。
}
}
}
}
}