如何使ScrollView捕捉到元素

时间:2019-07-25 12:34:19

标签: unity3d

我尝试过设置一个包含三个按钮的ScrollView,并将视图捕捉到最近的按钮,以使屏幕中央始终有一个按钮,而不是介于两者之间。但是这里有问题,因为视图捕捉到前两个按钮之间或完全离开屏幕。在这里:

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;
}

编辑:我在YouTube

上找到了解决方案

0 个答案:

没有答案