Reputation: 707
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
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
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
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
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