Table of Contents

手柄

初级 程序员

手柄(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 中的名称如下:

Xbox 手柄

处理手柄输入

检查手柄是否已连接

处理手柄输入之前:

数字按钮

要查询数字手柄按钮的状态和状态变化,请在 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))
                {
                    // 即使用户按住按钮,该动作也只会触发一次。
                    // 这适用于跳跃等一次性动作。
                }
            }
        }
    }
}

另请参阅