Иннерционная прокрутка (скроллинг) высокого объекта

Программирование на Юнити.

Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение sergelee 10 янв 2017, 13:28

Всем привет!

Мучаюсь, никак не могу по человечески реализовать листание(скроллинг) с инерцией.

В проекте есть обычные canvas списки с шикарным скроллингом, со встроенными функциями все работает на ура.
Проблема собственно в чем:

Есть довольно высокий спрайт с текстом и есть камера которая видит данный спрайт. Я написал небольшой(довольно корявый) скрипт, с помощью которого двигаю камеру вдоль спрайта.

Синтаксис:
Используется csharp

// i
private float mouseSensitivity = 7.0f;
private float mouseInertiaVel;
private float mouseInertiaCorrection;
private float mouseInertia;
private Vector3 mousePosNow;
private Vector3 lastPosition;
public static int limitDown;
public float cofCorrect = 55;
private float pageLimmit;
private bool correctTT = false;
private bool correctTD = false;

// update

if (Input.GetMouseButtonDown(0))
{
   lastPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
   mousePosNow = Camera.main.ScreenToWorldPoint(Input.mousePosition);
   mouseInertiaCorrection = 0;
}

if (Input.GetMouseButton(0) && gameObject.transform.position.y < 10 && gameObject.transform.position.y > -pageLimmit - 10)
{
   Vector3 delta = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastPosition;
   transform.Translate(0, -delta.y * mouseSensitivity, 0);
   lastPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
   mouseInertiaCorrection += 30.0f * Time.deltaTime;
}

if(Input.GetMouseButtonUp(0))
{
   if (mouseInertiaCorrection < 10) { mouseInertiaVel = (lastPosition.y - mousePosNow.y) / mouseInertiaCorrection; }
   if (gameObject.transform.position.y > 0) { correctTT = true; }
   if (gameObject.transform.position.y < -pageLimmit) { correctTD = true; }
}

if (!Input.GetMouseButton(0))
{
   if (mouseInertiaVel > 0) { mouseInertiaVel -= 1.0f * Time.deltaTime; if (mouseInertiaVel > 0 && mouseInertiaVel < 0.1f) { mouseInertiaVel = 0; } }
   if (mouseInertiaVel < 0) { mouseInertiaVel += 1.0f * Time.deltaTime; if (mouseInertiaVel < 0 && mouseInertiaVel > -0.1f) { mouseInertiaVel = 0; } }
   if (!float.IsNaN(-mouseInertiaVel)) { transform.Translate(0, -mouseInertiaVel, 0); }

   // limmits
   if (ost.scrollLimited > 1)
   { pageLimmit = ost.scrollLimited - cofCorrect; adsStartPos = ost.scrollLimited - 77;}

   if (correctTT)
   {
   float goToTop = (gameObject.transform.position.y * 7.0f) * Time.deltaTime;
   if (gameObject.transform.position.y > 0) { transform.Translate(0, -goToTop, 0); }
   if (gameObject.transform.position.y <= 0) { correctTT = false; }
   }

   if (correctTD)
   {
   float goToTop = (gameObject.transform.position.y / 10.0f) * Time.deltaTime;
   if (gameObject.transform.position.y < -pageLimmit) { transform.Translate(0, -goToTop, 0); }
   if (gameObject.transform.position.y >= pageLimmit) { correctTT = false; }
   }
}

 


Сам по себе скроллинг работает неплохо, если не махать пальцем аки крылом. Вся проблема вылазит в момент имитации инерции...

Что нужно: [curved_hands]

Возможно кто-то уже сталкивался с подобной задачей и знает в каком направлении копать - буду очень благодарен за подсказки и советы!
Или, может я чего-то не учел в своем скрипте и кто-то укажет(тыкнет носом) мне на мою ошибку - буду только рад.

Большое спасибо за внимание, всем добра!
учусь... всегда учусь...
Аватара пользователя
sergelee
UNец
 
Сообщения: 41
Зарегистрирован: 18 авг 2013, 09:44
Откуда: Украина, Харьков
  • Сайт

Re: Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение Cr0c 10 янв 2017, 15:20

Тут надо только дельту тача/мыши и обрабатывать её.
Синтаксис:
Используется csharp
[Header("Чувствительность движения")]
public float sens = 1f;
private float delta;
[Header("Замедление")]
public float slowFactor = 0.7f;
void Update()
{
 if (Input.touchCount>0)
 { delta = Input.touches[0].deltaPosition.y; }
}
 transform.Translate(0f, delta * sens, 0f);
 delta = delta * slowFactor;
}
 

Только ограничения там свои добавьте до или после транслейта.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение greatPretender 10 янв 2017, 18:58

навесьте rigidbody и включайте/выключайте его при Input.Mouse
rb - риджидбади.
dir - Vector3
в инспекторе в риджидбади : масса=0,01, drag=3
rb.AddForce (dir, ForceMode.Force);
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение sergelee 10 янв 2017, 19:48

greatPretender писал(а):навесьте rigidbody и включайте/выключайте его при Input.Mouse
rb - риджидбади.
dir - Vector3
в инспекторе в риджидбади : масса=0,01, drag=3
rb.AddForce (dir, ForceMode.Force);


Я вроде пробовал данный метод. Минус данного способа в том, что если пролистать и не отпустить палец, то объект продолжает движение и набирает скорость пока не отпустить палец. Еще одним минусом является само rigidbody... в плане оптимизации не очень классно, хотя, может я и ошибаюсь...
учусь... всегда учусь...
Аватара пользователя
sergelee
UNец
 
Сообщения: 41
Зарегистрирован: 18 авг 2013, 09:44
Откуда: Украина, Харьков
  • Сайт

Re: Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение greatPretender 11 янв 2017, 07:27

Ммм. возможно, не знаю. Я использую для перемещения камеры по локации, удобно) Пока оптим-ция не страдает.
greatPretender
Старожил
 
Сообщения: 526
Зарегистрирован: 23 сен 2015, 07:51

Re: Иннерционная прокрутка (скроллинг) высокого объекта

Сообщение sergelee 11 янв 2017, 09:33

greatPretender писал(а):Ммм. возможно, не знаю. Я использую для перемещения камеры по локации, удобно) Пока оптим-ция не страдает.


Да, для локаций самое то, очень удобно :) в плане оптимизации, я скорей всего ошибаюсь... просто стереотипы остались негативные. Спасибо!
учусь... всегда учусь...
Аватара пользователя
sergelee
UNец
 
Сообщения: 41
Зарегистрирован: 18 авг 2013, 09:44
Откуда: Украина, Харьков
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7