You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Mouse.current.WarpCursorPosition仅向左/上正常、向右/下移动失效问题

问题根因

出现该问题是两个底层逻辑共同作用的结果:

  1. 操作系统层面的光标位置本身就是以屏幕像素为单位的整数值,不存在浮点类型的光标坐标,所有传入WarpCursorPosition的浮点值最终都会被转换为整数传给系统。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:45:01