How to make ScrollView snap to elements

2019-08-31 00:19发布

I tried so set up a ScrollView that contains three buttons, with the view snapping to the nearest button, in a way that there's always one button in the center of the screen and not in-between. But there's something wrong here, as the view snaps to either between the first 2 buttons or leaves the screen entirely. Here it is:

public RectTransform panel; //hold the viewport
public RectTransform center; //empty object to compare the distance for each button relative to the center
public Button[] buttons; // the 3 buttons

public float[] distance; // each buttons' distance to the center
public bool dragging = false; //only want to snap when player is not dragging
public int buttonDistance; //hold the distance between each button
public int minButtonNum; //number of the button that's closest to center

private void Start()
{
    int buttonLength = buttons.Length;
    distance = new float[buttonLength]; //setting the size of distance array to be the same size as buttons array

    //distance between buttons (they're all the same distance so we only check for 2 of them)
    buttonDistance = (int)Mathf.Abs(buttons[0].GetComponent<RectTransform>().anchoredPosition.x - buttons[1].GetComponent<RectTransform>().anchoredPosition.x);
}

private void Update()
{
    for (int i = 0; i < buttons.Length; i++)
    {
        //distance between button and center
        distance[i] = Mathf.Abs(center.transform.position.x - buttons[i].transform.position.x);
    }

    float minDistance = Mathf.Min(distance);

    for (int o = 0; o < buttons.Length; o++)
    {
        if(minDistance == distance[o])
        {
            minButtonNum = o;
        }
    }

    if (!dragging)
    {
        LerpToButton(minButtonNum * -buttonDistance);
    }
}

void LerpToButton(int position)
{
    float newX = Mathf.Lerp(panel.anchoredPosition.x, position, 10f * Time.deltaTime);
    Vector2 newPosition = new Vector2(newX, panel.anchoredPosition.y);

    panel.anchoredPosition = newPosition;
}

public void StartDrag()
{
    dragging = true;
}

public void EndDrag()
{
    dragging = false;
}

EDIT: I found a solution on YouTube

标签: unity3d
0条回答
登录 后发表回答