1

我正在 Unity 中开发一个 VR 应用程序,我正在努力使用我的 VR 控制器的操纵杆开发流畅的 UI 滚动。到目前为止,我所拥有的看起来像这样......

private void Update() 
{
    float joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y; // this is either 1 for up or -1 for down
    if (joyStickDirection != 0) 
    {
        float multiplier = joyStickDirection * 5f; 
        scrollRect.verticalNormalizedPosition = scrollRect.verticalNormalizedPosition + (multiplier * Time.deltaTime);
    }
}

...这可行,但有两个问题。首先,它根据滚动容器的大小以不同的速度滚动。其次,滚动不是很流畅,因为它显然只是跳过了 0 和 1 之间的不同间隙。

我想我知道出了什么问题,但我没有足够的在 Update() 中工作的经验来找出正确的方法。任何人都可以建议吗?

4

1 回答 1

1

实际上,您不一定要通过ScrollRect组件本身。

我通常会简单地做

public class ScrollExample : MonoBehaviour
{
    public float speed = 5f;

    public Transform ScrollContent;
    
    void Update()
    {
        // this is either 1 for up or -1 for down
        var joyStickDirection = globals.menuInteraction_Scroll.GetAxis(SteamVR_Input_Sources.Any).y; 
        if (joyStickDirection != 0) 
        {
            var multiplier = joyStickDirection * speed; 
            
            // You want to invert the direction since scrolling down actually means
            // moving the content up
            ScrollContent.position -= Vector3.up * multiplier * Time.deltaTime;
        }
    }
}

然后ScrollRect更新并自行处理其余部分。speed无论内容有多大,它都以单位/秒为单位或在屏幕空间覆盖画布中以像素/秒为单位。

通常你会想要调整 ScrollRect 的弹性或者直接将 Movement Type 设置为 Clamped。

于 2021-11-09T11:46:36.503 回答