| Плавное перемещение объекта в точку по нажатию кнопки. | 
|  | 
| 
| 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 с лучшей читаемостью, особенно в примерах
 |  |  |  |  |