Unity学习笔记 触摸屏中ScrollView里的Button无法正常或难以响应的解决方法

前言

工作中在负责的项目中,某一天某一个滑动列表(列表里包含按钮)的功能在原本机器上离奇的突然无法正常响应。在电脑编辑器用鼠标操作毫无问题,但是到了4K触摸屏上就有问题了,拖拽的功能可以正常实现,就是拖拽内容里的按钮怎么点都没办法响应,除非是对着这个按钮疯狂点击多次,可能会触发一次。
在经过多方面的问题排查后,只能定位出是ScrollView和Button之间存在冲突
绝望之际,好在看到了这篇UGUI——解决UGUI中ScrollView下嵌套Button时Button难以响应的问题,在这里要非常感谢这篇文章所提供的灵感帮助和解决方案!!

原因

造成这样的情况是EventSystem中的Drag Threshold参数设置较低的原因所造成的。
在这里插入图片描述
这里需要解释一下,Drag Threshold到底是什么东西
在这里插入图片描述
官方的解释是“The soft area for dragging in pixels.” 翻译过来就是:触发拖拽行为所需要的像素点。
也就是说,假如我设置的是10,我的pointer(指针)需要移动超过10个像素点才可以触发拖拽的指令。
Unity底层判定代码如下: (来自PointerInputModule.cs)在这里插入图片描述
并且在拖拽行为发生之前,Unity会取消所有PointerPress的选择和状态,所以一旦触发Drag行为,会立马中断OnPointerDown的事件并且立马触发OnPointerUp,同时eligibleForClick变成false意思就是该行为不是一个click行为。
在这里插入图片描述

那DragThreshold设多少为好又由什么决定呢,这里就要引入屏幕dpi的概念了。
DPI是指每英寸的像素,以鼠标为例子解释的话就是鼠标在桌面上移动1英寸的距离的同时,光标能够在屏幕上移动多少“像素点”。
所以对于不同的DPI来说,鼠标/触摸点移动相同的距离,在DPI较低的屏幕上看到的可能只移动了几个像素点,而在高DPI的屏幕上看到移动了十几个像素点。

结合以上论述内容就能推出为什么在电脑上用鼠标调试正常而在4K触摸屏上变得不正常,因为在电脑上用鼠标点击的过程中鼠标几乎保持不动,像素点的移动不会超出设置的DragThreshold。而在触摸屏上,因为是高dpi的触摸屏,而且加上是手指来点击,精准度和时间肯定比不上鼠标点击,很有可能就是点击的时候移动了几个像素点,移动超出了设置的DragThreshold范围,Unity就会认为这是拖拽行为,按钮点击的响应自然就不会被触发。

解决方法

根据运行机子的DPI来动态改变EventSystem的DragThreshold

public class DragThresholdAdjustment : MonoBehaviour
{
    
    
    [SerializeField] private bool autoAdjust;
    [SerializeField] private float referenceValue = 40.0f;      // 参考值,按需求调整
    private void Awake()
    {
    
    
        if (autoAdjust)
        {
    
    
            int dragThreshold = (int) Mathf.Ceil(UnityEngine.Screen.dpi / referenceValue);
            UnityEngine.EventSystems.EventSystem.current.pixelDragThreshold = dragThreshold;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42358083/article/details/124664787