Unity ScrollView手机滑动手感的问题

一直以来总是感觉Unity做的滚动列表在手机上滑动起来和原生的手感感觉不同,要么感觉不灵敏,要么感觉拖不动。

是否你也有同感?

今天抽时间找下问题,看看有没参数来调整的能好一些。

ScrollView本身有几个参数可以调整,但是都不是那个感觉。

特别是手指快速略过的时候,甚至滚动条可能根本连反应都没有。

感觉他有一个阈值,但是没找到什么参数能来控制,后来找到在EventSystem里有一个DragThreshold,但是设置成1了也没见到作用。

在OnDrag 和 OnEndDrag里加了Log,快速划过后滚动条没动,不是屏幕不灵敏,Log其实已经检测到都有输出了,甚至在OnEndDrag里输出了ScrollView的Velocity竟然都是0 。

所以决定自己给他计算手指松开的速度来解决这个问题。

public class DragScrollViewCheck : EventTriggerListener
{
	ScrollRect scrollViewMy;  //外层的
	float lastTime;
    Vector3 lastPos;
    int lastForward = -1;
    void Start()
    {
        if (scrollView == null)
            FindScrollView();
    }
    void OnEnable()
    {
        if (scrollView == null)
            FindScrollView();
    }
    void FindScrollView()
    {
        scrollViewMy = transform.GetComponentInParent<ScrollRect>();
    }
	public override void OnDrag(UnityEngine.EventSystems.PointerEventData eventData)
    {
       bool changed = false;
        if (eventData.delta.y > 0 && lastForward != 1)
        {
            changed = true;
            lastForward = 1;
            Debug.Log(" 方向变了 > 0");
        }
        else if (eventData.delta.y < 0 && lastForward != 0)
        {
            changed = true;
            lastForward = 0;
            Debug.Log(" 方向变了 < 0");
        }
        if (changed)
        {
            lastTime = Time.time;
            lastPos = eventData.position;
        }
    }
    public override void OnEndDrag(PointerEventData eventData)
    {
    	lastForward = -1;
        float t = Time.time - lastTime;
        Vector2 sub = eventData.position - (Vector2)lastPos;
        
        //加速度和距离公式 s = v0t + 1/2at^2;
        Vector2 vA = (2 * sub) / (t * t);
        //加速度瞬时速度公式 Vt = V0 +at;
        Vector2 vT = vA * t;
        scrollViewMy.velocity = vT;
        //Debug.Log("OnEndDrag:" + scrollViewMy.velocity.ToString("F4") + vT.ToString("F4") + ",t:" + t.ToString("F4"));
        
    }
}

手机调试,反应灵敏多了,还有滑动感,还不错,这就分享上来。

这里建议一定要在手机上测试,因为电脑上和手机上手感是完全不一样的。

经过一段时间测试,发现有时手快速划过然后松开,因为上面的代码加速度是在松开和上一帧的点计算的,可能突然停下来松开速度快过。

可以改成尝试取几次来平均计算可能效果更好。
后面有机会再补充下代码。

### 实现 UnityScrollView 的自动滚动 为了实现在 Unity 中 `ScrollView` 组件的自动滚动效果,可以通过脚本控制 `ScrollRect` 组件的位置属性。下面是一个具体的实现方案: #### 创建并配置 ScrollView 首先,在场景中创建一个 `ScrollView` 并设置好其内部结构以及相关参数[^1]。 ```csharp using UnityEngine; using UnityEngine.UI; public class AutoScrollController : MonoBehaviour { private ScrollRect scrollRect; // 获取 ScrollView 上的 ScrollRect 组件 void Start() { scrollRect = GetComponent<ScrollRect>(); StartCoroutine(AutoScroll()); } IEnumerator AutoScroll() { while (true) { Vector2 currentPosition = scrollRect.verticalNormalizedPosition; // 设置目标位置为顶部或底部取决于当前方向 float targetPositionY = Random.value > 0.5f ? 0 : 1; yield return new WaitForSeconds(Random.Range(3, 7)); // 停留一段时间 while ((targetPositionY == 0 && currentPosition.y > 0) || (targetPositionY == 1 && currentPosition.y < 1)) { currentPosition.y = Mathf.Lerp(currentPosition.y, targetPositionY, Time.deltaTime * 2); scrollRect.verticalNormalizedPosition = currentPosition; yield return null; } } } } ``` 这段代码定义了一个名为 `AutoScrollController` 的类,它通过协程实现了自动滚动的效果。这里使用了 `Mathf.Lerp()` 函数平滑过渡当前位置至新的目标位置,并且每次到达端点后随机等待几秒钟再改变方向继续移动[^4]。 此方法适用于大多数情况下希望模拟自然滚动行为的需求;如果需要更复杂的逻辑,则可以根据具体需求调整上述算法中的细节部分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值