Сделать GUI скроллинг в Unity легко. В помощь новичку множество туториалов и официальная справка. Единственным смутным местом может быть скроллинг с затуханием. Как же сделать так, чтобы после того как юзер оторвет палец от экрана, недолгое время постепенно продолжалась прокрутка? И несмотря на то что стандартный GUI уходит в прошлое, есть еще энтузиасты (в основном работающие на Unity версии 3.5), которым данный мануал может быть полезен.
using UnityEngine;
using System.Collections;
public class MyScroll : MonoBehaviour {
// дистанция прокручиваемого окна в X и Y осях
Vector2 _scrollPosition = Vector2.zero;
// переменная для хранения нажатия
Touch _myTouch;
// контент, содержимое окна(которое будет прокручивать)
string _content;
// коэффициент затухания
public float _factorDamping;
// флаг для определения, оторвал ли юзер палец от экрана
bool _flag;
// переменные для определения направления прокрутки (вниз или вверх)
float _firstYPos;
float _secondYPos;
void Start()
{
// заполняю экран 200 строками (чтобы было что крутить)
for (int i = 0; i < 200; i++)
_content += "\n something content something content something content";
}
void OnGUI()
{
// размещаем на экране ScrollView
_scrollPosition = GUI.BeginScrollView(new Rect(0, 0, 480, 725), _scrollPosition, new Rect(0, 0, 480, 1000), GUIStyle.none, GUIStyle.none);
// размещаем строку с контентом
GUI.Label(new Rect(0, 0, 480, 725), _content);
GUI.EndScrollView();
}
void FixedUpdate()
{
// если есть нажатие на экран
if (Input.touchCount > 0)
{
// присваиваем нажатие переменной myTouch
_myTouch = Input.GetTouch(0);
// если юзер двигает пальцем по экрану, или касание только что произошло
if ((_myTouch.phase == TouchPhase.Moved) || (_myTouch.phase == TouchPhase.Began))
{
// ставим флаг
_flag = false;
// присваиваем значение первой переменной для определения направления прокрутки
_firstYPos = _scrollPosition.y;
// собственно, прокрутка умноженная на _factorDamping (чем он больше, тем быстрее скроллинг)
_scrollPosition.y += (_myTouch.deltaPosition.y * _factorDamping);
}
// если юзер оторвал палец от экрана
else if (_myTouch.phase == TouchPhase.Ended)
{
// присваиваем значение второй переменной для определения направления прокрутки
_secondYPos = _scrollPosition.y;
// ставим флаг
_flag = true;
}
}
// если нет нажатия на экран (условие, при котором должен включится дампинг, затухание)
else if (Input.touchCount == 0)
{
// проверка флага (нужно для того, чтобы дампинг не был бесконечным)
if (_flag)
{
// постепенно уменьшаем коэффициент затухания
_factorDamping -= 1 * Time.deltaTime;
// определяем направление скроллинга
if(_firstYPos < _secondYPos)
// прокрутка вверх
_scrollPosition.y += _factorDamping;
else
// прокрутка вниз
_scrollPosition.y -= _factorDamping;
// если вышло время, отведенное под затухание
if (_factorDamping <= 0)
{
// ставим флаг
_flag = false;
// возвращаем коэффициенту затухания его изначальное значение
_factorDamping = 1.5f;
}
}
}
}
}