Skip to main content
本主题介绍 GameInput 上的力反馈如何管理设备输出。借助力反馈,游戏输入设备可以物理移动一个或多个输入控件,为用户提供触觉反馈。力反馈适用于模拟车辆操作的输入设备,例如方向盘和飞行模拟设备。这些设备包含一个力反馈电机,可沿某个轴向控制器施力。在赛车方向盘上,这是转动方向盘的旋转力,用于模拟游戏内场景。将力反馈用于飞行操纵杆时,可让操纵杆在特定位置难以推动或拉动。 有关支持力反馈的 GameInput 接口的更多信息,请参阅 IGameInputDeviceIGameInputForceFeedbackEffect

检查力反馈电机

要创建力反馈效果,你需要表示要应用效果的输入设备的 IGameInputDevice 接口。获取 IGameInputDevice 接口后,通过检查 GameInputDeviceInfo 结构体来确认该设备上的力反馈电机数量。可通过调用 IGameInputDevice::GetDeviceInfo 实现。如果输入设备上有力反馈电机,GameInputDeviceInfo 的成员 ForceFeedbackMotorCount 的值将为 1 或更大。

创建力反馈效果

如果某设备的 GameInputDeviceInfo 结构体表明它具有一个或多个力反馈电机,则可通过调用 IGameInputDevice::CreateForceFeedbackEffect 为该设备创建力反馈效果,如以下代码所示。
电机索引参数是受力反馈影响的电机的索引。该索引对应于 GameInputDeviceInfo 结构体的 GameInputForceFeedbackMotorInfo 数组中的相应电机。该数组包含所存在力反馈电机及其功能的信息。 对于第二个参数,为力反馈效果构造 GameInputForceFeedbackParams 结构体,用于描述效果的特征,如以下代码所示。
选择一个 GameInputForceFeedbackEffectKind 枚举值,然后初始化对应的 GameInputForceFeedbackParams 结构体。 例如,若要创建具有弹簧行为的反馈效果,GameInputForceFeedbackParamsGameInputForceFeedbackEffectKindGameInputForceFeedbackSpring 以及用于弹簧的 GameInputForceFeedbackConditionParams 结构体组成。填入所选 GameInputForceFeedbackEffectKind 枚举值对应的参数。 在按索引选择好力反馈电机效果并创建了 GameInputForceFeedbackParams 结构体后,调用 IGameInputDevice::CreateForceFeedbackEffect 创建效果。它由 IGameInputForceFeedbackEffect 接口表示。 力反馈效果的生命周期与所创建的 IGameInputForceFeedbackEffect 接口相关联。创建效果时,会将其加载到设备。释放最后一个引用后,力反馈效果会停止,并从设备电机中卸载。

应用和更新力反馈效果

创建力反馈效果时,会直接加载到设备电机中。力反馈电机的内存有限,这限制了同时加载和播放的力反馈效果数量。达到此上限后调用 IGameInputDevice::CreateForceFeedbackEffect 会导致该函数返回错误。 创建力反馈效果后,它会以已停止状态加载到力反馈电机。加载完成后,使用 IGameInputForceFeedbackEffect 接口将该效果的状态设置Running。这会在设备电机上播放该效果。

力反馈效果的状态

力反馈效果会经过若干状态以匹配游戏的当前状态。务必根据游戏更新并留意效果的状态,以维持预期行为。 可以按照 GameInputFeedbackEffectState 设置力反馈的状态,如以下代码所示。
创建力反馈效果后,其状态为 Stopped。如果将新创建或已停止的反馈效果设置为 Running 状态,则会从效果的起始处开始播放。将状态设置为 Paused 会使力反馈效果停止影响电机。但是,将 Paused 状态的效果设置为 Running 时,力反馈效果会从上次暂停处继续应用效果模式。 停止效果会结束该效果,但你可以稍后再次触发。例如,当用户在赛车游戏中离开崎岖地形时。同理,暂停效果适用于游戏未变化但用户想要浏览 UI(例如暂停菜单)的场景。 调用 IGameInputForceFeedbackEffect::SetState 设置力反馈效果的状态。

更新力反馈效果

如果新的 GameInputForceFeedbackParams 结构体使用相同的 GameInputForceFeedbackEffectKind 枚举值,则可调整力反馈效果的增益或提供一组新参数。

增益

通过 IGameInputForceFeedbackEffect::SetGain 函数调整增益即可改变力反馈效果的强度,如以下代码所示。
增益的取值范围为 0 到 1。默认情况下,力反馈效果的增益为 1。此函数主要用于减弱效果的强度。

设置新参数

使用 IGameInputForceFeedbackEffect::SetParams 函数为力反馈效果提供新参数,如以下代码所示。
使用此函数替换力反馈效果的参数时,请使用与所设置力反馈效果相同的 GameInputForceFeedbackEffectKind 枚举值。新参数会立即生效,并在不停止正在运行的效果的情况下应用。请注意,如果 duration 值未改变,持续时间计时器不会被刷新;仅当提供不同的 duration 值,或者效果被停止并重新启动时,才会刷新。 如果正在运行的效果被停止,则会以新参数重新启动。有些游戏可以通过为 GameInputForceFeedbackEffectKind 枚举值为 GameInputForceFeedbackConstant 的反馈效果设置参数,来更改参数以模拟不同的反馈模式。

GIP 与 HID 设备的能力差异

在主机上,所有设备都使用 GIP 驱动模型。在 PC 上,设备可以使用 GIP 或 HID 驱动模型;安装厂商驱动通常会将其切换到 HID 模式(除非存在用于手动控制的物理开关)。HID 设备的力反馈能力受最初设计所依据的 DirectInput API 所限。GameInput 会尽力绕过这些限制,但仍存在一些差异。 无论硬件支持哪些额外的轴,HID 设备目前将力反馈限制在 AngularX 轴。此配置对绝大多数赛车方向盘都能提供良好支持。 HID 力反馈目前在 Windows 19H2+ 版本中可用,将在未来更新中支持 19H1。

参考 API 文档

另请参阅

IGameInputForceFeedbackEffect IGameInputDevice
最后修改于 2026年8月13日