首页 > 解决方案 > Unity:在 UI Scroll Rect 中添加不同的滚动速度

问题描述

在 Unity 中,我创建了一个 UI 滚动矩形对象。该对象有两个子对象,一个具有不同按钮的按钮处理程序和一个背景。

使用它,按钮和背景都以相同的速度滚动。我希望按钮比背景滚动得更快,从而为滚动创建深度效果。

我在 Objects 或 Scroll Rect 中找不到任何选项。有任何想法吗?

标签: unity3dunity-ui

解决方案


这将需要一点点脚本。我认为最好的方法包括以下步骤:

a) 对于每个按钮,添加一个记住其起始位置的组件。

b)在父级中获取一个滚动矩形实例

c) 使用它来获取 ScrollBar 的实例

d) 滚动条具有 onValueChanged(float) 回调,您可以绑定到,以了解滚动位置何时更改(以避免在更新中进行检查)

e) 每次滚动条移动时(无论用户是使用滚动条还是使用另一种滚动方式,这都会起作用,因为 scrollrect 将移动滚动条,无论如何都会触发事件),你会得到一个回调当前滚动条位置将等于规范化的滚动矩形位置(0.1)

f) 使用该值来偏移您的本地位置(一些值 *parallaxVector2),这应该会给您一个不错的廉价深度效果

这是一个示例实现

public class ScrolleRectDepthButton : MonoBehaviour
{
    RectTransform content; // we'll grab it for size reference
    RectTransform myRect;
    public float parallaxAmount = 0.05f;
    public Vector2 startPosition;
    void Start()
    {
        myRect = GetComponent<RectTransform>();
        startPosition = myRect.anchoredPosition;
        ScrollRect scrollRect = GetComponentInParent<ScrollRect>();
        content = scrollRect.content;
        Scrollbar scrollbar = scrollRect.verticalScrollbar;
        scrollbar.onValueChanged.AddListener(OnScrollbarMoved);
    }
    void OnScrollbarMoved(float f)
    {
        myRect.anchoredPosition = startPosition - (1 - f) * parallaxAmount * content.rect.height * Vector2.up;
    }
}

推荐阅读