我尝试过设置一个包含三个按钮的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
上找到了解决方案