Четверг, 25 Апреля 2024, 04:56

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Плавное перемещение объекта в точку по нажатию кнопки. (Лерпы и SmoothDampы)
Плавное перемещение объекта в точку по нажатию кнопки.
SrJeonnyДата: Суббота, 09 Июня 2018, 21:22 | Сообщение # 1
был не раз
Сейчас нет на сайте
Есть камера, есть объект на которую она смотрит и вокруг которого крутится. По нажатию кнопки она должна переместиться на расстояние вправо, !Плавно переместиться!
Проблема в настоящий момент в том, что по GetKeyUp она перемещается на очень маленькие расстояния, при GetKey только зажимая переносится куда надо. Я пробовал делать метод, запускаемый нажатием кнопки, но работает так же, как и в апдейте. Нужно чтобы один раз нажав кнопку камера плавно переместилась в конкретную точку, а не где-то между старой позицией и нужной.
Сейчас шаманю с Vector3.SmoothDamp, лерп тоже ковырял, не вышло.
Кажется мне может помочь transform.Translate, но как-то не понятно ничего. Местные мудрецы, разложите пожалуйста!
drcrackДата: Суббота, 09 Июня 2018, 21:32 | Сообщение # 2
старожил
Сейчас нет на сайте
корутина с Vector3.Lerp/Vector3.MoveTowards/Vector3.SmoothDamp на твой вкус. MoveTowards самый простой:
Код

IEnumerator MoveCamera(Vector3 position, float speed){
  while(Vector3.Distance(Camera.main.transform.position, position) > 0.01f){
    Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, position, Time.deltaTime * speed);
    yield return null;
  }
  Camera.main.transform.position = position;
}


Сообщение отредактировал drcrack - Суббота, 09 Июня 2018, 21:32
SrJeonnyДата: Суббота, 09 Июня 2018, 21:37 | Сообщение # 3
был не раз
Сейчас нет на сайте
Прекрасное решение с корутиной! Немного не понял условие :
Цитата drcrack ()
 while(Vector3.Distance(Camera.main.transform.position, position) > 0.01f)

Ведь можно попроще типо :
while (currentPos != newPos) {
Верно?
(Извращаю ваш вариант потому что запутался)
drcrackДата: Суббота, 09 Июня 2018, 21:43 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата
while (currentPos != newPos) {
Верно?

алгоритм-то верный, но в реальном мире float нельзя сравнивать строгим сравнением из-за их неточности
а поскольку Vector3 состоит из трех float, его тем более нельзя
поэтому так


Сообщение отредактировал drcrack - Суббота, 09 Июня 2018, 21:44
SrJeonnyДата: Суббота, 09 Июня 2018, 21:51 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата drcrack ()
алгоритм-то верный, но в реальном мире float нельзя сравнивать строгим сравнением из-за их неточности
а поскольку Vector3 состоит из трех float, его тем более нельзя
поэтому так

А что с transform.Translate? Он имеет право находится среди сглаживающих магий? Я так понял у него и MoveTowards есть что-то общее в логике работы.
drcrackДата: Суббота, 09 Июня 2018, 22:16 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата
А что с transform.Translate? Он имеет право находится среди сглаживающих магий?

нет, он не имеет к ним отношения, он просто двигает объект без какой-либо магии
Abel399Дата: Суббота, 09 Июня 2018, 22:21 | Сообщение # 7
Surpass your limits. Right now.
Сейчас нет на сайте
Цитата drcrack ()
а поскольку Vector3 состоит из трех float, его тем более нельзя

Зависит от реализации самого вектора. Не помню, что там в Unity, но в адекватных случаях эпсилон уже зашит в операторе сравнения.


Ninja Slayer - 2D Physics Puzzle [cancelled]
drcrackДата: Суббота, 09 Июня 2018, 22:38 | Сообщение # 8
старожил
Сейчас нет на сайте
Цитата
Зависит от реализации самого вектора. Не помню, что там в Unity, но в адекватных случаях эпсилон уже зашит в операторе сравнения.

В Unity не зашит.
Да и я бы не назвал адекватным тот случай когда сравнение вместо точного сравнения реализует какую-то другую логику с блекджеком и эпсилонами


Сообщение отредактировал drcrack - Воскресенье, 10 Июня 2018, 09:01
seamanДата: Суббота, 09 Июня 2018, 23:27 | Сообщение # 9
старожил
Сейчас нет на сайте
В нормальных библиотеках есть и точное сравнение и приблизительное. Как например в Mathf для float
https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html
а вот с векторами в Юнити не так. Там == - это приблизительное равенство и в мануале даже указана точность:
Цитата
Returns true if two vectors are approximately equal.
To allow for floating point inaccuracies, the two vectors are considered equal if the magnitude of their difference is less than 1e-5.

https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html

Однако, если у Вас много сравнений, я бы все же сравнивал не Distance и не magnitude, а sqrMagnitude


Сообщение отредактировал seaman - Суббота, 09 Июня 2018, 23:29
drcrackДата: Воскресенье, 10 Июня 2018, 07:07 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата
Однако, если у Вас много сравнений, я бы все же сравнивал не Distance и не magnitude, а sqrMagnitude

это все-таки актуально если сравнений действительно много и/или целевая платформа не PC
в остальных случаях можно спокойно юзать Distance с лучшей читаемостью, особенно в примерах
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Плавное перемещение объекта в точку по нажатию кнопки. (Лерпы и SmoothDampы)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг