Ответ: Движение 2D-объектов
Извиняйте что я такой тормоз. Но написать напишу.
Что transform.position/localPosition, что transform.Translate (этим не пользуюсь вообще) изменяют позицию объекта (телепортируют его). Различие в том, что Translate смещает объект на указанное значение, что эквивалентно оператору += при применении совместно с transform.position/localPosition. Есть вероятность, что Translate работает чуть быстрее, т.к. там не надо получать вектор текущей позиции (что по идее делает оператор +=). Стоит об этом заботиться, если с производительностью проблемы и в игре много объектов двигаются, в остальных случаях имхо пофиг.
Что касается RigidBody - если объект физический, то да, двигать надо через свойства компонента RigidBody, а не Transform. И двигать надо в FixedUpdate, т.к. только там физика правильно обрабатывается. При низком FPS применяя силы в Update/LateUpdate можно получить не те результаты, которые предполагаются. И да, если двигаете физические объекты, то есть спец методы у RigidBody: MovePosition и MoveRotation, которые не телепортируют объекты, а двигают/вращают их в течении кадров, в которых физика не обрабатывается (при высоком FPS, об этом ниже). Кстати двигают обычно только кинематические физические объекты (IsKinematic), в остальных случаях к ним прикладывают силы.
На счет отдельного потока не совсем верно, FixedUpdate вызывается столько раз, сколько нужно даже в пределах одного кадра в основном потоке. Если FPS высокий, то FixedUpdate срабатывает не каждый кадр, если низкий (ниже 50 FPS, что установлено в настройках по умолчанию 0,02 секунды), то FixedUpdate может сработать несколько раз за один кадр. В крайних случаях физика может замедляться, т.к. в настройках по умолчанию задано 0,333 секунды - максимальное время на обработку физики за раз. Сама физика считается в отдельных потоках да, но FixedUpdate и Update и LateUpdate и корутины и т.д. всегда вызываются в основном потоке.
|