Сделать плавное движение объекта после нажатия на экран(TouchPhase.Began)

143
08 июля 2019, 20:10

Здравствуйте дорогие друзья. Вопрос следующий: Дергается объект сильно при движении. Если убрать if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) из кода то объект движется плавно как надо. Как реализовать движение плавным после касания по экрану?

 public Transform target;
private Vector3 _startPos;
private Vector3 _endPos;
void Start()
{
    _startPos = transform.position;
    _endPos = target.position;
}
void Update()
{
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        transform.position = Vector3.Lerp(_startPos, _endPos, Time.time);
}
Answer 1

Для сглаживания движения между кадрами обычно используют Time.deltaTime - это время, за которое кадр был обработан. Ну и, судя по всему, вы не совсем верно поняли, как работает интерполяция.

Метод Vector3.Lerp возвращает вам позицию от начальной до конечной точки согласно t. Однако, t - должен находиться между 0 и 1, т.е. если вы передаёте Vector3.Lerp(_startPos, _endPos, 0.5f); то получите позицию ровно посередине.

Таким образом t - вам нужно рассчитывать и чаще всего оно является соотношением того времени, которое прошло от начала движения к тому времени, за которое ваш "персонаж" должен пройти путь.

Я бы предложил вам использовать Vector3.MoveTowards. Он принимает от вас две позиции и максимальное смещение, которое вы разрешаете ему сделать. В данном случае вам не придётся рассчитывать время и вы сможете управлять скорость движения персонажа. Например, вот так:

[SerializeField]
float _velocity = 10;
void Update()
{
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        transform.position = Vector3.MoveTowards(transform.position, _endPos, Time.deltaTime * _velocity);
}

В данной реализации ваш персонаж будет двигаться от своего текущего положения в сторону целевой точки, пока он не достигнет этой точки, либо пока вы не уберёте палец от экрана.

Скоростью движения можно управлять изменяя переменную _velocity.

Answer 2

Думаю что проблема в Time.time оно возвращает время от начала кадра. По сути при каждом таче оно будет разным. Думаю стоит копать в эту сторону. Ведь если нету задержки в виде тача то всё идёт нормально. Мне так кажется. Попробуйте указать какое то стабильное время. Типа секунды. Если будет норм то точно проблема со временем. И ещё как вариант что ему просто не хватает времени на действие. Из-за условия. Ведь как только тач перейдет в другую фазу то условие не будет срабатывать

READ ALSO
Добавить параметры в адрес ссылки chilkat

Добавить параметры в адрес ссылки chilkat

Собственно, отправляю пост запрос по ссылке https://mysitecom/login?preferredLanguageCode=EN но ссылка обрезается и получается запрос идет на https://mysite

135
Условие повторяемости цикла

Условие повторяемости цикла

Цикл принимает пользовательский ввод в строку и парсит его, в случае неудачного парсинга или запроса на сервер по ScreenName - возвращает ЭксепшнКакое...

147
Когда AutoResetEvent.WaitOne() без параметров возвращает false?

Когда AutoResetEvent.WaitOne() без параметров возвращает false?

Есть несколько перегрузок AutoResetEventWaitOne() Когда срабатывает сигнал signal

174
C#: Приведение рациональной дроби к строке

C#: Приведение рациональной дроби к строке

Пишу класс для бесконечных чисел с плавающей точкойОднако, конвертация в строку происходит неправильно

140