我的 Steam 个人主页: https://steamcommunity.com/id/teccno/
用于赞助的 CS:GO 交易链接 :D : https://steamcommunity.com/tradeoffer/new/?partner=291638630&token=Xyg4vITU
💛 非常感谢 Jared (jmac122) 送给我《极限竞速:地平线 6》来赞助支持本项目,让它能够继续发展。
《极限竞速:地平线》通过 UDP 发送车辆遥测数据,但 Steam 输入默认无法使用 DualSense 的自适应扳机。这个小程序弥补了这一空缺:
- 左扳机(刹车) - 踩得越深,阻力越大。当轮胎打滑时,会产生类似 ABS 介入的防抱死震动。拉起手刹时,会有额外的阻力加成。
- 右扳机(油门) - 柔和的渐进阻力。换挡时会有明显的换挡冲击。转速达到红线区时会有震动。
┌──────────────────┐ UDP 5300 ┌──────────────────┐ HID 写入 ┌─────────────┐
│ Forza Horizon │ ──────────────► │ 本程序 │ ──────────────► │ DualSense │
│ (数据输出) │ 遥测数据 324字节 │ (仅控制扳机字节)│ (仅修改自适应 │ 手柄 │
└──────────────────┘ └──────────────────┘ 扳机效果) └─────────────┘
▲
│
┌──────────────────┐ HID 写入 │
│ Steam Input │ ───────────────────────►│
│ (控制常规震动) │ (常规震动 + 按键输入) │
└──────────────────┘
本程序和 Steam 同时对一个手柄进行写入 - 但它们操作的是不同的字节:
- Steam 掌控的是手柄的基础震动马达和按键映射。
- 本程序仅修改与自适应扳机相关的字节(
valid_flag0内的0x04和0x08位)。 - HID 设备是以**非阻塞模式(non-blocking mode)**打开的,所以写入指令会立即发送,而不会等待手柄响应。不会产生队列积压,也不会阻塞 Steam 的输入。
这就是为什么你可以同时运行这两个程序而互不干扰。
运行要求: Windows 10/11 或 Linux,以及 DualSense 手柄(USB 或蓝牙连接)。
- 前往 最新发布版本 (latest release)。
- 下载
win_start.bat(Windows) 或linux_start.sh(Linux)。 - 将下载的文件放到任意一个空白文件夹中。
- 重要: 我们强烈建议您先手动安装
uv环境。打开 PowerShell 并运行以下命令:powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- 如果您跳过此步,
win_start.bat在启动时会尝试自动下载安装uv。但 Windows 的执行策略(Execution Policy)可能会在 PowerShell 中拦截并导致自动安装失败。 - 如果遇到执行策略(Execution Policy)报错: 在所在的文件夹中按住 Shift + 右键,点击 “在此处打开 PowerShell 窗口”,粘贴
Set-ExecutionPolicy RemoteSigned -scope CurrentUser并回车,然后输入Y回车确认。
- 如果您跳过此步,
- 双击运行
win_start.bat(或linux_start.sh)。
启动器会自动完成应用下载、环境配置以及程序启动。下次运行它时,还会自动检查更新。
Note
每个版本还附带一个独立的 Windows .exe 作为实验性选项。推荐的运行方式仍然是 win_start.bat —— 它会自动更新,并在所有 Windows 版本上以相同方式工作。
Linux 额外说明: 安装
libhidapi依赖(sudo apt install libhidapi-hidraw0/sudo pacman -S hidapi/sudo dnf install hidapi)并从app/packaging/linux/70-dualsense.rules添加 udev 规则。然后将手柄断开并重新连接一次。
如果您是在微软商店(Microsoft Store)或 Xbox App 上运行游戏,您将需要一个工具来让游戏把您的手柄识别为 Xbox 手柄。其中一个选择是 SISR(Steam Input System Redirector) —— 它将 Steam Input 重定向到系统层级并模拟一个真实的 Xbox 手柄,因此即使在微软商店应用和带反作弊保护的游戏中也能正常工作。
因为 SISR 通过 Steam Input 转发手柄,Steam 可能会独占物理 DualSense 手柄,导致本程序无法连接。为了避免这个问题,您必须按照以下严格的顺序启动程序:
- 首先启动本程序 (
win_start.bat),等待扳机发生一次简短的脉冲震动。 - 第二步,启动 SISR(以及 Steam)。
- 最后,启动极限竞速:地平线游戏。
(注:如果在玩游戏时手柄断开连接,请先关闭 SISR,重启本程序,然后再打开 SISR。有关 SISR 的安装与模拟选项,请参阅 SISR README。)
手动安装(适合开发者)
git clone https://github.com/HamzaYslmn/Forza-Horizon-DualSense-Python
cd Forza-Horizon-DualSense-Python/src
uv sync
uv run main.py需要安装 uv? 使用 pip install uv 或访问 astral.sh/uv。
在《极限竞速:地平线》中,打开 设置 → HUD 与游戏玩法,滚动到最下方:
| 设置项 | 数值 |
|---|---|
| 数据输出 (Data Out) | 开启 (ON) |
| 数据输出 IP 地址 (Data Out IP Address) | 127.0.0.1 |
| 数据输出端口 (Data Out IP Port) | 5300 |
Note
在某些版本的地平线游戏中,将 IP 地址填写为 127.0.0.1 可能会失效。如果程序没有收到任何遥测包,请尝试改填为 ::1(IPv6 环回地址)。
Steam 可以驱动 DualSense 手柄上的左右常规震动马达。请按照以下步骤开启:
- 在 Steam 库中右键点击 极限竞速:地平线 → 属性。
- 转到 控制器 → 额外设置。
- 确保 DualSense 震动 选项设置为 开启。
- 打开 设置 → 高级控制。
- 找到 震动 选项并将其启用。
为了获得最佳效果,建议安装官方的 PlayStation® Accessories 固件更新软件:
- 下载地址: PlayStation® Accessories
这可以确保您的 DualSense 固件保持最新状态。
ℹ️ 关于自适应扳机: 正常情况下,Steam 并不支持此游戏在 DualSense 手柄上的自适应扳机效果。本程序的全部意义就在于——在 Steam 原生的震动效果基础之上,叠加还原真实的扳机反馈(刹车阻力、引擎颤动、ABS 脉动、换挡冲击、红线转速抖动)。
双击 win_start.bat (Windows) 或 linux_start.sh (Linux)。
你会感到手柄扳机产生了一次简短的脉冲震动,这代表一切运行正常。此时可以开启游戏上路了。
请务必在运行极限竞速游戏之前运行启动器。如果您使用了 HidHide,请确保将
python.exe加入白名单。
想在 Steam 点击 开始游戏 时,自适应扳机也能自动开启?你可以把启动器的路径写入 Steam 启动选项中。
⚠️ 警告: 部分系统环境下这种启动方式可能会导致程序连接出错。为了获得最稳定的体验,我们依然强烈建议您直接双击运行脚本来手动启动程序。
-
在 Steam 中,右键点击 极限竞速:地平线 → 属性。
-
打开 通用 标签页,并找到 启动选项。
-
根据个人喜好,填入以下命令之一(记得将路径修改为您的
win_start.bat的实际位置):-
方式 A:保留 Steam 界面叠加层和游戏时间统计 (推荐) 这行命令通过
cmd.exe /c包装脚本,让 Steam 能正常监视游戏进程,确保你的 Steam 界面 (Shift+Tab) 以及 游戏时间统计 功能正常可用,并且命令行窗口在运行后会自动关闭:"C:\Windows\System32\cmd.exe" /c ""C:\您的路径\Forza-Horizon-DualSense-Python\win_start.bat" %command%" -
方式 B:极简命令方式 直接拉起脚本,但可能导致 Steam 界面叠加层和游戏时间统计失效:
"C:\您的路径\Forza-Horizon-DualSense-Python\win_start.bat" %command%
-
大功告成。点击 开始游戏 时,启动器就会首先拉起,随后运行游戏。
高级 - 直接运行 Python 脚本(不使用 BAT 文件)
如果您克隆了本仓库并且正在使用 uv 运行,可以把以下命令复制到 启动选项 中:
cmd /c "start /MIN /D C:\您的路径\Forza-Horizon-DualSense-Python\src uv run main.py" && %command%
所有的效果(刹车力度、ABS 震动、换挡冲击、红线震动等)都可以在程序的设置(Settings)页面中进行调校或关闭,不需要手动编辑任何文件。修改将在下次启动程序时生效。
⚠️ 红线限速器效果是根据rpm / max_rpm比例触发的,而不是固定的 RPM。不同车型的红线比例各不相同,因此可能需要根据车型做出细微调校。
| 故障现象 | 解决方法 |
|---|---|
DualSense gamepad interface not found |
手柄没有连接,或者 HidHide 屏蔽了手柄 - 请把 python.exe 添加到白名单中。 |
No UDP packets yet |
地平线游戏里的“数据输出(Data Out)”选项没有开启,IP 地址或端口填写错误,或者 Windows 防火墙进行了拦截。也可以尝试把数据输出 IP 从 127.0.0.1 更改为 ::1。 |
Windows Defender / SmartScreen 拦截了 win_start.bat |
1. 在蓝色的“Windows 已保护你的电脑”警告弹窗中,点击 “更多信息”。 2. 点击右下角新出现的 “仍要运行” 按钮即可(脚本仅下载所需的依赖库,安全无毒)。 |
| 扳机感觉太软(阻力太小) | 调大 brake_max_force / throttle_max_force,或者调小对应的阻力曲线 curve 数值。 |
| 扳机感觉像一堵硬墙(阻力太大) | 调小 brake_max_force / throttle_max_force,或者调大对应的阻力曲线 curve 数值。 |
| 轻按扳机时就感觉非常僵硬 | 调小基础力度 baseline_force,或者调大阻力曲线 curve 数值。 |
| 换挡时没有任何震动反馈 | 车辆速度必须高于 3 km/h,并且处于有效挡位之间的切换状态。 |
| 在启动脉冲过后面版窗口处于空白无响应状态 | 在终端中使用 cd src && uv run main.py --headless 运行以跳过 TUI 界面,改用纯控制台日志输出。 |
src/
├── main.py # 入口文件
└── modules/
├── settings.py # 👈 你需要调校参数的文件
├── dualsense/
│ ├── main.py # HID 设备交互层
│ └── adaptive_trigger.py # 通用扳机效果原语
└── forzahorizon/
├── udp_listener.py # UDP 遥测数据解析
└── effects.py # Forza 专属 Controller 与动画
我们已经集成了对 DSX (DualSenseX) 的支持。由于 DSX 的限制,您可能无法获得完美的 1:1 体验,但我已尽了最大努力。目前已完全支持较低保真度的自适应扳机效果。
由 HamzaYslmn 开发完成。
- Jared (jmac122) - 送给我《极限竞速:地平线 6》以支持这个项目能够继续维护下去,非常感谢你,Jared!
- BeaudinSan - 感谢您极为慷慨的赞助支持!这对我有非凡的意义。
- McLarenF1God - 感谢赞助《极限竞速:地平线 6》的 DLC!
- Griever - 感谢赞助 DSX 和 DLC!
- PlusMinusZer0 - 感谢送给我的布丁!
- dotcom - 感谢送给我的蛋糕!
- wallbangz - 感谢送给我的蛋糕!
- BambinoPinguino - 感谢送给我的茶!
- Ereldun - 感谢送给我的咖啡!
- Clevens克林 - 感谢送给我的糖果!
- 海 拔 88 - 感谢送给我的糖果!
同时,也要向默默支持该项目的匿名赞助者们,以及所有通过赞赏、鼓励和在社交媒体上分享,一路上给我带来动力的朋友们,致以最诚挚的感谢!
为了更具沉浸感的赛车游戏体验而打造



