Unity Input System下仅移动鼠标触发Scroll Rect滚动如何修复?
问题成因
该问题是Unity 2019.1.0f2搭配Input System 1.0.2版本的已知兼容性问题,核心原因有三点:
- 部分支持手势操作的触控板、高精度鼠标,或者Windows系统下的指针设备,会在鼠标移动时误将极微小的位移量上报为滚轮滚动增量,这类误上报的数值通常非常小。
- Input System 1.0.2版本未给滚动输入配置默认死区,所有上报的数值无论大小都会被
Mouse.current.scroll.ReadValue()直接返回。 - 该版本对文档中提及的「部分设备将悬停在可滚动区域的指针位移映射为滚动输入」的特性没有做特殊过滤,直接将这类输入合并到了滚动值中,就会出现鼠标仅移动、滚轮未滚动也触发Scroll Rect滚动的现象。
规避方案
- 优先升级Input System版本:该问题在Input System 1.1.0及后续版本已经被官方修复,官方新增了默认的滚动输入死区,同时优化了多设备的输入映射逻辑,适配成本最低。如果你的项目允许升级依赖包,这是最推荐的方案。
- 手动添加死区过滤:如果受项目兼容性限制无法升级Input System版本,可以在读取滚动输入时手动添加阈值判断,仅当滚动值的模长超过设定的合理阈值(通常建议设为0.1~0.2,可根据实际调试调整)时,才判定为有效滚动输入,代码示例如下:
using UnityEngine; using UnityEngine.InputSystem; public class TestScroll : MonoBehaviour { // 滚动死区阈值,可根据实际使用的设备调试调整 public float scrollDeadZoneThreshold = 0.1f; void Update() { Vector2 scrollValue = Mouse.current.scroll.ReadValue(); if (scrollValue.magnitude > scrollDeadZoneThreshold) { // 此处写有效滚动对应的业务逻辑 Debug.Log(scrollValue); } } }
- 全局配置输入死区:打开
Edit > Project Settings > Input System Package设置页,找到Mouse设备对应的Scroll输入项,为其添加Dead Zone处理器并设置合理阈值,该配置全局生效,无需在每个读取滚动输入的脚本中单独加判断。 - 自定义Scroll Rect逻辑:如果仅需要修复Scroll Rect的误触发问题,可以继承Scroll Rect重写
OnScroll方法,在方法中添加死区判断,只有输入的滚动值超过阈值时再调用基类的滚动逻辑即可。
内容的提问来源于stack exchange,提问作者Геннадий Машуков
相关产品推荐
相关产品推荐

