Как установить предел расстояния прокрутки для прокручиваемого пользовательского интерфейса (Unity)? - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над простым прокручиваемым пользовательским интерфейсом в 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;
    }
}

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Так что вам будет лучше с ScrollRect, так как он уже содержит все необходимые действия для такого рода функции.

MovementType определит, как система реагирует при достижении конца контейнера (из документация):

  • Неограниченно Контент может перемещаться вечно.
  • Elasti c Контенту разрешено временно перемещаться за пределы контейнера, но он упруго оттягивается.
  • закреплено Содержимое не может быть перемещено за пределы контейнера.

Учитывая, что у вас система длинных кнопок, возможно, она должна быть динамической c, поэтому вы должны взглянуть на ContentSizeFitter.

Вы добавляете объект представления прокрутки. По умолчанию это будет включать:

  • Scrollview
  • Viewport
  • Content

Теперь добавьте компонент Text в объект Content, НЕ дочерний текст, компонент к нему. Также добавьте ContentSizeFitter и установите вертикальное соответствие для предпочтительного размера. Это потому, что я буду иметь дело с вертикальным расширением.

Убедитесь, что область просмотра занимает пространство, которое должно служить маской. Для первой практики, поместите объект ScrollView посередине и установите якоря Viewport равными 0,1, чтобы он занимал весь родительский элемент.

Существует множество других возможностей, которые можно сделать, и я бы посоветовал взглянуть на бесплатную версию. Библиотека расширений пользовательского интерфейса Unity , поскольку она имеет некоторые необычные эффекты или бесконечные прокрутки.

0 голосов
  • Неограниченно Контент может двигаться вечно. в основном вы можете потерять контент с помощью большой прокрутки
  • Elasti c Контенту разрешено временно перемещаться за пределы контейнера, но он упруго откатывается назад бесполезно
  • Зажим Содержимое не может быть перемещено за пределы контейнера бесполезно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...