ScrollRect scroll to a gameObject position ?

Hello,

I would like to know how to move my scroll rect vertically to another gameobject. Here is an example :

I have already tried to move it with values but i need to be on the exact position of my gameobject (vertically)

IEnumerator GoTo(float a_destValue)
{
float startValue = myScrollRect.verticalNormalizedPosition;
float percent = 0f;
while (percent <= 1f)
{
myScrollRect.verticalNormalizedPosition = Mathf.Lerp(startValue, a_destValue, Mathf.Clamp01(percent));
percent += Time.deltaTime;
yield;
}
}

Someone have an idea ?
Thank you !

Use CenterOnItem(RectTransform [target](http://unity3d.com/support/documentation/ScriptReference/30_search.html?q=target))to focus your object.

using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(ScrollRect))]
public class ScrollRectEnsureVisible : MonoBehaviour
{
    public RectTransform maskTransform;

    private ScrollRect mScrollRect;
    private RectTransform mScrollTransform;
    private RectTransform mContent;

    public void CenterOnItem(RectTransform target)
    {
        // Item is here
        var itemCenterPositionInScroll = GetWorldPointInWidget(mScrollTransform, GetWidgetWorldPoint(target));
        // But must be here
        var targetPositionInScroll = GetWorldPointInWidget(mScrollTransform, GetWidgetWorldPoint(maskTransform));
        // So it has to move this distance
        var difference = targetPositionInScroll - itemCenterPositionInScroll;
        difference.z = 0f;

        //clear axis data that is not enabled in the scrollrect
        if (!mScrollRect.horizontal)
        {
            difference.x = 0f;
        }
        if (!mScrollRect.vertical)
        {
            difference.y = 0f;
        }

        var normalizedDifference = new Vector2(
            difference.x / (mContent.rect.size.x - mScrollTransform.rect.size.x),
            difference.y / (mContent.rect.size.y - mScrollTransform.rect.size.y));

        var newNormalizedPosition = mScrollRect.normalizedPosition - normalizedDifference;
        if (mScrollRect.movementType != ScrollRect.MovementType.Unrestricted)
        {
            newNormalizedPosition.x = Mathf.Clamp01(newNormalizedPosition.x);
            newNormalizedPosition.y = Mathf.Clamp01(newNormalizedPosition.y);
        }

        mScrollRect.normalizedPosition = newNormalizedPosition;
    }
    private void Awake()
    {
        mScrollRect = GetComponent<ScrollRect>();
        mScrollTransform = mScrollRect.transform as RectTransform;
        mContent = mScrollRect.content;
        Reset();
    }
    private void Reset()
    {
        if (maskTransform == null)
        {
            var mask = GetComponentInChildren<Mask>(true);
            if (mask)
            {
                maskTransform = mask.rectTransform;
            }
            if (maskTransform == null)
            {
                var mask2D = GetComponentInChildren<RectMask2D>(true);
                if (mask2D)
                {
                    maskTransform = mask2D.rectTransform;
                }
            }
        }
    }
    private Vector3 GetWidgetWorldPoint(RectTransform target)
    {
        //pivot position + item size has to be included
        var pivotOffset = new Vector3(
            (0.5f - target.pivot.x) * target.rect.size.x,
            (0.5f - target.pivot.y) * target.rect.size.y,
            0f);
        var localPosition = target.localPosition + pivotOffset;
        return target.parent.TransformPoint(localPosition);
    }
    private Vector3 GetWorldPointInWidget(RectTransform target, Vector3 worldPoint)
    {
        return target.InverseTransformPoint(worldPoint);
    }
}
21 Likes

Thank you jschiek ! :slight_smile:

It doesn’t work when length of content less than length of scrollrect (viewport) itself.

Scrolling to content that fits entirely inside the viewport is ill defined, and you’ll see that e.g. your web browser makes a UX choice totally different than yours. Nonetheless, you can “center” on something by using “slack” child rectangles of height like Mathf.max(2*viewportSize.y - contentSize.y, 0) or Mathf.max(viewportSize.y - contentSize.y, 0).

jschiek thank you :wink:

Thank you jschiek it helped me a lot