Unity游戏GetAxis("Mouse X/Y")不响应pyautogui等虚拟鼠标的问题咨询
失效原因分析
两种相机模式的输入逻辑完全不同,是失效的核心原因:
- 可以正常工作的
CAMERA_THAT_WORKS_WITH_BOT模式,直接读取Input.mousePosition也就是系统光标的绝对屏幕坐标。pyautogui、普通AHK的MouseMove接口都是直接修改系统光标位置,所以Unity可以正常读到坐标变化,视角控制生效。 - 失效的
CAMERA_THAT_FAILS_WITH_BOT模式,读取的是Input.GetAxis("Mouse X/Y")/GetAxisRaw,这类Unity接口不依赖光标绝对位置,只读取操作系统上报的鼠标相对位移增量(也就是硬件鼠标移动时产生的原始位移信号)。且该模式下开启了Screen.lockCursor = true,Unity会主动将光标锁定在屏幕中心,你调用普通虚拟鼠标接口移动光标后,Unity会立刻把光标拉回中心,不会产生有效的位移增量,因此GetAxis读不到任何输入,视角控制失效。
你给出的AHK脚本用的是绝对坐标移动的MouseMove,自然在该模式下完全无效。
判断正确性说明
你的认知部分正确,但核心偏差是:GetAxis不依赖鼠标加速度/速度参数,而是普通的虚拟鼠标绝对移动接口,根本不会产生系统层的鼠标相对位移增量事件,因此Unity完全收不到对应的输入信号。鼠标加速度参数只会影响GetAxis返回值的缩放比例,不是失效的核心原因。
测试方案
1. 优先验证输入类型问题
改用发送相对鼠标位移事件的接口,不要用修改绝对光标的接口:
- AHK 实现示例:调用
mouse_event系统API发送相对位移,以下代码模拟鼠标每触发一次向右移动20单位,向上移动5单位:
; 0x0001 代表MOUSEEVENTF_MOVE,即相对移动 DllCall("mouse_event", "UInt", 0x0001, "Int", 20, "Int", -5, "UInt", 0, "UPtr", 0)
- Python 实现示例:用ctypes调用Windows原生
SendInputAPI发送相对移动事件,或者直接使用封装好的pynput库的相对移动方法:
from pynput.mouse import Controller mouse = Controller() # 相对当前位置移动x+20,y-5 mouse.move(20, -5)
上述方法发送的输入会被Unity的GetAxis正常识别,可先测试是否可以控制视角。
2. 鼠标加速度读取/设置方案
如果需要调整鼠标加速度、速度参数验证影响,可通过Windows系统API SystemParametersInfo 实现:
- 读取参数:传入参数
SPI_GETMOUSE,可以获得三个返回值:两个加速度阈值、一个加速度增益(0为无加速度,1为开启加速度,2为双倍加速度) - 设置参数:传入参数
SPI_SETMOUSE,写入对应三个值即可修改系统鼠标加速度设置
Python调用示例:
import ctypes from ctypes import wintypes SPI_GETMOUSE = 0x0003 SPI_SETMOUSE = 0x0004 SPIF_UPDATEINIFILE = 0x01 SPIF_SENDCHANGE = 0x02 # 读取鼠标参数 mouse_params = (wintypes.INT * 3)() ctypes.windll.user32.SystemParametersInfoW(SPI_GETMOUSE, 0, ctypes.byref(mouse_params), 0) threshold1, threshold2, acceleration = mouse_params print(f"当前参数:阈值1={threshold1}, 阈值2={threshold2}, 加速度={acceleration}") # 设置无加速度 mouse_params[2] = 0 ctypes.windll.user32.SystemParametersInfoW(SPI_SETMOUSE, 0, ctypes.byref(mouse_params), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

