Scroll Rect 手动滚动脚本 Unity C#

Scroll Rect manual scrolling through script Unity C#

我想为 Unity 制作一个 C# 脚本,当我按下 "UP" 键时滚动视图向上滚动,当我按下 "DOWN" 键时滚动视图向下滚动。

简单使用

ScrollRect.horizontalNormalizedPosition // value range (0 to 1)

ScrollRect.verticalNormalizedPosition // value range (0 to 1)

尝试 lerp 相应地在向上和向下按钮的按钮单击事件处理程序上使用这些值。

或者您可以在 UnityUI-Extentions

查看脚本 HorizontalScrollSnap.csVerticalScrollSnap.cs

你的问题很不完整。对于 2d 还是 3d?你试过什么?

以下是我的做法,其中包含一些您遗漏信息的假设。 在您的相机组件中添加此代码:

void Update() {
    if (Input.GetKeyDown(Input.KeyCode.W) {
        transform.position = new Vector3(transform.position.x, transform.position.y + 2, transform.position.z);
    }
}

这样做是为了访问您附加脚本的对象转换,并在单击 W 时将其位置的 Y 值调整为 +2。

然后您可以添加更多 if 语句并调整键,但核心就在那里。

平滑滚动(使用 lerp)。

[SerializeField]
private ScrollRect _scrollRectComponent;
[SerializeField]
RectTransform _container; 
private IEnumerator LerpToPage(int page)
{
    Vector2 _lerpTo = (Vector2)_scrollRectComponent.transform.InverseTransformPoint(_container.position) - (Vector2)_scrollRectComponent.transform.InverseTransformPoint(target.position);
    bool _lerp = true;
    Canvas.ForceUpdateCanvases();

    while(_lerp)
    {
        float decelerate = Mathf.Min(10f * Time.deltaTime, 1f);
        _container.anchoredPosition = Vector2.Lerp(_scrollRectComponent.transform.InverseTransformPoint(_container.position), _lerpTo, decelerate);
        if (Vector2.SqrMagnitude((Vector2)_scrollRectComponent.transform.InverseTransformPoint(_container.position) - _lerpTo) < 0.25f)
        {
            _container.anchoredPosition = _lerpTo;
            _lerp = false;
        }
        yield return null;
    }
}

其他答案似乎不完整或过于复杂,所以我是这样做的。假设 scroll 是你想要滚动的方向,speed 是一个 属性 控制你在内容 units/sec 中的滚动速度,而 scrollRect 是对ScrollRect 组件:

        if (scroll != 0) {
            float contentHeight = scrollRect.content.sizeDelta.y;
            float contentShift = speed * scroll * Time.deltaTime;
            scrollRect.verticalNormalizedPosition += contentShift / contentHeight;
        }

这应该为任何内容大小移动正确的量,并正确地导致顶部和底部的弹性回弹(如果你的 ScrollRect 是为此配置的)。