Движение 2D-объектов
Как вообще двигают объекты в коде Unity? Очень много способов, которые непонятные, просто так нельзя прибавить к координате значения, нужно через какие-то translate , какие-то вектора и т.д. Куча запутанных примеров, вроде должно быть это просто, а на самом деле через кучу строк кода почему-то.
|
Ответ: Движение 2D-объектов
Все зависит от того, что за объект нужно двигать. Если это 2d спрайт или 3d объект, то все просто
PHP код:
PS: с векторной математикой придется подружиться, а если объекты захочется вращать по кратчайшим направлениям, то еще и с кватернионами придется немного познакомиться. Векторная математика сильно упрощает вычисления позиций, покоординатно что-то менять имхо не модно) |
Ответ: Движение 2D-объектов
Цитата:
Есть компонент Transform. За положение у него отвечает свойство position (глобальная позиция) и localPosition (позиция относительно парента). В Блице за это отвечал флаг global у EntityX/Y/Z, а тут просто раздельные. Это и есть те значения, к которым надо прибавлять то, что ты хочешь. Прибавляют не отдельно X Y Z, а вектор (все три вместе), вот и вся разница. Ну например PHP код:
|
Ответ: Движение 2D-объектов
|
Ответ: Движение 2D-объектов
Почитал в "интернетах" , там пишут, что не рекомендуется передвигать игровые объекты присвоением значений "transform.position" , это называется "телепортация" и так делают только новички и так движком не задумано. А правильно нужно передвигать через "transform.Translate" (хотя и это некоторые не рекомендуют) или самое верное - через методы компонента "rigidBody" .
К тому же рекомендуется почему-то использовать FixedUpdate(), хотя не совсем понял чем он отличается от Update(). Я не утверждаю, так как только разбираюсь в этих вопросах и хотелось бы понять правильную реализацию движения, а то их вроде бы много вариантов. |
Ответ: Движение 2D-объектов
Цитата:
Update() - на каждый кадр. Здесь сдвиги и повороты надо умножать на delta time (время с последнего кадра), а в Fixed не надо. (не пользуюсь Unity, могу ошибаться) |
Ответ: Движение 2D-объектов
Ну и зачем тогда использовать Update() и delta time, если есть FixedUpdate() ? Или этот метод позже добавили в какой-то новой версии движка?
|
Ответ: Движение 2D-объектов
Цитата:
Цитата:
Цитата:
Цитата:
Fixed Update может быть полезен при работе с физикой, потому что там обновление происходит в отдельном потоке и с фиксированными интервалами (потому что по многим причинам физика плохо дружит с нефиксированным дельта таймом), а в обычных ситуациях использовать Fixed Update не стоит (если только нет конкретных причин почему это в Update делать нельзя). |
Ответ: Движение 2D-объектов
Искал про движение в Unity, вот ссылка в поисковике:
https://ru.stackoverflow.com/questio...%D0%B6%D 0%B0 Есть другие обсуждения, но пока что на этом остановился, поэтому его привожу. |
Ответ: Движение 2D-объектов
Цитата:
|
Ответ: Движение 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 и корутины и т.д. всегда вызываются в основном потоке. |
Часовой пояс GMT +4, время: 12:47. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot