Мучаюсь, никак не могу по человечески реализовать листание(скроллинг) с инерцией.
В проекте есть обычные 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; }
}
}
Сам по себе скроллинг работает неплохо, если не махать пальцем аки крылом. Вся проблема вылазит в момент имитации инерции...
Что нужно:
Возможно кто-то уже сталкивался с подобной задачей и знает в каком направлении копать - буду очень благодарен за подсказки и советы!
Или, может я чего-то не учел в своем скрипте и кто-то укажет(тыкнет носом) мне на мою ошибку - буду только рад.
Большое спасибо за внимание, всем добра!