Unity中Mouse.current.WarpCursorPosition仅向左/上正常、向右/下移动失效问题
问题根因
出现该问题是两个底层逻辑共同作用的结果:
- 操作系统层面的光标位置本身就是以屏幕像素为单位的整数值,不存在浮点类型的光标坐标,所有传入
WarpCursorPosition的浮点值最终都会被转换为整数传给系统。 - Unity新输入系统内部对
WarpCursorPosition的入参做的是**向下取整(Floor)**处理:- 正的小数值(比如0.1、0.9)向下取整后为0,所以你加小于1的正增量时,坐标不变,看起来向右、向下移动失效
- 负的小数值(比如-0.1、-0.9)向下取整后为-1,所以只要加小于0的增量,不管多小都会让坐标减1,看起来向左、向上移动正常
另外你代码中依赖Input.mousePosition累加增量的写法也有问题:Input.mousePosition返回的是已经取整后的上一帧光标坐标,小于1的浮点增量根本攒不住,每次都会被取整逻辑抹掉。
解决方法
你需要自己在脚本里维护一个浮点类型的光标坐标变量,不要依赖Input.mousePosition累计增量,等累计到整数变化之后再调用WarpCursorPosition即可,示例代码如下:
public class dumbtestscript : MonoBehaviour { // 自行维护浮点型的光标坐标,用来累计增量 private Vector2 _cursorPos; void Start() { // 初始化时存入初始坐标 _cursorPos = new Vector2(123, 123); Mouse.current.WarpCursorPosition(_cursorPos); StartCoroutine(MoveCursorLeftThenRightCoroutine()); } IEnumerator MoveCursorLeftThenRightCoroutine() { float startTime = Time.time; // 向左移动阶段 while (Time.time < startTime + 1) { // 增量直接累加在自行维护的浮点变量上 _cursorPos += Time.deltaTime * new Vector2(-100f, 0); Mouse.current.WarpCursorPosition(_cursorPos); yield return null; } // 向右移动阶段 while (Time.time < startTime + 2) { _cursorPos += Time.deltaTime * new Vector2(100f, 0); Mouse.current.WarpCursorPosition(_cursorPos); yield return null; } } }
代码里的100f是光标移动速度,代表每秒移动100像素,可根据需求自行调整。
补充说明
如果你需要更均匀的移动效果,也可以手动对自己维护的坐标做四舍五入处理,避免默认向下取整带来的方向差异问题:
// 手动四舍五入后再传入方法 Mouse.current.WarpCursorPosition(new Vector2(Mathf.Round(_cursorPos.x), Mathf.Round(_cursorPos.y)));
内容的提问来源于stack exchange,提问作者user8810083
相关产品推荐
相关产品推荐

