Страница 1 из 1

Инерция камеры при свайпе

СообщениеДобавлено: 02 дек 2019, 20:15
SteelbeaR
Доброго времени суток, коллеги! :-h

Реализовываю полет камеры над уровнем по свайпу игрока (для обзора локации). Для этого отслеживаю направление движения пальца после нажатия на экран и перемещаю камеру в этом направлении по глобальным координатам. Так же использую ограничение, чтобы камера не выходила за рамки сцены.
Вот такой код у меня получился на C#:

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

public class CamScroller : MonoBehaviour
{
    public float scrollSpeed;
    public float xMin, xMax, zMin, zMax;

    void Update()
    {
        if (Input.touchCount > 0)
            Scroller();
    }

    void Scroller()
    {
        Vector2 delta = Input.GetTouch(0).deltaPosition;

        transform.Translate(-delta.x * Time.deltaTime * scrollSpeed, 0, -delta.y * Time.deltaTime * scrollSpeed, Space.World);
        transform.position = new Vector3(Mathf.Clamp(transform.position.x, xMin, xMax), transform.position.y, Mathf.Clamp(transform.position.z, zMin, zMax));
    }
}
 


Далее я хочу добавить:
1. Инерцию движения камере после того, как игрок отпустит палец (продолжить движение камеры в заданном свайпом направлении с плавным замедлением скорости)
2. "Отпружинивание" камеры немного назад при достижении заданных лимитов (границ локации).

Подскажите, уважаемые форумчане, как это можно реализовать или в каком направлении искать?

P.S. Пробовал использовать Vector3.Lerp в методе "Scroller", но видимых результатов не получил, и (что логично) он прерывается после того, как игрок отрывает палец от экрана.
Экспериментировал с Rigidbody2D, но так же безрезультатно (иначе бы сейчас этой темы здесь не было :)

По поводу "отпружинивания" камеры от границ локации - пробовал реализовать по такой логике:
Если позиция камеры >= заданному лимиту, то переместить камеру на позицию "лимит - отступ"
В результате получил "дрожание" камеры на границах сцены (позиция камеры одновременно пытается переместиться на отступ от лимита и, как только становиться < лимита, снова пытается идти в сторону свайпа каждый кадр)

Re: Инерция камеры при свайпе

СообщениеДобавлено: 02 дек 2019, 21:11
1max1
Не знаю, будет работать или нет, проводил тесты в своей извращенной фантазии))

Синтаксис:
Используется csharp
public class CamScroller : MonoBehaviour
{
    public float scrollSpeed;
    public float camMoveSpeed = 5.0f;
    public float bounceOffset = 7.0f;
    public float xMin, xMax, zMin, zMax;

    Vector3 newPosition = Vector3.zero;

    void Update()
    {
        if (Input.touchCount > 0)
        {
            var touch = Input.GetTouch(0);

            switch (touch.phase)
            {
                case TouchPhase.Began:
                    newPosition = transform.position;
                    break;

                case TouchPhase.Moved:
                    var delta = touch.deltaPosition * scrollSpeed;
                    newPosition.x -= delta.x;
                    newPosition.z -= delta.y;
                    newPosition.x = Mathf.Clamp(newPosition.x, xMin - bounceOffset, xMax + bounceOffset);
                    newPosition.z = Mathf.Clamp(newPosition.z, zMin - bounceOffset, zMax + bounceOffset);
                    break;
            }
        }

        var p = transform.position;

        transform.position = Vector3.Lerp(p, newPosition, camMoveSpeed * Time.deltaTime);

        if (p.x > xMax)
            p.x = xMax - bounceOffset;

        if (p.x < xMin)
            p.x = xMin + bounceOffset;

        if (p.z > zMax)
            p.z = zMax - bounceOffset;

        if (p.z < zMin)
            p.z = zMin + bounceOffset;

        newPosition = p;
    }
}

Re: Инерция камеры при свайпе

СообщениеДобавлено: 02 дек 2019, 21:58
SteelbeaR
1max1 писал(а):Не знаю, будет работать или нет, проводил тесты в своей извращенной фантазии))


Почти работает! :)
По осям Y и X все как надо. А по минусовым их значениям камера ведет себя неадекватно