MBS
MBS

Reputation: 707

Scroll Rect manual scrolling through script Unity C#

I want to make a C# script for Unity to make the scroll view scroll up when I press "UP" key and scroll down when I press "DOWN" key.

Upvotes: 3

Views: 28263

Answers (4)

Umair M
Umair M

Reputation: 10720

Simply use

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

or

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

try to lerp these values accordingly on button click event handlers for up and down buttons.

Or you can have a look at scripts HorizontalScrollSnap.cs and VerticalScrollSnap.cs at UnityUI-Extentions

Upvotes: 19

Joe Strout
Joe Strout

Reputation: 2741

The other answers seemed incomplete or overly complex, so here's how I did it. Assuming scroll is the direction you want to scroll, speed is a property that controls your scroll speed in content units/sec, and scrollRect is a reference to the ScrollRect component:

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

This should shift the right amount for any content size, and correctly causes the elastic rebound at the top and bottom (if your ScrollRect is configured for that).

Upvotes: 5

Soorya
Soorya

Reputation: 701

For a smooth scroll (using 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;
    }
}

Upvotes: 0

Fredrik
Fredrik

Reputation: 5108

Your question is very incomplete. For 2d or 3d? What have you tried?

Heres how id do it, with some assumptions where you left information out. Add this code in your Camera component:

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

What this does is to access the objects tranform you attach the script to and adjust the Y-value of its position with +2 if you click W.

You can then just add more if-statements and adjust the keys, but the core is there.

Upvotes: -2

Related Questions