Перемещение объекта

115
17 декабря 2020, 09:50

В Unity есть много способов перемещать объект. В чем различие между этими подходами?

transform.Translate(0, 0, speed * Time.deltaTime); 
GetComponent<Rigidbody2D>().velocity = new Vector2(0, v); 
GetComponent<Rigidbody2D>().AddForce(0, 0);

Правильно ли я понял, что 1 - это линейное перемещение, 2 - перемещение с постоянным ускорением, 3 - перемещение с плавным увеличением скорости и плавной остановкой?

Answer 1

Чтобы лучше ориентироваться в вопросе, посмотрите следующие 2 вопроса:

  1. Правильная реализация передвижения персонажа
  2. Движение с коллизией через Update и FixedUpdate, что такое “телепортация” в контексте физического движка в Unity?

Теперь кратко по вашему вопросу:

  1. Translate() - перемещение персонажа с помощью простого изменения его координаты, точнее сдвига позиции объекта, относительно его текущего положение. Это скорее не линейное перемещение, а "телепортация" объекта, так как объект резко меняет свое положение в пространстве. Это не физический способ перемещения, то есть прибегать к такому методу стоит только тогда, когда вы не используете физику для перемещения объекта, иначе могут случаться проблемы с коллизиями объектов (например несмотря на правильно настроенные Rigidbody и Collider один объект может застрять в другом. Кроме того, использовать такое перемещение стоит только в методе Update(), а не FixedUpdate(). Чем меньшее значение вы передадите в качестве параметра, тем менее "отрывистым" и плавным будет выглядеть ваше перемещение (но по факту, все-равно останется телепортацией)
  2. Rigidbody2D.velocity - мгновенное изменение скорости физического объекта. Стоит применять с осторожностью, так как может приводить к физически нереалистичному поведению. В целом, при использовании физики в Unity скорость объекта будет вычисляться с учетом всех сил, которые действуют на физическое тело и массы физического объекта. По этому, если получится так, что физический движок посчитает за вас скорость объекта по всем силам, которые на него действуют, а затем вы измените ее руками, по средствам изменения Rigidbody2D.velocity - это может выглядеть неправильно. К этому методу стоит прибегать только в исключительных случаях, когда надо резко изменить движение объекта (сами Unity в документации приводят пример с прыжком персонажа). Стоит применять только в FixedUpdate(), и ни в коем случае не в Update(), а также избегать изменения позиции персонажа (transform.Translate() и изменение transform.position)
  3. Rigidbody2D.AddForce() - добавить действие силы к объекту. Как уже писал в предыдущем пункте, физический движок вычисляет скорость и направление движения объекта опираясь на силы, которые действуют на объект, а также его массу. При этом способе "разгон" физического объекта будет более плавным. Если провести аналогию - применение этого способа - как будто вы толкнули физический объект в определенном направлении. Стоит применять только в FixedUpdate(), и ни в коем случае не в Update(), а также избегать изменения позиции персонажа (transform.Translate() и изменение transform.position)
READ ALSO
RSASSA-PSS подпись с хэш функциейSHA256

RSASSA-PSS подпись с хэш функциейSHA256

Пытаюсь реализовать данный алгоритм 2 способами

122
Как отфильтровать List&lt;T&gt;

Как отфильтровать List<T>

Есть checkedlistboxВ нем несколько строк (см

106
Не получается добавить foreign key

Не получается добавить foreign key

Не добавляется foreing keyПроверил столбцы на null,таблицы пустые,типы подходят,длина тоже Уже не знаю что делать,завтра курсовая

143
Отсутствует файл error log

Отсутствует файл error log

На хостинге(cpanel) в диспетчере почему-то отсутствует файл error log, можно как-то настроить его отображение? добавление в начале проблемного скрипта...

117