Я работаю над простым прокручиваемым пользовательским интерфейсом в Unity.
- У меня есть холст в сцене, в котором он пуст, как ребенок.
- Пустой является родителем для длинной панели интерфейса с различными кнопками.
Я использую следующий сценарий (назначенный пустому), чтобы сделать его прокручиваемым:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class PageSwiper : MonoBehaviour, IDragHandler, IEndDragHandler
{
private Vector3 scrollableUILocation;
// Start is called before the first frame update
void Start()
{
scrollableUILocation = transform.position;
}
public void OnDrag(PointerEventData data)
{
float difference = data.pressPosition.x - data.position.x;
transform.position = scrollableUILocation - new Vector3(difference, 0, 0);
}
public void OnEndDrag(PointerEventData data)
{
scrollableUILocation = transform.position;
}
}
Проблема в том, что я могу прокручивать панель интерфейса за пределами экрана. Поэтому мне нужно сделать это невозможным или сделать так, чтобы, если я прокручиваю его слишком далеко, он плавно возвращается назад (в конец или в начало панели пользовательского интерфейса, в зависимости от того, что ближе)
Как могу ли я это сделать?
Я пытался реализовать следующее решение, но оно не работает:
Я добавил два пустых объекта слева и справа от панели пользовательского интерфейса. Я попытался заставить свою панель пользовательского интерфейса плавно перемещаться в положение одного из этих пустых объектов на случай, если я подвиню его достаточно близко к ним. Но это не работает.
public void OnEndDrag(PointerEventData data)
{
if (Vector3.Distance(transform.position, StartPoint.transform.position) < 1.0f)
{
StartCoroutine(SmoothMove(transform.position, StartPoint.transform.position, easing));
}
else if (Vector3.Distance(transform.position, EndPoint.transform.position) < 1.0f)
{
StartCoroutine(SmoothMove(transform.position, EndPoint.transform.position, easing));
}
}
IEnumerator SmoothMove(Vector3 startpos, Vector3 endpos, float seconds)
{
float t = 0f;
while (t <= 1.0)
{
t += Time.deltaTime / seconds;
transform.position = Vector3.Lerp(startpos, endpos, Mathf.SmoothStep(0f, 1f, t));
yield return null;
}
}